android

您所在的位置:网站首页 equals必须重写hashcode android

android

2024-07-17 19:49| 来源: 网络整理| 查看: 265

一、重复数据遇到的问题

之前的一个项目,阿里趣视频后台返回的数据有一些是重复的,为了避免重复的数据被展示,我循环了一遍,通过contains函数,如果集合中已经有了这个数据,就不再添加,如下:

private ArrayList videoList = new ArrayList(); for (HomeBean bean : videoInfoBeans) { if (!videoList.contains(bean)) { videoList.add(bean); } }

但是并没有生效,后来我通过查看contains的源码发现,需要重写hashCode()和equals(Object obj)方法。

先看源码:

ArrayList.java:

public boolean contains(Object o) { return indexOf(o) >= 0; } public int indexOf(Object o) { if (o == null) { for (int i = 0; i >32)) 如果是float,则Float.floatToIntBits(s) 如果是double,则计算Double.doubleToLongBits(f),再按long类型计算一遍 如果是f是个对象引用,并且该类的equals方法通过递归地调用equals的方式来比较这个域,则同样为这个域递归调用hashCode。如果需要更复杂的比较,则为这个域计算一个‘范式’,然后针对这个范式调用hashCode。如果这个域的值为null,则返回0(或者其他某个常数,但通常是0)。 如果是个数组,则需要把每个元素当做单独的域来处理。也就是说,递归地应用上述规则,对每个重要的元素计算一个散列码,然后根据步骤b中的做法把这些散列值组合起来。 如果数组域中的每个元素都很重要,可以利用发行版本1.5中增加的其中一个Arrays.hashCode方法。 步骤(b) 按照下面公式,把(a)步骤中计算得到的散列码c合并到result中:result = 31*result+c (为什么是31呢?) 步骤(a) 为该域计算int类型的散列码c:

3、返回result

4、测试,是否符合『相等的实例是否都具有相等的散列码』

重写Student类的hashCode方法:

@Override public int hashCode() { int result = 17;//非0 任选 result = 31*result + name.hashCode(); result = 31*result + className.hashCode(); return result; }

这下之前的代码输出的结果为class1了!!!~

为什么要选31?

因为它是个奇素数,另外它还有个很好的特性,即用移位和减法来代替乘法,可以得到更好的性能:31*i == (i



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3