使用"+ ="在Java中"更改"字符串时会发生什么?

Sha*_*y96 1 java memory string performance concatenation

我知道Java中的String变量是不可变的,因此不能更改.

String myString = "Hello.";
myString += " ";
myString += "My name is Kevin"; 
Run Code Online (Sandbox Code Playgroud)

每次我们"添加"某些东西时String(),我们都在有效地创建一个新的String(),但它与它被连接的字符串具有相同的名称.这是否意味着内存中有多个引用变量"myString"?

Wil*_*ill 6

每次"修改"/连接Stringwith时+=,都会创建一个新String对象并替换以myString新创建的名称命名的引用String.所以不,内存中只有一个引用,但引用指向的对象每次都会更改.字符串是不可变的,因此无法"就地"修改对象.

String是Java中的不可变类.不可变类只是一个无法修改其实例的类.创建实例时,将初始化实例中的所有信息,并且无法修改信息.不可变类有许多优点.

程序员的StackExchange上有一个很好的答案,解释了为什么 String s在Java中是不可变的,以及有关它如何工作的更多细节.

最好的方法是使用StringBuilder()该类:

String myStringBuilder = new StringBuilder("Hello.");
myStringBuilder.append(" ");
myStringBuilder.append("My name is Kevin");

System.out.println(myStringBuilder.toString());
Run Code Online (Sandbox Code Playgroud)

但是,String连接StringBuilder由现代Java编译器自动转换为操作.