从概念上讲,Java字符串就是Unicode字符序列。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,很自然地叫做String。每个用双引号括起来的字符串都是String类的一个实例。
不可变字符串
String类没有提供修改字符串中某个字符的方法。由于不能修改Java字符串中的单个字符,所以在Java文档中将String类对象称为是不可变的(immutable)。不可变字符串有一个优点:编译器可以让字符串共享 。可以想象将各种字符串存放在公共的存储池中。字符串变量指向存储池中相应的位置。如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。
总而言之,Java的设计者认为共享带来的高效率远远胜过于提取子串、拼接字符串所带来的低效率。可以看看你自己的程序,我们发现:大多数情况下都不会修改字符串,而只是需要对字符串进行比较。
检测字符串是否相等
可以使用equals方法检测两个字符串是否相等。
s.equals(t)
s与t可以是字符串变量,也可以是字符串字面量。
一定不要使用==运算符检测两个字符串是否相等。这个运算符只能够确定两个字符串是否存放在同一个位置上。当然,如果字符串在同一个位置上,它们必然相等。但是,完全有可能将内容相同的多个字符串副本放置在不同的位置上。
如果虚拟机始终将相同的字符串共享,就可以使用==运算符检测是否相等。但实际上只有字符串字面量是共享的,而+或substring等操作得到的字符串并不共享。
public class test {
public static void main(String[] args) {
String a = "12";
String b = "123";
System.out.println((a+"3")==b);
System.out.println(b.equals(a+"3"));
}
}
输出:
false
true
空串与null串
空串""是长度为零的字符串。可以调用以下代码检查一个字符串是否为空:
if (str.length() == 0)
或
if (str.equals(""))
空串是一个Java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存放一个特殊的值,名为null,表示目前没有任何对象与该变量关联。要检查一个字符串是否为null,要使用以下条件:
if (str == null)
构建字符串
有些时候,需要由较短的字符串构建字符串,例如,按键或来自文件中的单词。如果采用字符串拼接的方式来达到这个目的,效率会比较低。每次拼接字符串时,都会构建一个新的String对象,既耗时,又浪费空间。使用StringBuilder类就可以避免这个问题。
StringBuilder builder = new StringBuilder();
builder.append(str);
builder.append(ch);
String completedString = builder.toString();
StringBuilder类在Java 5中引入。这个类的前身是StringBuffer,它的效率稍有些低,但允许采用多线程的方式添加或删除字符。如果所有字符串编辑操作都在单个线程上执行(通常都是这样),则应该使用StringBuilder。这两个类的API是一样的。