public class SetDemo1 {
    public static void main(String[] args) {
        Set<String> set=new HashSet<>();
        set.add("haha");
        set.add("xiangxiang");
        set.add("baby");
        //1.
        Iterator<String> it = set.iterator();
        while(it.hasNext()){
            String s = it.next();
            System.out.println(s);
        }
        //2.
        for(String s:set){
            System.out.println(s);
        }
        //3.
        set.forEach( s-> System.out.println(s));
    }
}
----------------------------------------------------
alt+insert重写hashCode()和equals()方法

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}
--------------------------------------------------
public class HashSetDemo1 {
    public static void main(String[] args) {
        /*
        哈希值:
        对象的表现形式
        1.如果没有重写hashCode方法,计算的哈希值是不同的(哈希碰撞情况除外)
        2.如果重写了hashCode方法,不同对象属性相同,计算的哈希值是相同的
         */

        Student s1 = new Student("zhangsan", 18);
        Student s2 = new Student("zhangsan", 18);
        Student s3 = new Student("lisi", 18);
        //1.没有重写
        System.out.println(s1.hashCode());//793589513
        System.out.println(s2.hashCode());//1313922862
        System.out.println(s3.hashCode());//495053715
        //2.重写
        System.out.println(s1.hashCode());//-1461067297
        System.out.println(s2.hashCode());//-1461067297
        System.out.println(s3.hashCode());//102983072
    }
}
----------------------------------------------
public class HashSetDemo2 {
    public static void main(String[] args) {
        //Integer String类型的对象都重写了hashCode和equals方法
        Student s1 = new Student("zhangsan", 18);
        Student s2 = new Student("zhangsan", 18);
        Student s3 = new Student("lisi", 18);
        HashSet<Student> set = new HashSet<>();
        set.add(s1);
        set.add(s2);
        set.add(s3);
        System.out.println(set);//[Student{name = lisi, age = 18}, Student{name = zhangsan, age = 18}]
		
		
        //LinkedHashSet 是HashSet的子类,底层是一个双向链表维护元素的顺序,数据是有序的
        LinkedHashSet<Student> lhs=new LinkedHashSet<>();
        lhs.add(s1);
        lhs.add(s2);
        lhs.add(s3);
        System.out.println(lhs);//[Student{name = zhangsan, age = 18}, Student{name = lisi, age = 18}]
    }
}