public class J {
public Integer method(Integer x)
{
Integer val = x;
try
{
return val;
}
finally
{
val = x + x;
}
}
public static void main(String[] args)
{
J littleFuzzy = new J();
System.out.println(littleFuzzy.method(new Integer(10)));
}
}
它将返回“10”。
现在我只是将Return type Integer替换为StringBuilder并且输出已更改。
public class I {
public StringBuilder method(StringBuilder x)
{
StringBuilder val = x;
try
{
return val;
}
finally
{
val = x.append("aaa");
}
}
public static void main(String[] args)
{
I littleFuzzy = new I();
System.out.println(littleFuzzy.method(new StringBuilder("abc")));
}
}
OutPut是“abcaaa”
所以,任何人都可以详细解释我。 有什么区别。?
答案 0 :(得分:4)
只是因为immutable
中的整数所以在方法返回之后即使在方法中更改了值也没有反映,并且反映在StringBuilder
对象
修改强>
public class J {
public String method(String x) {
String val = x;
try {
return val;
} finally {
val = x + x;
}
}
public static void main(String[] args) {
J littleFuzzy = new J();
System.out.println(littleFuzzy.method("abc"));
}
}
答案 1 :(得分:0)
StringBuilder上的主要操作是append和insert方法,它们被重载以接受任何类型的数据。每个都有效地将给定的数据转换为字符串,然后将该字符串的字符追加或插入字符串生成器。 append方法总是在构建器的末尾添加这些字符; insert方法在指定的位置添加字符。
例如,如果z引用当前内容为“start”的字符串构建器对象,则方法调用z.append(“le”)将导致字符串构建器包含“startle”,而z.insert( 4,“le”)会改变字符串生成器以包含“starlet”。
通常,如果sb引用StringBuilder的实例,则sb.append(x)与sb.insert(sb.length(),x)具有相同的效果。每个字符串构建器都有容量。只要字符串生成器中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区。如果内部缓冲区溢出,它会自动变大。
StringBuilder的实例不适合多线程使用。如果需要这样的同步,则建议使用StringBuffer。
在上面的方法中,最后阻止每次调用。
答案 2 :(得分:0)
传递对象时,会传递其引用的副本,如果内容可变,则可以更改内容。