为什么更改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())。当然,与任何散列一样,两个不相等的对象可能具有相同的散列,但该函数确实尝试减少重叠。正如预期的那样,结果通常基于内存位置,尽管它通常不是内存位置本身。


以上是为什么更改StringBuilder会更改其hashCode?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>