为什么String和String缓冲区存在diffrenet输出
public class ReturnValueFromTryCatchFinally {
public static void main(String[] args) {
System.out.println(methodReturningValue());
}
static StringBuffer methodReturningValue() {
StringBuffer buffer = new StringBuffer();
try {
buffer.append("aa");
return buffer;
}
catch (Exception e) {
buffer.append("bbb");
return buffer;
}
finally {
buffer.append("vvvv");
}
}
static String methodReturningValue1() {
String buffer = new String();
try {
buffer=buffer.concat("aa");
return buffer;
}
catch (Exception e) {
buffer=buffer.concat("bbb");
return buffer;
}
finally {
buffer=buffer.concat("vvvv");
}
}
}
对于用户定义的对象,它的行为也与String相同
答案 0 :(得分:1)
当finally块执行buffer=buffer.concat("vvvv");
时,它将为本地变量String
分配一个新的buffer
,但是该方法返回{引用的原始String
实例。 {1}}评估buffer
语句时。
当finally块执行return buffer;
时,它会突变buffer.append("vvvv")
语句中返回的同一实例,因此您会看到该方法返回的突变实例。
第一种方法的行为等同于:
return buffer
第二种方法的行为等效于:
StringBuffer buffer = new StringBuffer();
buffer.append("aa");
StringBuffer returned = buffer;
buffer.append("vvvv"); // mutates the same instance that will be returned
return returned;
答案 1 :(得分:1)
在{em> 之后,调用buffer=buffer.concat("vvvv")
块。在finally
中读取buffer
的值。对变量return buffer;
本身的任何更改都不会返回。
在buffer
是StringBuffer的情况下,您没有更改buffer
的值,而是更改了buffer
的 content ,该方法的调用者可以看到。
但是在buffer
是字符串的情况下,您不能做同样的事情。字符串是不可变的。
答案 2 :(得分:0)
$ g++ 1-Flat.cpp -L /usr/local/lib/ -lfaiss
记住要返回的实例。 return buffer;
创建新的字符串实例,但从未使用过。
答案 3 :(得分:0)
在StringBuffer的情况下,当对象值改变并最终阻止它自动理解时,它隐式地知道对象的引用。 但是,在使用String的情况下,您要指向引用,然后将其串联起来,因为String是不可变的。