A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苏乞儿 中级黑马   /  2014-9-14 18:06  /  2975 人查看  /  21 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看老师的视频发现:ArrayList集合中去除重复元素的时候,自定义对象中为什么只是覆盖了equals()方法,而没有覆盖hashCode()方法呢?对象的内存地址也是不一样的啊???求解答。。

21 个回复

倒序浏览
本帖最后由 waterloocode 于 2014-9-14 18:16 编辑

楼主描述专业一点哈,。。。不是自定义对象,对象都是自定义的好么。应该是自定义类。不好意思,没想到回车竟然直接回复了,竟然不能换行?在自定义类中同时覆盖equals()和hashcode(),只是为了使他们判等的结果一样而已。覆盖equals()之后,如果hashcode()符合这个要求就不必重写了,只是一般情况下需要重写而已,这种重写并不是强制性的。还有,在java里面,只有默认的hashcode()返回值是内存地址(额,不知道记错没有)。
回复 使用道具 举报
waterloocode 发表于 2014-9-14 18:10
楼主描述专业一点哈,。。。不是自定义对象,对象都是自定义的好么。应该是自定义类。不好意思,没想到回车 ...

着急了,应该是自定义类的对象。。。。。但是楼主说的,我倒是没看懂啊,我问的是Arraylist集合判断自定义类的对象是否重复的问题,为什么不用判断对象的哈希值是否相等呢?、?
回复 使用道具 举报
ArrayList可以允许有重复的元素啊
回复 使用道具 举报
对啊 可以重复元素的啊
回复 使用道具 举报
苏乞儿 发表于 2014-9-15 00:09
着急了,应该是自定义类的对象。。。。。但是楼主说的,我倒是没看懂啊,我问的是Arraylist集合判断自定 ...

楼下都说可以重复了。。。当时没注意到这一点。。。。list子类是可以重复的啊。。。
回复 使用道具 举报

RE: ArrayList集合中的一个问题?

waterloocode 发表于 2014-9-15 05:58
楼下都说可以重复了。。。当时没注意到这一点。。。。list子类是可以重复的啊。。。 ...

你能不能说一下是哪一课。。或者把代码贴出来。。。会好一点。。
回复 使用道具 举报
ArrayList不需要覆盖equals和hashcode啊,只有HashSet才需要吧
回复 使用道具 举报
ArrayList里的元素是可以重复的
回复 使用道具 举报
HashSet中判断两个对象相等是通过hashCode()和equals()两个方法,如果这两个对象的hashCode()返回值不同而equals()返回值一样,会导致HashSet集合把这两个对象存在不同的位置上,而如果hashCode()返回值一样而equals()不同,情况更加复杂些。简单的说,hashSet中访问元素,先计算hashCode的值,再到该值的位置上取元素。
而List中判断两个对象相等的标准是equals()方法,举个例子:
class A{
    public void equals(Object obj){
     return true;
   }


public class test{
    public static void main(String[] args){
          List list = new ArrayList();
          list.add(new String("nihao"));
          list.add(new String("hello"));
          list.remove(new A());
    }
}
一样可以删除掉元素,虽然他们不是同一个类,不是同一个对象.
回复 使用道具 举报
ArrayList判断是否重复,只要覆盖equals就好了,因为ArrayList底层实现不是哈希表,为什么要覆盖hashCode?
回复 使用道具 举报
ArrayList集合可以有重复元素,正因为对象的地址值不同,才覆盖equals()方法,通过覆盖equals()方法来用其他变量而不是哈希值来比较。
回复 使用道具 举报
waterloocode 发表于 2014-9-14 18:10
楼主描述专业一点哈,。。。不是自定义对象,对象都是自定义的好么。应该是自定义类。不好意思,没想到回车 ...

所有论坛的快速回复都是没有换行的!毕竟是快速~
回复 使用道具 举报
继续看视频!因为ArrayList 内部确定一个元素是否相等的 就是通过equals方法来确定的!因为ArrayList的底层数据结构是数组!只有底层数据结构式哈希表的才需要通过hashcode方法和equals方法来确定是否为同一个元素!最重要的还是要看底层的数据机构是什么!
回复 使用道具 举报
Dale 中级黑马 2014-9-15 09:51:34
15#
要确定ArrayList集合里面的存放的对象是否相等,就是通过equals方法来比较的啊,况且List集合内置中并没有哈希表,而有关哈希集合中有,所以List集合中不必要重写HashCode就可以比较了,而哈希集合就必须有啊!问题不大啊。
回复 使用道具 举报
Dale 中级黑马 2014-9-15 09:53:29
16#
冷冷丶丶 发表于 2014-9-15 08:32
ArrayList集合可以有重复元素,正因为对象的地址值不同,才覆盖equals()方法,通过覆盖equals()方法来用其 ...

同一个对象内存地址是一样的,List集合中只是有这样的机制,你来一个元素我就放一个,底层并没有比较两个对象地址有没有的方法。
回复 使用道具 举报
Dale 发表于 2014-9-15 09:53
同一个对象内存地址是一样的,List集合中只是有这样的机制,你来一个元素我就放一个,底层并没有比较两个 ...

楼主可能是没明白HashSet和Array
回复 使用道具 举报
Dale 发表于 2014-9-15 09:53
同一个对象内存地址是一样的,List集合中只是有这样的机制,你来一个元素我就放一个,底层并没有比较两个 ...

.....没打完怎么就发出去了    我没说清楚  你说的比较完整  但每次new都是一个新的对象  只是不像HashSet那样有哈希表需要用HashCode和equals两个方法才能进行完比较  谢谢你的指导
回复 使用道具 举报
言钟钟 发表于 2014-9-15 09:10
所有论坛的快速回复都是没有换行的!毕竟是快速~

原来真理是这样的。。。。毕竟没有玩儿过论坛。。。
回复 使用道具 举报
waterloocode 发表于 2014-9-15 17:30
原来真理是这样的。。。。毕竟没有玩儿过论坛。。。

进了一个软件工作(没做开发),老板要我们有空多逛逛公司的论坛,就这样天天灌水!才知道的:P
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马