如果我在此代码中使用方法替换,为什么需要重新定义变量theString
:
String theString = "I w@nt to h@ve the regul@r \"A\"!";
theString = theString.replace("@", "a");
System.out.println(theString);
为什么我不能这样做:
theString.replace("@", "a");
那就是它?
答案 0 :(得分:7)
字符串是不可变的 - 一旦创建它们就无法更改它们。当然也有例外,如果你使用反射魔法,但在大多数情况下,它们应该被视为不变量。因此,方法replace(...)
不会更改字符串,它不能,而是创建并返回 new 字符串 。因此,为了能够使用新的String,您必须访问其引用,这可以通过将其分配给String变量甚至是原始的String变量来完成。这个讨论深入探讨了对象和引用变量之间的区别。
答案 1 :(得分:3)
因为String对象在设计上是不可变的,所以你需要创建一个新的String来包含你的更改
答案 2 :(得分:3)
发布的答案提到了技术原因(字符串是不可变的)但忽略了为什么会这样。请参阅:Why are strings immutable in many programming languages?
答案 3 :(得分:1)
取自link
在Java中,String不像其他编程语言那样实现为字符数组。相反,string是作为String类的实例实现的。
字符串是常量/不可变的,它们的值在创建后无法更改。如果执行导致更改字符串的任何操作,则会创建并返回String对象的新实例。这种方法是为了实现Java的实现效率。
当需要对String执行许多更改时,建议使用StringBuffer或StringBuilder。 StringBuffer类似于String但可以修改。 StringBuffer是线程安全的,并且所有方法都是同步的。 StringBuilder等同于StringBuffer,供单线程使用。由于方法不同步,因此速度更快。