public class A{
public static void main(String[] args){
String s="czf";
s+="czf825";
}
}看看字节码是怎么处理的,不变不是本身不变,而是内部状态不可变,
看下面理解一下java处理String的效率。
简单的字符串相加要生成中间的代码,还是用StringBuffer实现的。
所以StringBuffer实现字符串相连受推荐。Compiled from "A.java"
public class A extends java.lang.Object{
public A();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   returnpublic static void main(java.lang.String[]);
  Code:
   0:   ldc     #2; //String czf
   2:   astore_1
   3:   new     #3; //class StringBuffer
   6:   dup
   7:   invokespecial   #4; //Method java/lang/StringBuffer."<init>":()V
   10:  aload_1
   11:  invokevirtual   #5; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
   14:  ldc     #6; //String czf825
   16:  invokevirtual   #5; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
   19:  invokevirtual   #7; //Method java/lang/StringBuffer.toString:()Ljava/lang/String;
   22:  astore_1
   23:  return}

解决方案 »

  1.   

    这不是改变了“czf”这个String对象的值
    只是改变了s这个变量引用的对象而已
      

  2.   

    practal java里面第一章写得好,推荐看看~~~~`
      

  3.   


    String s="czf";
    s="czf825";
    其实你这样时,s又重新创建了一个,已经不是原来那个s了。
      

  4.   

    String赋值又要重新在堆里实例一个对象,分配内存,然后让s指向那个新的引用
    付出的代价就高了。
      

  5.   

    to kypfos(就当我没上过大学) :
    请问您在前面提供的那段代码是反编译代码吗?用什么工具?
      

  6.   

    一句话解决问题,s相当与c/c++中的指针.
      

  7.   

    s内存储的是"czf825"的首地址,所以可以改变
      

  8.   

    thinking in java 3rd ed. v4.0 appendix A对此有详细阐述
      

  9.   

    String类是不可改变的
    它是一种对象,而非数据类型,在生成之后就不可改变了,它可以使用像基本数据类型一样的定义方式,再定义一个字符串对象时,如果是重复定义,则虚拟机不会再生成新的对象,如果没有,则生成新的字符串!,当然楼主的那个S所指的对象已经改变了