当前位置: 首页 > 知识库问答 >
问题:

这是对Java中字符串不可变性的妥协吗?[副本]

常彭薄
2023-03-14

我们都知道String在java中是不可变的--一旦创建了String,内容就不能更改。

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

/** The value is used for character storage. */
    private final char value[];
            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个答案

龚跃
2023-03-14

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

 类似资料:
  • 我们都知道在Java中是不可变的,但是检查下面的代码: 为什么这个程序会这样操作?为什么和的值被更改了,而却没有被更改?

  • 我是java编程的新手。而且我不明白为什么string对象在Java中是不可变的。

  • 问题内容: 我们都知道这String在Java 中是不可变的,但是请检查以下代码: 为什么该程序会这样运行?为何值和改变了,但没有改变? 问题答案: 是不可变的*,但这仅意味着你无法使用其公共API对其进行更改。 你在这里所做的是使用反射来绕过常规API。同样,你可以更改枚举的值,更改整数自动装箱中使用的查找表等。 现在,原因s1和s2变化值是它们都引用相同的实习字符串。编译器执行此操作(如其他答

  • 问题内容: 考虑以下示例。 现在,在Java中,String对象是不可变的。然后如何为对象分配值“帮助!”。这是否与Java中字符串的不变性相矛盾?有人可以向我解释不变性的确切概念吗? 编辑: 好。我现在明白了,但只是一个后续问题。那么下面的代码呢: 这是否意味着将再次创建两个对象(“密西西比”和“ M!ss!ss!pp!”),并且引用在方法之后指向另一个对象? 问题答案: 不是对象,而是对对象的

  • 本文向大家介绍Java中的不可变字符串,包括了Java中的不可变字符串的使用技巧和注意事项,需要的朋友参考一下 在Java中,不可变对象是指那些不能更改或修改(一旦修改)数据的对象。字符串类是不可变的,即一旦我们创建了一个字符串对象,就无法修改其数据。

  • 问题内容: 在 “ Swift编程语言” 的“字符串”部分的“字符串 可变性” 小节中,它表示: 您可以通过将某个变量分配给变量(在这种情况下可以修改)或常量(在这种情况下不能修改)来指示是否可以修改(或 变异 ): 并给出示例代码: 这本书中的iBooks 这里,或在Web浏览器在这里。 在下一段中,它声称“字符串是值类型”。 我的问题:对我来说,这看起来像个可变的字符串。看起来就像我在Java