字符串-为什么两种情况下返回值都不同

时间:2019-05-02 07:10:26

标签: java core

为什么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相同

4 个答案:

答案 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是不可变的。