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

标签 java

我最近遇到了 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/

相关文章:

java - 我似乎无法在我的主体中创建任何对象?

java - 什么是好的免费游戏引擎?

java - 使用JNI访问C中Java对象中的Java对象

java - volatile是否意味着它是线程安全的

java - 强制 JVM 重新加载 "java.library.path"是一个坏主意吗?

java - 我使用 Hibernate 创建了一个基本的 CRUD GUI,但我得到 "index out of bound exception"。可能是什么问题呢?

java - Java中逐行写入Json对象数组

java - 文件传输但无法在其各自的启动器中加载(Adobe Pdf) - Java 服务器客户端

java - Java人工生成cpu负载

java - 如何获取用户的访问 token ?