黑马程序员技术交流社区
标题:
HashSet 和Arraylisht 中 equals的区别
[打印本页]
作者:
mohuancaizi
时间:
2014-4-1 18:26
标题:
HashSet 和Arraylisht 中 equals的区别
本帖最后由 mohuancaizi 于 2014-4-1 20:03 编辑
ArrayList al.add(new Person("lisi01", 30));
al.add(new Person("lisi02", 32));
al.add(new Person("lisi03", 33));
al.add(new Person("lisi03", 33));
同样的元素视为同意个人
HashSet中
hs.add(new Person("a2",12));
hs.add(new Person("a3",13));
hs.add(new Person("a4",14));
hs.add(new Person("a1",11));
hs.add(new Person("a1",11));
问题:HashSet 和Arraylisht 中 equals的区别在于 哪 ???
作者:
osully
时间:
2014-4-1 19:12
ArrayList 通常是在使用contains方法的时候 .contains内部调用equals . Person类中去复写equals来判断
而HashSet 在Person类中复写hashCode 和equals方法 来保证元素唯一性
其实equals写出来的代码可以是一样的,只是两个集合调用的不一样
作者:
anqi
时间:
2014-4-1 19:29
本帖最后由 anqi 于 2014-4-1 19:31 编辑
ArrayList添加元素的时候就像数组一样,是按你添加的顺序添加进去的,是隐式的带角标的。
他们的的顺序就是添加时候的顺序。equals方法在添加的时候是用不到的。(可以添加相同元素)
HashSet 是Set集合,它添加的时候元素不是按添加顺序排序,而是先按照hashCode的大小排序,
当hasCode一样的时候就用equals判断大小,这俩方法的意思就是当你添加来一个元素的时候我要
判断下这个元素要被安排在队伍的哪个位置。
用排队形象化的说就是ArrayList是按谁先到谁的位置靠前。HashSet是按一定的顺序排队,
可以按高矮个,可以按年龄,实现的方法就是覆盖Person的hashCode方法和equals方法。
你现在的问题因为都是new对象开辟新空间,添加进去的所有人都是不一样的。(地址值不同)
你想叫同样的属性的元素时同一个人的话就要覆写hashCode和equals方法,改变判断条件。
因为Person默认的hashCode和equals都是继承自Object类。这俩方法的在Object中是比较地址值。
作者:
宋超2356
时间:
2014-4-1 19:39
首先Set存储时无序不可重复的,List是有序可重复的
List中用contains内部调用equals
Set中使用的equals方法是其存入的类(Person或其他)的重写的equals,hashCode方法,举个例子
import java.util.*;
public class Test
{
public static void main(String[] args)
{
HashSet hs = new HashSet();
hs.add(new Smile("呵呵"));
hs.add(new Smile("呵呵"));
System.out.println(hs);
System.out.println("------分割线------");
Smile p1=new Smile("嘿嘿");
hs.add(p1);
hs.add(p1);
System.out.println(hs);
System.out.println("======分割线======");//Smile继承object的hashCode和equals方法
String s1 = new String("哈哈");
String s2 = new String("哈哈");
hs.add(s1);
hs.add(s2);
System.out.println(hs);//String类重写过hashCode与equals所以就不同于Smile,不能添加相同的
}
}
class Smile
{
String name;
Smile(String name)
{
this.name=name;
}
public String toString() {
return name;
}
}
复制代码
输出结果是:[呵呵, 呵呵]
------分割线------
[呵呵, 呵呵, 嘿嘿]
======分割线======
[哈哈, 呵呵, 呵呵, 嘿嘿]
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2