Java String真的是不可变的吗?

Ale*_*lex 4 java

在String源中,只有在方法public int hashCode()被调用至少一次时,才会设置哈希码值(private int hashCode).这意味着一个不同的状态.但是hashCode是否会在以下示例中设置:

String s = "ABC"; ? 
Run Code Online (Sandbox Code Playgroud)

String s = "ABC"; 
s.hashCode();
Run Code Online (Sandbox Code Playgroud)

有助于后续的比较表现?

Rob*_*vey 12

不可变性意味着,从外部角度来看,对象的价值不能改变.

如果hashCode正在缓存,则在第一次hashCode调用后对象的内部状态可能不同.但是该调用是只读的,并且您无法更改对象的值,因为它看起来像是外部世界.

换句话说,它仍然是相同的字符串.

  • 叹.从同一个维基百科页面:*"在某些情况下,即使一些内部使用的属性发生变化,但对象的状态似乎从外部角度来看是不变的,对象也被认为是不可变的.例如,一个使用memoization缓存的对象昂贵计算的结果仍然可以被认为是一个不可变对象."*hash`值的缓存是经典的memoization. (3认同)
  • @Alex - SIGH ......但它不是对象状态的可观察变化, (2认同)
  • 叹.如果它像一个不可变对象一样行走,并且像一个不可变对象那样嘎嘎叫,它就是一个不可变对象.性能与不变性无关. (2认同)