"容器中没有原语"规则是否适用于数组?

don*_*ito 3 java arrays bimap guava

我最近一直试图实现一个简单的遗传算法.我需要使用一个存储成对的可逆地图(Character,4 bits).我选择了番石榴BiMap来完成这项任务.但是由于int我选择用于位存储的数组,测试不会通过.

int[]一种原始类型?使用一个VectorList一个整数是否适合这项任务?

Rea*_*tic 5

你的问题不是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!