java – “容器中没有原语”规则是否适用于数组?
我最近一直试图实现一个简单的遗传算法.我需要使用一个存储对(字符,4位)的可逆映射.我为这项任务选择了Guava的BiMap.但是由于我为比特存储选择的int数组,测试不会通过.
int []是原始类型吗?使用Vector或整数列表是否更适合此任务? 解决方法
你的问题不是int []是原始的.
Java中的数组是一个对象.问题是它是一个不覆盖hashCode()和equals()方法的对象.
由于它不会覆盖它们,因此它们与Object的相同,其中对象只有在它们相同时才是相同的(即对同一实例的引用). 基本上: int[] a = new int[] {1,1,1}; int[] b = new int[] {1,1}; System.out.println( a.equals(b) ); 您可能希望打印为true,但它会打印为false,因为您创建了两个不同的数组,并检查数组是否是同一个对象,而不是它们的内容是否相同! 很有可能,如果你也加了 System.out.println( a.hashCode() ); System.out.println( b.hashCode() ); 您还将获得两个不同的哈希码. 因此,数组不适合用于检查相等性/唯一性的集合中.它们作为标准Map中的值很好,但不是关键.在番石榴BiMap中,它们既不用于关键也不用于价值. 你该怎么办? 你应该使用一个覆盖equals()和hashCode()的对象,这样如果内容相同,则equals()返回true,并且两者都从hashCode()返回相同的值. 如果你想要一些相对紧凑的东西,你可以用Byte对象表示这些位.您可以使用位操作运算符. 或者您可以使用BitSet作为位的Java标准容器. 要小心,因为BitSet是可变的.当在像哈希表这样的值敏感数据结构中使用时,可变对象可能表现不佳,因为大多数实现无法判断何时更改了值,因此它们无法相应地在哈希桶中移动它.一旦存储在BiMap中,就不要设置或清除对象中的任何位! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |