Этот учебник по Java говорит, что неизменный объект не может изменить свое состояние после создания.
java.lang.String
имеет поле
/** Cache the hash code for the string */
private int hash; // Default to 0
который инициализируется при первом вызове метода hashCode()
, поэтому он изменяется после создания:
String s = new String(new char[] {' '});
Field hash = s.getClass().getDeclaredField("hash");
hash.setAccessible(true);
System.out.println(hash.get(s));
s.hashCode();
System.out.println(hash.get(s));
Выход
0
32
Правильно ли вызывать String
неизменяемым?