java的set集合——hashSet

一,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 hs=new HashSet();
        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);
    }

}

结果

java的set集合——hashSet_第1张图片

可以看到,由于小强的id已经存在,他并没有存进去 

你可能感兴趣的:(java,intellij-idea)