创建字符串对象后,是否可以更改它? 如果您回答“是”,请举例说明如何更改字符串 如果您回答“否”,那么请解释为什么Java设计人员不允许我们修改字符串

创建字符串对象后,是否可以更改它? 如果您回答“是”,请举例说明如何更改字符串 如果您回答“否”,那么请解释为什么Java设计人员不允许我们修改字符串,java,Java,否 字符串是设计不变的。如果要更改字符串,我建议您查看StringBuffer类 不变是一种设计模式。由于多个实体可以引用一个对象,不变性确保您引用的对象没有被引用它的其他对象更改。否,您不能在创建字符串后修改它字符串是一个示例。如果您有以下代码: String a = "hello"; String b = a; a和b现在正在引用同一个对象,但是您无法对a执行任何操作,以更改b正在引用的字符串。只能将a分配给不同的字符串 我只能推测为什么Java设计师选择这种方式,但我怀疑一个主要原因是为

字符串是设计不变的。如果要更改字符串,我建议您查看StringBuffer类


不变是一种设计模式。由于多个实体可以引用一个对象,不变性确保您引用的对象没有被引用它的其他对象更改。

否,您不能在创建字符串后修改它<代码>字符串是一个示例。如果您有以下代码:

String a = "hello";
String b = a;
a
b
现在正在引用同一个对象,但是您无法对
a
执行任何操作,以更改
b
正在引用的字符串。只能将
a
分配给不同的字符串

我只能推测为什么Java设计师选择这种方式,但我怀疑一个主要原因是为了促进代码的可预测性。如果你有这样的东西

String h = "house";
String hcopy = h;
在以后的某个时候,您能够以某种方式修改
h
,比如
h.splitInHalf()
,它实际上改变了
h
的字符串,这也会影响
hcopy
,当简单的
string
变量在没有警告的情况下更改值时,会让事情变得非常令人沮丧


如果您想要一个可以修改的
字符串
-like结构,可以使用
StringBuffer

,但不行,每次尝试更改它时,实际上会创建一个新的字符串对象。如果要使用可更改字符串,请改用StringBuffer、StringBuilder


内存中有一个字符串常量池,以提高性能。

根据我的经验,这是一个常见的面试问题。目的是弄清楚受访者是否知道
java.lang.String
类的内部结构

因此,为了回答这个问题,根据设计,Java不允许更改字符串对象,这些对象是不可变的。然而,尽管您永远不应该在实际的生产代码中这样做,但从技术上讲,可以使用反射API更改字符串对象

import java.lang.reflect.Field;

public class App {
    public static void main(String[] args) throws Exception {
        String str = "Hello world!";
        Field valueField = String.class.getDeclaredField("value");
        valueField.setAccessible(true);
        char[] c = (char[]) valueField.get(str);
        c[1] = 'a';
        System.out.println(str); //prints Hallo world! 
    }
}

正如人们常说的,Java会让你在使用“import Java.lang.reflect.*;”的魔法后射中自己的脚。

?我看不出有任何尝试……为什么Java设计人员不让我们修改字符串以避免字符串值的意外更改。如果在一个代码块中(可能在线程A中),您正在引用一个字符串,而同时线程B正在处理该字符串,那么线程A将受到不可预测的影响-也就是说,线程A无法保证字符串值不会更改。