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}
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}
只是改变了s这个变量引用的对象而已
String s="czf";
s="czf825";
其实你这样时,s又重新创建了一个,已经不是原来那个s了。
付出的代价就高了。
请问您在前面提供的那段代码是反编译代码吗?用什么工具?
它是一种对象,而非数据类型,在生成之后就不可改变了,它可以使用像基本数据类型一样的定义方式,再定义一个字符串对象时,如果是重复定义,则虚拟机不会再生成新的对象,如果没有,则生成新的字符串!,当然楼主的那个S所指的对象已经改变了