1、使用HashSet建立对象、添加元素并使用两种方法遍历
代码实现
public class SetDemo {
public static void main(String[] args) {
Set<String> set = new HashSet();
set.add("猴子");
set.add("八戒");
set.add("唐僧");
set.add("沙僧");
Iterator<String> iter = set.iterator();
while(iter.hasNext()) {
String name = iter.next();
System.out.println(name);
}
System.out.println("---------这是一条分隔线---------");
for(String str : set) {
String name = str;
System.out.println(name);
}
}
}
2、问题:如果添加的是自定义类的对象,那么还能自动去重吗?
不确定咱就测试一下
代码实现:
//使用HashSet存储自定义类的对象
Set<Student> stu = new HashSet();
stu.add(new Student("猴子","201801",99));
//名字不一样,学号一样
stu.add(new Student("八戒","201801",99));
//名字一样,学号不一样
stu.add(new Student("猴子","201802",99));
//名字、学号都一样
stu.add(new Student("猴子","201801",99));
//名字学号都不一样
stu.add(new Student("唐僧","201803",99));
Iterator<Student> iter1 = stu.iterator();
while(iter1.hasNext()) {
Student stu1 = iter1.next();
System.out.println(stu1);
}
结果输出的结果发现,它完全不去重,所以jvm也没那么智能。。。。。
解决方法:
第一步:重写hashCode方法(以借助学号去重为例)
代码实现:
public int hashCode() {
return stuNumber.hashCode();
}
第二步:重写equals方法
代码实现:
public boolean equals(Object obj) {
if(obj == this ) {
return true;
}else {
if(obj != null && obj instanceof Student) {
Student stu = (Student) obj;
if(stu.stuNumber.equals(stuNumber)) {
return true;
}
}
}
return false;
}
注:
如果要出现下图界面需要使用 :ctrl + shift + t
3、存储的规则:
(1)将要存出的对象进行hash,进而得到要对象存储的位置
(2)检查要存储的位置是否有元素,如果不存在,则直接存储到当前位置,如果存在,判断将要存储的元素与当前位置已有的元素是否相等(使用equals),如果相等则不改变,如果不相等会通过单链表形式存储到当前位置。