黑马程序员技术交流社区

标题: ArrayList集合中的一个问题? [打印本页]

作者: 苏乞儿    时间: 2014-9-14 18:06
标题: ArrayList集合中的一个问题?
看老师的视频发现:ArrayList集合中去除重复元素的时候,自定义对象中为什么只是覆盖了equals()方法,而没有覆盖hashCode()方法呢?对象的内存地址也是不一样的啊???求解答。。
作者: waterloocode    时间: 2014-9-14 18:10
本帖最后由 waterloocode 于 2014-9-14 18:16 编辑

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

着急了,应该是自定义类的对象。。。。。但是楼主说的,我倒是没看懂啊,我问的是Arraylist集合判断自定义类的对象是否重复的问题,为什么不用判断对象的哈希值是否相等呢?、?
作者: 刃下心    时间: 2014-9-15 01:09
ArrayList可以允许有重复的元素啊
作者: 谢建平    时间: 2014-9-15 01:25
对啊 可以重复元素的啊
作者: waterloocode    时间: 2014-9-15 05:58
苏乞儿 发表于 2014-9-15 00:09
着急了,应该是自定义类的对象。。。。。但是楼主说的,我倒是没看懂啊,我问的是Arraylist集合判断自定 ...

楼下都说可以重复了。。。当时没注意到这一点。。。。list子类是可以重复的啊。。。
作者: waterloocode    时间: 2014-9-15 06:03
标题: RE: ArrayList集合中的一个问题?
waterloocode 发表于 2014-9-15 05:58
楼下都说可以重复了。。。当时没注意到这一点。。。。list子类是可以重复的啊。。。 ...

你能不能说一下是哪一课。。或者把代码贴出来。。。会好一点。。
作者: MichaelRodman    时间: 2014-9-15 06:10
ArrayList不需要覆盖equals和hashcode啊,只有HashSet才需要吧
作者: 磊弟哥哥    时间: 2014-9-15 06:44
ArrayList里的元素是可以重复的
作者: 石头-剪刀    时间: 2014-9-15 07:53
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());
    }
}
一样可以删除掉元素,虽然他们不是同一个类,不是同一个对象.

作者: zhu_zhu    时间: 2014-9-15 08:25
ArrayList判断是否重复,只要覆盖equals就好了,因为ArrayList底层实现不是哈希表,为什么要覆盖hashCode?
作者: 冷冷丶丶    时间: 2014-9-15 08:32
ArrayList集合可以有重复元素,正因为对象的地址值不同,才覆盖equals()方法,通过覆盖equals()方法来用其他变量而不是哈希值来比较。
作者: 言钟钟    时间: 2014-9-15 09:10
waterloocode 发表于 2014-9-14 18:10
楼主描述专业一点哈,。。。不是自定义对象,对象都是自定义的好么。应该是自定义类。不好意思,没想到回车 ...

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

同一个对象内存地址是一样的,List集合中只是有这样的机制,你来一个元素我就放一个,底层并没有比较两个对象地址有没有的方法。
作者: 冷冷丶丶    时间: 2014-9-15 15:18
Dale 发表于 2014-9-15 09:53
同一个对象内存地址是一样的,List集合中只是有这样的机制,你来一个元素我就放一个,底层并没有比较两个 ...

楼主可能是没明白HashSet和Array
作者: 冷冷丶丶    时间: 2014-9-15 15:21
Dale 发表于 2014-9-15 09:53
同一个对象内存地址是一样的,List集合中只是有这样的机制,你来一个元素我就放一个,底层并没有比较两个 ...

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

原来真理是这样的。。。。毕竟没有玩儿过论坛。。。
作者: 言钟钟    时间: 2014-9-16 08:17
waterloocode 发表于 2014-9-15 17:30
原来真理是这样的。。。。毕竟没有玩儿过论坛。。。

进了一个软件工作(没做开发),老板要我们有空多逛逛公司的论坛,就这样天天灌水!才知道的:P
作者: 沙拉很好吃    时间: 2014-9-16 09:08
感觉好多基础的东西,我都是写笔记直接记住了,原理当初明白,后来也忘了,基础的东西,没事还是得多看看啊
作者: 苏乞儿    时间: 2014-9-18 23:34
奋发吧小白 发表于 2014-9-15 09:26
继续看视频!因为ArrayList 内部确定一个元素是否相等的 就是通过equals方法来确定的!因为ArrayList的底层 ...

谢谢,正解。。说到心里去了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2