-5
  • 如果您回答“是”,请举例说明如何更改字符串。
  • 如果您回答“否”,请解释为什么 Java 设计人员不让我们修改字符串
4

4 回答 4

1

不,您不能在创建字符串后对其进行修改。 String不可变类的一个例子。如果您有以下代码:

String a = "hello";
String b = a;

a并且b现在正在引用同一个对象,但是您无法做任何事情来更改正在引用a的字符串。b您只能分配a给不同的字符串。

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

String h = "house";
String hcopy = h;

并且在稍后的某个时间点,您能够以h某种方式修改h.splitInHalf()实际更改的字符串,当简单变量在没有警告的情况下更改值时h,这也会影响hcopy并使事情变得非常令人沮丧。String

如果您想要一个String可以修改的类似结构,您可以使用StringBuffer.

于 2013-01-19T05:33:31.047 回答
1

不能,每次尝试更改它时,实际上都会创建一个新的 String 对象。如果要使用可更改的 String,请改用 StringBuffer,StringBuilder。

为了更好的性能,内存中有一个字符串常量池。

于 2013-01-19T05:35:52.383 回答
1

不。

字符串在设计上是不可变的。如果你想改变一个字符串,我建议你看一下 StringBuffer 类。

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

于 2013-01-19T05:27:27.430 回答
0

以我的经验,这是一个流行的面试问题。目的是弄清楚受访者是否了解java.lang.String班级的内部情况。

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

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.*;”这个魔法咒语之后,让你在自己的脚下开枪。

于 2013-01-19T06:21:27.067 回答