对于
String str = "hello world";
相当于str是一个常量,
当对str进行操作的时候,比如
str += "test";
它不是简单的在"hello world"后面加上"test",
而是在内存中重新开一个空间,先拷贝"hello world"再接着拷贝"test"组成新的
字符串"hello worldtest",并把这个字符串的引用重新赋值给str,
也就是说,对于一个String对象引用,你最好就只是取用它,
一旦你对它进行任何操作都将导致引用本身改变,而且还有很高的代价。
再看下面代码:建议自己跑下,
String test1 = "test";
String test2 = "test";

System.out.println(test1.equals(test2));
System.out.println(test1==test2);

String test3 = new String("test");
System.out.println(test1.equals(test3));
System.out.println(test1==test3);它的输出是:
true
true
true
false很显然,虽然test1和test2是分别赋值的,但是都是赋值"test",
以:"",表示的字符串在内存中会是唯一的,所以test1和test2不但使用equals比较是相等的使用==比较引用也是相等的。
而对于test3我使用了new String,这样会使分配一块新的内存并把"test"拷贝一份存入,
这样test3的引用指向的是新地址,而不是test1和test2所指向的地址,所以使用equals虽然相等,但是使用==比较引用就会返回false,
所以,对于STRING对象,你应该把它看成常量(当然,它的引用可以被重新赋值,这和FINAL定义的常量有本质区别),
如果你把"hello world"这个东西直接就看成是一个引用,也许就好理解些,显然这个引用不可能被你改变。
因此对于STRING的修改操作,应该尽量避免,频繁的操作应该使用StringBuffer
并在完成操作以后再根据需要转换成STRING对象使用。更具体的可以看下THINK IN JAVA关于String的详细说明。

解决方案 »

  1.   

    同意楼上的,THINKING IN JAVA里面有很详细说明,我也是看了那个才知道的
      

  2.   

    看了书上一般都介绍尽量使用StringBuffer,这次才明白真谛。
      

  3.   

    就是说你够建了一个String对象后,这个对象就不会变--你企图改变它时得到是一个新的String对象而原先的String对象还在而且没有变化。
      

  4.   

    也就是说你最好不要改变reference!
      

  5.   

    我经常用 str += "xxx",来加长字符串,按"山不在高"的意思,也很不妥?