HashSet存储方式案例
/*
* HashSet的使用
* 存储结构:哈希表(数组+链表+红黑树)
*(1) 根据hashset计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步,
*(2) 在执行equals方法,如果equals方法为true,则认为是重复,否则,形成链表
*
* */
public class HashSetTest {
public static void main(String[] args) {
//创建集合
HashSet<Student> students = new HashSet<>();
//1.添加数据
Student s=new Student("张三",12);
Student s1=new Student("李四",12);
Student s2=new Student("王五",12);
students.add(s);
students.add(s1);
students.add(s2);
//students.add(s2); 重复之后就不添加了
students.add(new Student("王五",12));
//因为这个重新new了 在堆里面开辟了新的空间 所以会添加进去 如果new student()不添加相同的数据的话需要重写hashcode方法
System.out.println("元素个数:"+students.size());
System.out.println(students.toString());
//2.删除操作
// students.remove(s);
// students.remove(new Student("李四",12));
// students.clear();
// System.out.println("元素个数:"+students.size());
// System.out.println(students.toString());
//3.遍历循环
System.out.println("----------增强for循环----------");
for (Student student : students) {
System.out.println(student);
}
System.out.println("------------迭代器---------------");
Iterator<Student> iterable=students.iterator();
while (iterable.hasNext()){
System.out.println(iterable.next());
}
//4.判断
System.out.println(students.isEmpty()); //集合是否为空
System.out.println(students.contains(new Student("王五",12))); //集合中存不存在
}
}
实体类
public class Student {
//定义两个属性
private String name;
private int age;
//定义 get set 方法 和有参无参构造
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
@Override
public boolean equals(Object obj) {
//1.判断两个对象是否是同一个引用。
if(this==obj){
return true;
}
//2.判断obj是否为null
if (obj==null){
return false;
}
//判断是否是同一个类型 使用instanceof
if (obj instanceof Student){
//强制类型转换
Student s=(Student)obj;
//比较数据
if (this.name.equals(s.getName())&& this.age==s.getAge()){
return true;
}
}
return false;
}
protected void finalize() throws Throwable {
System.out.println(this.name+"对象被回收了");
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public int hashCode(){
int n1=this.name.hashCode();
int n2=this.age;
return n1+n2;
}
}