10
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”。

现在我只是将返回类型 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")));
        }


}

输出为“abcaaa”

那么,任何人都可以详细解释我。有什么区别。?

4

3 回答 3

4

仅仅因为整数在immutableso after 方法返回,即使值在方法中改变它也不会反映,而是反映在StringBuilderObject

编辑:

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"));
    }
}
于 2012-02-28T05:53:50.380 回答
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。

在上述方法中, finally 块每次都在调用。

于 2012-02-28T05:53:43.800 回答
0

当一个对象被传递时,它的引用的副本被传递,如果它是可变的,你可以改变它的内容。

于 2012-02-28T06:38:59.373 回答