为什么更改StringBuilder会更改其hashCode?
这是输入。
public static void main(String[] args){
StringBuilder builder = new StringBuilder("hello");
printBuilder(builder);
// append
builder.append(" everyone");
printBuilder(builder);
builder.append(", what's up?");
printBuilder(builder);
}
private static void printBuilder(StringBuilder dataBuild){
StringBuilder build = new StringBuilder(dataBuild);
System.out.println("data = " + build);
System.out.println("length = " + build.length());
System.out.println("capacity = " + build.capacity());
int addressBuild = System.identityHashCode(build);
System.out.println("address = " + Integer.toHexString(addressBuild);
}
这是输出。
- 数据=你好
- 长度 = 25
- 容量 = 21
- 地址 = 5b480cf9
- 数据=大家好
- 长度 = 14
- 容量 = 30
- 地址 = 6f496d9f
- data = 大家好,最近怎么样?
- 长度 = 26
- 容量 = 42
- 地址 = 723279cf
为什么地址与其他地址不同?我虽然会一样。我尝试了不同的插入、替换、charAt,但地址仍然不同。谁能告诉我为什么?
回答
在里面printBuild()
,你StringBuilder
每次调用都会创建一个新的。每次都会为新构建器打印哈希:
int addressBuild = System.identityHashCode(build);
你不能合理地期待不同的结果。如果您想每次都看到相同的哈希值,请删除以下行:
StringBuilder build = new StringBuilder(dataBuild);
dataBuild
直接对输入参数进行操作:它作为引用传入。
详细说明:System.identityHashCode
产生的结果只有在对象相同时才保证相同(如在 中==
,不在 中equals()
)。当然,与任何散列一样,两个不相等的对象可能具有相同的散列,但该函数确实尝试减少重叠。正如预期的那样,结果通常基于内存位置,尽管它通常不是内存位置本身。