class A {
public static void intReplace(int x) {
x = x + 5;
} public static void stringReplace(String text) {
text = text.replace('j', 'l');
} public static void bufferReplace(StringBuffer text) {
text = text.append("c");
} public static void main(String args[]) {
int i=0;
String textString = new String("java");
StringBuffer textBuffer = new StringBuffer("java");
stringReplace(textString);
bufferReplace(textBuffer);
intReplace(i);
System.out.println(textString);
System.out.println(textBuffer);
System.out.println(i);
}
}
为什么只有StringBuffer的值才会变!
public static void intReplace(int x) {
x = x + 5;
} public static void stringReplace(String text) {
text = text.replace('j', 'l');
} public static void bufferReplace(StringBuffer text) {
text = text.append("c");
} public static void main(String args[]) {
int i=0;
String textString = new String("java");
StringBuffer textBuffer = new StringBuffer("java");
stringReplace(textString);
bufferReplace(textBuffer);
intReplace(i);
System.out.println(textString);
System.out.println(textBuffer);
System.out.println(i);
}
}
为什么只有StringBuffer的值才会变!
String是不变类
String str2=new String("1");这时候str1和str2的reference都是一致的,都是指向内存中的同一字符串常量。String str1=new String("1");
String str2=new String("2");
这时候str1和str2的reference都是不一致的。这些常量在编译的时候就已经确定了。StringBuffer则是自己在维护一个字符串,所以可以进行修改。
public static void intReplace(int x) {
x = x + 5;
} public static String stringReplace(String text) {
return text.replace('j', 'l'); // <- 对immutable对象,都要采取此种方式
} public static void bufferReplace(StringBuffer text) {
text = text.append("c");
} public static void main(String args[]) {
int i=0;
String textString = "java"l// Never new String("java");!!!!!
StringBuffer textBuffer = new StringBuffer("java");
textString = stringReplace(textString); // <-----
bufferReplace(textBuffer);
intReplace(i);
System.out.println(textString);
System.out.println(textBuffer);
System.out.println(i);
}
}
String是不变类
那int也是不变的吗?
String str1=new String("1");
String str2=new String("1");
那str1=str2是false!不能说str1和str2的reference都是一致的
不知道有多少,不过我还见过Class类也是final的,需要去看api才能知道吧
这一句改成text.append("c");就可以基本类型的包裹器类也有类似的“不可变”性质。
public final class StringBuffer
implements java.io.Serializable, CharSequence
看上去也是不变的啊