Seb*_*dis 18
正如bzabhi所说,字符串在Java中是不可变的.这意味着字符串对象永远不会改变.这并不意味着您无法更改字符串变量,只是您无法更改字符串的基础内存表示形式.举个例子:
String str = "Hello";
str += " World!";
Run Code Online (Sandbox Code Playgroud)
在执行这些行之后,str将指向内存中的新字符串.原始的"Hello"字符串仍然存在于内存中,但很可能它不会存在很长时间.假设没有任何情有可原的情况,没有任何东西会指向原始字符串,因此它将被垃圾收集.
我想最好的方法就是说当示例的第2行执行时,内存中的新字符串是从原始字符串的串联和添加到其中的字符串创建的.然后将str变量(仅仅是对内存位置的引用)更改为指向刚刚创建的新变量.
我并不是特别了解这一点,但是,据我所知,这就是所有"非原始"价值所发生的事情.在某些时候从Object派生的任何东西都遵循这些规则.原始值,例如int,bools,chars,float和double,允许更改内存中的实际值.所以,从这个:
int num = 5;
num += 2;
Run Code Online (Sandbox Code Playgroud)
内存中的实际值会发生变化.此代码示例不是创建新对象并更改引用,而只是更改num变量的内存中的值.
至于为什么这是真的,它只是Java制造商的设计决定.我相信有人会评论为什么会这样做,但这不是我所知道的.