Java String类
Java的类库中有一个很特殊的类,就是String。我认为它主要特殊在两点。
第一点,它重载了“+”和“+=”操作符。Java不允许程序员重载任何操作符。Java对String的这种设计初衷,是为了程序员能够更方便的使用String这个类,但是却带来了意想不到的结果:重载带来了内存开销。《Java编程思想》书中第十三章也表达了这个意思。
Java重载的实际实现方式,借助了StringBuilder这个类,使用“+”或“+=”时,编译器自动生成了一个StringBuffer实例,依次append字符串,最后用toString方法返回结果。例如
String a = "first";
String b = "second";
String c = a + b;
第三句在实际执行时,等价于:
StringBuilder builder = new StringBuilder();
builder.append(a);
builder.append(b);
String c = builder.toString();
如果StringBuilder对象只有一个,是没有实际增加内存开销的。但我们常常会在一个循环中使用”+“或”+=“对String进行拼接,每次进入循环体,就会生成一个StringBuilder对象,无疑是增大了开销。这时推荐使用StringBuilder来执行字符串的拼接业务。
Java中还有一个类StringBuffer,它的也能处理String的拼接操作。这二者方法几乎一致,区别在于,StringBuffer是线程安全的,而StringBuilder不是。因此,前者更耗资源一些。
?
String的第二个特殊点在于,它是一个常量类。每一个构造的String对象,都是作为常量存储在内存中。引用可以指向别的位置,但对象本身没有被改变,对象本身一直作为常量存在,直到被销毁。
还拿上边的三句来说明
String a = "first";
实际上是先为"first"这个常量开辟一块空间,然后声明实例化String的对象a。实例化a的过程是,JVM先扫描是否存在"first"这个String常量,如果有,将a指向它。此时"first" == a 值为true。如果我们定义
String a1 = "first";
那么 a1 == a也是为true的。对a或a1的任何操作所带来的字符串的改变都将产生新的String对象,并将a或a1重新指向这个新生成的对象。比如
a += "A";
此时,执行的步骤是:
1、生成”A"String对象;
2、拼接"first"和"A",步骤见上;
3、返回的"firstA"称为新的String对象,将a指向"firstA"。这时 a != a1。
关于这一段的理解,可以对比:
Integer i = new Integer(2);
Integer j = new Integer(2);
System.err.println(i == 2);//true
System.err.println(j == 2);//true
System.err.println(j == i);//false
别只给个手势啊,具体错在哪儿? 3 楼 virtual_function 2012-01-17 1楼是不是SJB啊 乱给手势也不给个理由 呵呵