这是对java中字符串immutablity的妥协吗?

时间:2015-06-04 20:17:53

标签: java string immutability string-pool

我们都知道String在java中是不可变的 - 创建字符串后无法更改内容。

String使用字符数组char[] value来存储字符串内容,这里是java代码 -

/** The value is used for character storage. */
    private final char value[];

如果我们访问字段values[]并进行更改,该怎么办?请参阅此代码 -

            String name = "Harish";
            System.out.println(name); // Harish           
            Field field = name.getClass().getDeclaredField("value");
            field.setAccessible(true);
            char[] value = (char[]) field.get(name);
            value[0] = 'G';
            value[1] = 'i';
            System.out.println(Arrays.toString(value)); // [G, i, r, i, s, h]
            System.out.println(name); // Girish

这样,我认为,我们可以改变字符串的内容,这违反了字符串不变性原则

我错过了什么吗?

1 个答案:

答案 0 :(得分:7)

不,你没有遗漏任何东西。当您使用反射并使不可访问的字段可访问时,当您以“正常”OOP方式使用时,您明确要求丢失该类型提供的所有保证。