我在一本书上看到这样一句话:
"String类是用来表示字符串常量的,用它创建的每个对象都是字符串常量,一经建立便不能修改."
但是我写了一个程序,确可以再为String常量赋新的值,为什么?它既然是常量为什么还可以为它赋新的值.
程序如下:
public class StringClass {
public static void main(String[] args) {
String a=new String("你好!");
System.out.println(a);
a="lipengxing";
System.out.println(a);
a=new String("小心");
System.out.println(a);
}
}

解决方案 »

  1.   

    String用来表示字符串常量,StringBuffer用来处理字符串变量。
    而楼主说的重新赋值实际上创建了一个新的String对象
      

  2.   

    其时不是说字符串变量不能改
    是字符串不能改
    如你的"你好","小心","lipengxing"它们是不能改的
    当你把a赋给另外的字符串,其时是让a指向另外的内存区
      

  3.   

    阎宏的java模式
    中的享元模式有详细的阐述
      

  4.   

    donggua12345678()  正解当你改变内容的时候,实际上新创建了一个String 的对象,所以经常要改变的 字符串 最好使用
    StringBuffer
      

  5.   

    楼主把字符串和指向字符串的变量弄混了。
    字符串变量可以指向一个字符串,也可以改变为指向另一个字符串,这就是变量本身的变化,而字符串本身不可以修改,当一个字符串变量从指向一个字符串改为指向另一个时候,原来的字符串变成内存垃圾被回收。在StringBuffer中,指向的字符串本身也是可以修改的。
      

  6.   

    上面所谓的赋值,实际是上是重新创建了一个String类的对象,并且将str指向了这个新的对象。
    如果我们编写下面的代码:
    String ball = "Hello";
    ball = ball + "there.";
    ball = ball + "How are you ?";
    这个例子反复产生了新的String对象,这也就意味着,字符数组必须反复的复制,这可能会对系统的性能产生负面的影响,
    更好的选择则是使用StringBuffer对象和append()方法,然后利用String类的toString()方法得到一个String对象。