为什么改变stringbuilder会改变它的哈希代码?

2hh7jdfx  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(285)

这是输入。

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);
    }

这是输出。
data=你好
长度=25
容量=21
地址=5b480cf9
data=大家好
长度=14
容量=30
地址=6f496d9f
大家好,怎么了?
长度=26
容量=42
地址=723279cf
为什么地址不同于其他地址?我想我也一样。我尝试了不同的方法,比如插入,替换,字符,但是地址还是不一样。有人能告诉我为什么吗?。

iszxjhcz

iszxjhcz1#

内部 printBuild() ,你做了一个新的 StringBuilder 每一个电话。每次为新生成器打印哈希:

int addressBuild = System.identityHashCode(build);

你不能合理地期待一个不同的结果。如果希望每次都看到相同的哈希,请删除以下行:

StringBuilder build = new StringBuilder(dataBuild);

对输入参数进行操作 dataBuild 直接:作为引用传入。
详细说明: System.identityHashCode 生成的结果只有在对象相同时才保证相同(如中所示) == ,不是 equals() ). 当然,与任何散列一样,两个不相等的对象可能具有相同的散列,但函数确实尝试减少重叠。正如预期的那样,结果通常基于内存位置,尽管它通常不是内存位置本身。

yrefmtwq

yrefmtwq2#

System#identityHashCode 不返回对象的地址。
为给定对象返回与默认方法hashcode()返回的哈希代码相同的哈希代码,无论给定对象的类是否重写hashcode()。空引用的哈希代码为零。
类的每个对象都有不同的哈希代码。因为每次调用 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

相关问题