这是输入。
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
- data=大家好
- 长度=14
- 容量=30
- 地址=6f496d9f
- data=大家好,怎么了
- 长度=26
- 容量=42
- 地址=723279cf
为什么地址与其他地址不同?不过我还是一样。我尝试了不同的方法,比如insert、replace、charAt,但地址仍然不同。有人能告诉我为什么吗?。
在printBuild()
中,每次调用都会生成一个新的StringBuilder
。每次都会为新的构建器打印哈希:
int addressBuild = System.identityHashCode(build);
你不能合理地期待不同的结果。如果您希望每次都看到相同的哈希,请删除以下行:
StringBuilder build = new StringBuilder(dataBuild);
直接对输入参数dataBuild
进行操作:它作为引用传入。
详细说明:System.identityHashCode
产生的结果只有在对象相同的情况下才能保证相同(如==
,而不是equals()
(。当然,如果像任何散列一样,两个不相等的对象可能具有相同的散列,但函数确实试图减少重叠。正如预期的那样,结果通常是基于内存位置的,尽管它通常不是内存位置本身。
System#identityHashCode
不返回对象的地址。
返回给定对象的哈希代码通过默认方法hashCode((,无论给定对象的类重写hashCode((。null引用的哈希代码为零
类的每个对象都有不同的哈希代码。由于每次调用printBuilder
都要创建一个新对象,因此会得到不同的哈希代码。
注意:使用==
进行比较会为具有相等哈希码的引用返回true
。
class Main {
public static void main(String[] args) {
Boolean b1 = true;
Boolean b2 = Boolean.valueOf("true");
System.out.println(System.identityHashCode(b1));
System.out.println(System.identityHashCode(b2));
System.out.println(b1 == b2);
String s1 = "Hello";
String s2 = s1;
String s3 = new String("Hello");// Creates a new object and hence s3 will have a different hash code
System.out.println(System.identityHashCode(s1));
System.out.println(System.identityHashCode(s2));
System.out.println(s1 == s2);
System.out.println(System.identityHashCode(s3));
System.out.println(s2 == s3);
}
}
输出:
992136656
992136656
true
511833308
511833308
true
1297685781
false