从概念上讲,Java字符串就是Unicode字符序列。例如,串“Java\u2122”由五个Unicode字符J、a、v、a和TM组成。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类String。每个用双引号括起来的字符都是String类的一个实例:
String e=""; //an empty string
String greeting="Hello";
Java字符串有char值序列组成。char数据类型是一个采用UTF-16编码表示的Unicode代码点的代码单元。大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。
length方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量。例如:
String greeting="Hello";
int n=greeting.length(); //is 5.
要想得到实际的长度,即代码点数量,可以调用:
int cpCount=greeting.codePointCount(0,greeting.length());
调用s.charAt(n)将返回位置n的代码单元,n介于0-s.length()-1之间。例如:
char first = greeting.charAt(0); //first is ‘H’
要想得到第i个代码点,应该使用下列语句
int index=greeting.offsetByCodePoints(0,i);
int cp=greeting.codePointAt(index);
String类的substring方法可以从一个较大的字符串提取出一个子串。例如:
String greeting="Hello";
String s=greeting.substring(0,3);
创建了一个由字符“Hel”组成的字符串。
substring的第二个参数是不希望复制的第一个代码单元。这里复制的代码单元位置为0、1、2。在substring中的计数是从0-3。
String类没有提供用于修改现存字符串的方法如果希望将greeting的内容改为“Help!”,不能直接地将greeting的最后两个位置的字符修改为‘p’和‘!’。在Java中实现这项操作相当容易,首先提取需要的子串,然后在拼接上需要替换的字符串。
greeting=greeting.substring(0,3) + "p!";
由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,字符串“Hello”永远包含H、e、l、l和o的代码单元序列,而不能修改其中的任何一个字符。当然,可以修改字符串变量greeting的内容,让它引用一个不同的字符串,如同可以将一个存放3的数值变量改成存放4一样。
不可变字符串有一个优点:编译器可以将字符串共享。
Java语言允许使用+号拼接两个字符串。
String expletive="Expletive";
String PG13="deleted";
String message=expletive+PG13;
上面的代码将“Expletivedeleted”赋给变量message。
当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串。例如:
int age=13;
String rating="PG"+age; //get "PG13"
可以使用equals方法检测两个字符串是否相等。如果字符串s与字符串t相等,则表达式s.equals(t)返回true;否则,返回false。需要注意,s与t可以是字符串变量,也可是字符串常量。例如,表达式
"Hello".equals(greeting)
是合法的。
要想检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。
永远不要使用==运算符检测两个字符串是否相等!!!