- 如果您回答“是”,请举例说明如何更改字符串。
- 如果您回答“否”,请解释为什么 Java 设计人员不让我们修改字符串
4 回答
不,您不能在创建字符串后对其进行修改。 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
.
不能,每次尝试更改它时,实际上都会创建一个新的 String 对象。如果要使用可更改的 String,请改用 StringBuffer,StringBuilder。
为了更好的性能,内存中有一个字符串常量池。
不。
字符串在设计上是不可变的。如果你想改变一个字符串,我建议你看一下 StringBuffer 类。
不可变是一种设计模式。由于多个实体可以引用一个对象,不变性确保您引用的对象没有被引用它的其他对象更改。
以我的经验,这是一个流行的面试问题。目的是弄清楚受访者是否了解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.*;”这个魔法咒语之后,让你在自己的脚下开枪。