为什么更改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
  • 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

相关内容

  • 没有找到相关文章

最新更新