目录
1、字符串定义
2、获取子串
3、拼接字符串
4、不可变字符串
5、判断字符串相等
6、空串与null串
7、代码点与代码单元
8、构建字符串
9、字符串API
1、字符串定义
从概念上来讲,Java字符串就是Unicode字符序列。Java没有内置的字符串类型,而是在标准就Java类库中提供了一个预定义类,很自然地叫做String。每个用双引号括起来的字符串都是String类的一个实例:
String a = ""; //an empty string
String greet = "Hello";
2、获取子串
String类的substring方法可以从一个较大的字符串中提取出一个子串。如:
String greet = "Hello";
String s = greet.substring(0, 3);
创建了一个由字符“Hel”组成的字符串s。
3、拼接字符串
与绝大数语言一样,Java允许使用+号连接两个字符串。
String expletive = "Expletive";
String PG13 = "deleted";
String message = expletive + PG13;
上述代码将“Expletivedeleted”赋给变量message。
当将一个字符串预一个非字符串的值进行拼接时,后者被转换成字符串,如:
int age = 13;
String rating = "PG" + age;
rating设置为“PG13”;
4、不可变字符串
String类没有提供用于修改字符串的方法。如果想要修改greet的值为“Help!”,解决方法有二:
其一,提取“Hel”再拼接“p!”,代码如下:
greet = greet.substring(0, 3) + "p!";
其二,创建一个新字符串“Help!”,再让greet去引用“Help!”,代码如下:
greet = "Hellp!";
从中我们可以发现,我们不能直接的修改字符串的内容,而是去创建并引用了一个新的字符串(不被引用的字符串Java会自动回收,不用担心内存遗漏的问题),这正是Java字符串的“不可变字符串”的特点:编译器可以让字符串共享。
注:C语言中字符串是字符型数组,即char greet[] = "Hello"; Java的字符串更像C语言中的char*指针即char* greet = "Hello"; C++中字符串的机制和Java差不多,但是C++中字符串是可以修改的,也就是说可以修改字符串中的单个字符,Java字符串不可修改。
5、判断字符串相等
可以使用equals方法判断两个字符串是否相等。对于表达式:s.equals(t); 如果字符串s与字符串t相等,则返回true,否则返回false,注意,s和t可以是字符串变量,也可以是字符串常量,如:
"Hello".equals(greet);
如果像判断两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法:
"Hello".equalsIgnoreCase("hello");
注意,一定不能使用==运算符来判断两个字符串是否相等!这个运算符只能判断两个字符串是否放置在同一个位置上,示例代码如下:
String greet = "Hello"; //initialize greet to a string
if(greet == "Hello")...
//probably true
if(greet.substring(0, 3) == "Hel")...
//probably false
也就是说,如果虚拟机始终将相同的字符串共享,就可以使用==运算符判断字符串是否相等。但实际上只有字符串常量是共享的,而+或substring等操作产生的结果并不是共享的,因此,千万不要使用==运算符来判断字符串是否相等。
6、空串与null串
空串""是长度为0的字符串,它是一个Java对象,有自己的串长度(0)和串内容(空),检查字符串是否为空:
if(str.length() == 0) 或 if(str.equals(""))
null串,指目前没有任何对象与该变量关联,检查字符串是否为null:
if(str == null)
检查一个字符串既不是null也不为空串:
if(str != null && str.length() != 0)
7、代码点与代码单元
Java字符串由char序列组成。cahr数据类型是一个采用UTF-16编码表示Unicode代码点的代码单元,大多数常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。
length方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量,如:
String greet = "Hello";
int n = greet.length(); // is 5
要想得到实际的长度,即代码点数量,可以调用:
int cpCount = greet.codePointCount(0, greet.length());
charAt(n)方法可以返回字符串第n个位置的代码单元,如:
char first = greet.charAt(0); // 'H'
char last = greet.charAt(4); // 'o'
想要得到第i个代码点,可以调用:
int index = greet.offsetByCodePoints(0, i);
int cp = greet.codePointAt(index);
如果想要遍历一个字符串,并且依次查看每一个代码点,可以使用下列语句:
int cp = sentence.codePointAt(i);
if(Character.isSupplementaryCodePoint(cp)) i += 2;
else i++;
8、构建字符串
有些时候,需要由较短的字符串构建字符串,每次连接字符串的话,都会创建一个新的String对象,既耗时又浪费空间,使用StringBuilder类就可以避免这个问题的发生:
StringBuilder builder = new StringBuilder();
builder.append(ch); //appends a single character
builder.append(str); // appends a string
String completedString = builder.toString();
9、字符串API
下面是Java中String类(java.lang.string 1.0)的一些常用方法:
char chaAt(int index):返回给定位置的代码单元。
int codePointAt(int index):返回给定位置开始或结束的代码点。
int offsetByCodePoints(int startIndex, int cpCount):返回从startIndex代码点开始,位移cpCount后的代码点索引。
int compareTo(String other):按照字典顺序,如果字符串位于other之前,返回一个负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0。
boolean endsWith(String suffix):如果字符串以suffix结尾,返回true。
boolean equals(Object other):如果字符串与other相等,返回true。
boolean equalsIgnoreCase(String other):如果字符串与other相等(忽略大小写),返回true。
int indexOf(String str)
int indexOf(String str, int fromIndex)
int indexOf(int cp)
int indexOf(int cp, int fromIndex):返回与字符串str或代码点cp匹配的第一个子串的开始位置,这个位置从索引0或fromIndex开始计算。
int lastIndexOf(String str)
int lastIndexOf(String str, int fromIndex)
int lastIndex(int cp)
int lastIndex(int cp, int fromIndex):返回与字符串str或代码点cp匹配的最后一个子串的开始位置,这个位置从原始串尾端或fromIndex开始计算。
int length():返回字符串的长度。
int codePointCount(int startIndex, int endIndex):返回startIndex和endIndex-1之间的代码点数量,没有配成对的代用字符将计入代码点。
String replace(CharSequence oldString, CharSequence newString):返回一个新字符串,这个字符串用newString代替原始字符中所有的oldString,可以用String或StringBuilder对象作为CharSequence参数。
boolean startWith(String prefix):如果字符串以prefix字符串开始,返回true。
String substring(int beginIndex)
String sustring(int beginIndex, int endIndex):返回一个新字符串,这个字符串包含原始字符串中从beginIndex到串尾或endIndex-1的所有代码单元。
String toLowerCase():返回一个新字符串,这个字符串将原始字符串中的所有大写字母改成了小写字母。
String toUpperCase():返回一个新字符串,这个字符串将原始字符串中的所有小写字母改成了大写字母。
Sring trim():返回一个新字符串,这个字符串删除了原始字符串头部和尾部的空格。
下面是StringBuilder类(java.lang.StringBuilder 5.0)中的一些重要方法:
StringBuilder():构造一个空的字符串构建器。
int length():返回构建器或缓冲器中的代码单元数量。
StringBuilder append(String str):追加一个字符串并返回this。
StringBuilder append(char c):追加一个代码单元并返回一个this。
StringBuilder appendCodePoint(int cp):追加一个代码点,并将其转换为一个或两个代码单元并返回this。
void setCharAt(int i, char c):将第i个代码单元设置为c。
StringBuilder insert(int offset, String str):在offset位置插入一个字符串并返回this。
StringBuilder insert(int offset, char c):在offset位置插入一个代码单元并返回this。
StringBuilder delete(int startIndex, int endIndex):删除偏移量从startIndex到endIndex-1的代码单元并返回this。
String toString():返回一个与构建器或缓冲器内容相同的字符串。