你的问题不是int[]原始问题.Java中的数组是一个对象.问题是它是一个不会覆盖hashCode()和equals()方法的对象.
由于它不会覆盖它们,因此它们与Object的相同,其中对象只有在它们相同时才相等(即对同一实例的引用).
基本上:
int[] a = new int[] {1,1,1,1};
int[] b = new int[] {1,1,1,1};
System.out.println( a.equals(b) );
Run Code Online (Sandbox Code Playgroud)
您可能希望打印这个true,但它会打印false,因为您创建了两个不同的数组,它会检查数组是否是同一个对象,而不是它们的内容是否相同!
很有可能,如果你也加了
System.out.println( a.hashCode() );
System.out.println( b.hashCode() );
Run Code Online (Sandbox Code Playgroud)
您还将获得两个不同的哈希码.
因此,数组不适合用于检查相等性/唯一性的集合中.它们作为标准中的价值很好Map,但不是关键.在番石榴中,BiMap它们既不用于关键也不用于价值.
你该怎么办?
您应该使用它覆盖了一个对象equals(),并hashCode()因此,如果内容是相同的,equals()回报率true和相同的值从返回hashCode()两个.
如果你想要一些相对紧凑的东西,你可以用一个Byte对象来表示这些位.您可以使用位操作运算符.
或者您可以使用BitSet哪个是Java标准容器的位.
小心,因为BitSet可变.当在诸如散列表之类的对值敏感的数据结构中使用时,可变对象可能表现不佳,因为大多数实现无法判断何时更改了值,因此它们无法相应地在散列桶中移动它.一旦存储在对象中,不要设置或清除对象中的任何位BiMap!