您可以在创建String对象后更改它吗?

时间:2013-01-19 05:24:37

标签: java

  • 如果您回答“是”,请举例说明如何更改字符串。
  • 如果你回答“否”,那么解释为什么Java设计师不允许我们修改字符串

4 个答案:

答案 0 :(得分:1)

没有

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

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

答案 1 :(得分:1)

不,您在创建字符串后无法修改它。 Stringimmutable class的示例。如果您有以下代码:

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

ab现在引用相同的对象,但您无法对a执行任何更改b引用的字符串的操作。您只能将a分配给其他字符串。

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

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

稍后您可以通过某种方式修改h h.splitInHalf()实际更改了h的字符串,这也会影响hcopy并制作当简单的String变量在没有警告的情况下更改值时,这些事情非常令人沮丧。

如果您希望修改类似String的结构,可以使用StringBuffer

答案 2 :(得分:1)

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

内存中有一个String常量池,可以提高性能。

答案 3 :(得分:0)

根据我的经验,这是一个受欢迎的面试问题。目的是弄清楚受访者是否知道java.lang.String班级的内部。

所以要回答这个问题,通过设计,Java不允许更改String对象,那些对象是不可变的。但是,尽管您不应该在实际的生产代码中执行此操作,但在技术上可以使用Reflection 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! 
    }
}

正如人们常说的那样,使用魔法咒语“import java.lang.reflect。*;”后,Java会让你自己开枪。