gpt4 book ai didi

java - 有没有一种安全的方法来制作 HashSet 而无需手动将其包装在另一个对象中?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:16:51 25 4
gpt4 key购买 nike

我最近遇到了 Java 明显吞噬整个 int[] 的问题当我尝试合并两个 HashSet<int[]> 时,它们的值彼此不同使用 addAll方法。我没有一个小的工作示例,因为我只在一百万的大型数据集中观察到这种行为。

我的理解是 equalshashCode int[] 的方法未实现以尊重对 int 的引用的内容或指针值大批。有没有办法修改 HashSetint[]没有包装它,以使其安全地使用 HashSet<int[]>

最佳答案

下一个程序:

final int[] a1 = { 1 };
final int[] a2 = { 1 };
final int[] a3 = a1;

System.out.println("a1.equals(a2): " + a1.equals(a2));
System.out.println("a1.equals(a3): " + a1.equals(a3));

输出:

a1.equals(a2): false
a1.equals(a3): true

关于您的留言:

My understanding is that the equals and hashCode methods of the int[] are not implemented to respect either the content or the pointer value of the reference to an int array.

意思是equalshashCode尊重指针值,但不尊重值。

我看到 Java 吞噬了你的一个 int[] 的两个潜在原因.

  1. 如果您要填写 HashSet来自几个线程。 HashSet不同步。您需要如下创建它:Collections.synchronizedSet(new HashSet<int[]>()) .由于您有数以百万计的对象,添加时发生碰撞的可能性非常高。
  2. 数组是一个可修改的对象。如果您的程序在读取时使用旧的数组实例,则您的程序可能存在错误。

关于java - 有没有一种安全的方法来制作 HashSet<int[]> 而无需手动将其包装在另一个对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18792722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com