This Java tutorial 表示不可变对象在创建后无法更改其状态。调用java.lang.String不可变是否正确?
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
不可变?
反射黑客不计算不可变性。 – Perception 2013-03-07 15:44:21
http://stackoverflow.com/q/11146255/758280 – Jeffrey 2013-03-07 15:45:42
正如@Perception所说,反射攻击不应该算在内。将散列值缓存在专用字段中不会影响任何非私有方法或状态。 – 2013-03-07 15:47:00