加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – “容器中没有原语”规则是否适用于数组?

发布时间:2020-12-15 04:28:44 所属栏目:Java 来源:网络整理
导读:我最近一直试图实现一个简单的遗传算法.我需要使用一个存储对(字符,4位)的可逆映射.我为这项任务选择了Guava的BiMap.但是由于我为比特存储选择的int数组,测试不会通过. int []是原始类型吗?使用Vector或整数列表是否更适合此任务? 解决方法 你的问题不是in
我最近一直试图实现一个简单的遗传算法.我需要使用一个存储对(字符,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中,就不要设置或清除对象中的任何位!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读