一,set集合
set也是collection的接口实现类,并且他的功能全部来自collection
但是他的数据不能重复
二,hashSet集合
底层数据结构是哈希表
对集合中的迭代顺序不保证(存进去的顺序跟取出来的顺序不一定一样)
没有索引,无法使用for循环遍历,但是增强for循环可以,因为他实际上迭代器
是set的实现类,不能有重复元素
三,练习
用hashset储存学生对象,学号重复的不添加
Student类
public class Student {
public String id;
public String name;
public int age;
public Student(){}
public Student(String id,String name,int age){
this.age=age;
this.id=id;
this.name=name;
}
@Override
public String toString(){
return "学号:"+id+"\t"+"姓名:"+name+"\t"+"年龄:"+age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
// 如果为空,即当前集合中没有元素,即没有相同id返回false
// 如果不为空,判断id是否在集合中存在了,若存在则不进入if语句体,而是进入下一步(即最后一句返回true)
// 若不存在则进入if语句体返回false
if (id != null ? !id.equals(student.id) : student.id != null) return false;
return true;
}
/* 重写hashCode(),使所有Student对象的哈希值相等
如果不重写,不同的对象哈希值不同,这样就不会进入内容的比较直接插入hashset集合中
重写把所有哈希值返回为相同的值,使之进入equals()中比较内容
*/
@Override
public int hashCode() {
return 0;
}
}
测试类
import java.util.HashSet;
public class HashTest {
public static void main(String[] args) {
HashSet<Student> hs=new HashSet<Student>();
Student s1=new Student("111","小华",21);
Student s2=new Student("222","小明",23);
Student s3=new Student("333","小丽",22);
hs.add(s1);
hs.add(s2);
hs.add(s3);
System.out.println(hs);
System.out.println("--------------------------------------------------------------");
Student s4=new Student("333","小强",23);
// 先判断哈希值,不同直接存,相同则判断id(因为我重写的equals只判断id是否一样)
// 注意返回false表示没有重复,存入集合;返回true表示有重复,不存储,我老是想错
hs.add(s4);
System.out.println(hs);
}
}
结果
可以看到,由于小强的id已经存在,他并没有存进去