Set系列集合HashSet的使用

import java.util.HashSet;
import java.util.Set;

/**

  • HashSet集合:无序,无索引,不可重复。
  • HashSet不重复的原因:
  • --对于基本数据类型:直接比较是否相同重复。
    
  • --对于引用数据类型:
    
  • (1)首先会让两个对象调用hashCode()的方法来获取哈希值(所谓的内存地址:其实是一个整数),进行比较。如果两个哈希值不一样则认为两对象没有重复。
    
  • (2)如果两个哈希值不一样则进行equals比较,(重写equals()).
    
  • 总结:Set系列集合元素去重复的原因。
  •  ----对于基本数据类型:Set集合可以直接进行比较是否重复。
    
  •  ----对于引用数据类型:Set集合先进行哈希值比较,再进行equals比较。
    
  • Set系列集合无序的原因:根本原因是选择哈希表存放数据。
  • 哈希表:
  •  数组+链表+哈希算法组成,JDK1.8之前的形式。
    
  •  数组+链表+红黑树+哈希算法组成。JDK1.8之后的形式,显著提高数据的查询性能。原因使用了红黑树。
    

*LinkedHashSet集合:有序,无索引,不可重复。

  •     -----有序的原因:添加了一条链记录了添加顺序。
    
  • */

public class Demo06_Day03_Set系列集合_HashSet的使用 {
public static void main(String[] args) {

    //创建Set集合
    Set<String>set=new HashSet<>();
    //添加元素。
    set.add("Java");
    set.add("Python");
    set.add("C++");
    set.add("UI");
    //打印集合。
    System.out.println(set);
    System.out.println("==============");


    //Set集合不重复测试
    //创建Set集合,存放基本数据类型。
    Set<Double> set0=new HashSet<>();
    //添加基本数据类型。
    set0.add(20.0);
    System.out.println(set0.add(20.0));
    set0.add(20.0);
    set0.add(23.2);
    set0.add(21.3);
    System.out.println(set0);
    System.out.println("========================");

    //创建Set集合,存放引用数据类型。
    Set<Student> students=new HashSet<>();
    Student stu0=new Student("张飞",20,'男');
    Student stu1=new Student("关羽",22,'男');
    Student stu3=new Student("张飞",20,'男');

    //添加引用数据类型。
    students.add(stu0);
    students.add(stu1);
    students.add(stu3);
    System.out.println(students);

}

}

学生类:

public class Student {

private String name;
private int age;
private char sex;

@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 &&
            sex == student.sex &&
            Objects.equals(name, student.name);
}

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

public Student() {
}

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

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;
}

public char getSex() {
    return sex;
}

public void setSex(char sex) {
    this.sex = sex;
}

@Override
public String toString() {
    return "Student{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", sex=" + sex +
            '}';
}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值