0
点赞
收藏
分享

微信扫一扫

HashSet集合保证元素唯一性源码分析

Java旺 2022-03-11 阅读 77

HashSet集合保证元素唯一性源码分析

HashSet集合添加元素的过程:

柏维怡

HashSet集合存储元素:

  • HashSet要确保元素的唯一性,需要重写hashCode()和equal()方法

代码演示

图:
柏维怡我想你了

不重写hashCode()和equal()方法下

Student类

package CCom.Cnn;

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

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        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) {
        Age = age;
    }
}

Demo类

package CCom.Cnn;

import java.util.HashSet;

/*
      HashSet集合保证元素唯一性源码分析
      HashSet集合添加元素的过程:

      HashSet要确保元素的唯一性,需要重写hashCode()和equal()方法

 */
public class Demo {
    public static void main(String[] args) {
        //建立HashSet集合
        HashSet<Student> s = new HashSet<>();
        //往HashSet集合存元素
        Student s1 = new Student("沸羊羊",21);
        Student s2 = new Student("美羊羊",22);
        Student s3 = new Student("美羊羊",22);
        s.add(s1);
        s.add(s2);
        s.add(s3);
        //查询给对象的哈希地址
        System.out.println(s.hashCode());//-714941564
        System.out.println(s1.hashCode());//460141958
        System.out.println(s2.hashCode());//1163157884
        //注意,这里不重写下判断s2和s3的!!!地址!!!!相等不
        System.out.println(s2.equals(s3));//false
        //使用foreach来循环遍历(Iterator也行),注意这里会遍历的元素会重复
        for(Student x:s){
            System.out.println(x.getName()+x.getAge());
        }


    }
}

输出的内容:
-714941564
460141958
1163157884

false

美羊羊22
美羊羊22
沸羊羊21

重写hashCode()和equal()方法下

Student类注意里面重写方法了

package CCom.Cnn;

import java.util.Objects;

public class Student {
    //默认继承Object类,所以是可以重写父类方法的
       private String name;
       private int Age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        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) {
        Age = age;
    }



    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        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);
    }
}

Demo类

package CCom.Cnn;

import java.util.HashSet;

/*
      HashSet集合保证元素唯一性源码分析
      HashSet集合添加元素的过程:

      HashSet要确保元素的唯一性,需要重写hashCode()和equal()方法

 */
public class Demo {
    public static void main(String[] args) {
        //建立HashSet集合
        HashSet<Student> s = new HashSet<>();
        //往HashSet集合存元素
        Student s1 = new Student("沸羊羊",21);
        Student s2 = new Student("美羊羊",22);
        Student s3 = new Student("美羊羊",22);
        //通过调用hashCode()方法,来查出该对象的位置,相当于门牌号
        System.out.println(s.hashCode());//0
        System.out.println(s1.hashCode());//861532894
        System.out.println(s2.hashCode());//1005185097
        //判断s1和s2的哈希值相等不
        System.out.println(s2.hashCode()==s1.hashCode());//false
        //此时此刻,判断s2和s3的!!!!内容!!!!!相等不
        System.out.println(s2.equals(s3));//true
        //不需要添加s3的内容了
        s.add(s1);
        s.add(s2);

        //s.add(s3);不需要存入

        //使用foreach来循环遍历(Iterator也行),此时便利的元素不重复
        for(Student x:s){
            System.out.println(x.getName()+x.getAge());
        }
    }
}

输出的内容
0
861532894
1005185097

false
true

美羊羊22
沸羊羊21

举报

相关推荐

0 条评论