正如bzabhi所说,字符串在Java中是不可变的。这意味着字符串对象将永远不会改变。这并不意味着您不能更改字符串变量,只是不能更改字符串的基础内存表示形式。例如:
String str = "Hello";str += " World!";
执行完这些行后,str将指向内存中的新字符串。原始的“
Hello”字符串仍然存在于内存中,但是很可能不会存在很长时间。假设没有可减轻的情况,则原始字符串不会指向任何内容,因此将被垃圾回收。
我想最好的表达方式是说,当示例的第2行执行时,将在原始字符串和要添加到其中的字符串的连接中创建一个新的内存字符串。然后,将仅作为对内存位置的引用的str变量更改为指向刚创建的新变量。
我并不是特别了解这一点,但是据我了解,这就是所有“非原始”价值的情况。从Object导出的任何东西都遵循这些规则。原始值(例如int,bool,char,float和double)允许更改内存中的实际值。因此,从此:
int num = 5;num += 2;
内存中的实际值会更改。而不是创建新对象并更改引用,此代码示例将仅更改num变量在内存中的值。
至于为什么如此,这只是Java制造商的设计决定。我敢肯定有人会评论为什么这样做,但这不是我所知道的。



