Set集合

阅读:235

目录介绍

  • 1.Set集合
    • 1.1 特点
    • 1.2 注意
  • 2.HashSet
    • 2.1 特点
    • 2.2 如何保证元素唯一性
    • 2.3 使用HashSet集合存储自定义对象,保证元素的唯一性
    • 2.4 存储图解
  • 3.LinkedHashSet
    • 3.1 特点
  • 4.TreeSet
    • 4.1 TreeSet集合特点
    • 4.2 如何进行排序
    • 4.3 使用TreeSet集合存储自定义对象,并排序案例
    • 4.4 使用TreeSet集合存储自定义对象,安排姓名的长度进行排序
    • 4.4 产生10个1-20之间的随机数要求随机数不能重复案例
  • 5.二叉树原理图

1.Set集合

  • 1.1 特点

    • Set集合: 可以保证元素的唯一性 , 但是不保证有序(有序: 指的是存储和取出的顺序一致)
  • 1.2 注意

    • set集合在存储元素的时候,需要对元素进行处理,按照一定的算法对元素进行排序,而有的时候我们的添加元素的顺序巧号是set集合计算完毕以后的顺序,但是这也不能说明是有序的

2.HashSet

  • 2.1 特点
    • HashSet集合保证元素的唯一性依赖于两个方法一个是hashCode方法,一个是equals方法在进行比较的时候先比较的是对象的hashCode值,如果对象的hashCode值是相同的,那么在调用equals方法比较.
  • 2.2 如何保证元素唯一性
    • 而我们的字符串是重写hashCode方法和equals方法,那么在这里相同的字符串的hashCode值就是相同的,并且equals方法比较是内容。当hashCode值相同,并且调用equals方法返回的是true的时候,说明两个对象是同一个,于是不进行存储,即就保证了元素的唯一性
  • 2.3 使用HashSet集合存储自定义对象,保证元素的唯一性
    • 如果两个对象的成员变量是相同的,那么我们认为就是同一个对象
  • 2.4 存储图解 

1.png

3.LinkedHashSet

  • 3.1 特点
    • LinkedHashSet: 底层的数据结构是链表和哈希表
    • 元素唯一 ,并且有序

4.TreeSet

  • 4.1 TreeSet集合特点 *

  • 4.2 如何进行排序

    • 集合可以对元素进行排序,而排序有两种方式一种是自然排序,一种是比较强器排序
    • 到底使用的是自然排序还是比较器排序,主要取决于我们使用的构造方法
public TreeSet():                                     使用自然排序
public TreeSet(Comparator<? super E> comparator)      使用的就是比较器排序
  • 4.3 使用TreeSet集合存储自定义对象,并排序案例
/**
 * 需求: 使用TreeSet集合存储自定义对象,并排序
 */
// 创建自定义对象
Student s1 = new Student("刘亦菲" , 18) ;
Student s2 = new Student("貂蝉" , 16) ;
Student s3 = new Student("杨玉环" , 22) ;
Student s4 = new Student("王昭君" , 14) ;
Student s5 = new Student("西施" , 25) ;
Student s6 = new Student("范冰冰" , 25) ;
// 创建TreeSet集合对象
TreeSet<Student> ts = new TreeSet<Student>() ;        // 自然排序
// 添加元素
ts.add(s1) ;
ts.add(s2) ;
ts.add(s3) ;
ts.add(s4) ;
ts.add(s5) ;
ts.add(s6) ;
// 遍历集合
for(Student s : ts) {
    System.out.println(s.getName() + "---" + s.getAge());
}

//在student类中
public class Student implements Comparable<Student>{
    //省略部分代码
    @Override
    public int compareTo(Student o) {
        /**
         * 按照年龄进行排序
         */
        int num = this.age - o.age  ;
        // 比较姓名
        int num2 = num == 0 ? this.name.compareTo(o.name) : num ;
        return num2;
    }
}
  • 4.4 使用TreeSet集合存储自定义对象,安排姓名的长度进行排序
/**
 * 需求: 使用TreeSet集合存储自定义对象,安排姓名的长度进行排序
 */
// 创建自定义对象
Student s1 = new Student("liubei" , 23) ;
Student s2 = new Student("guanyunchang" , 21) ;
Student s3 = new Student("zhangfei" , 18) ;
Student s4 = new Student("lvbu" , 25) ;
Student s5 = new Student("zhugeliang" , 23) ;
Student s6 = new Student("guanyu" , 23) ;
Student s7 = new Student("guanyu" , 25) ;

// 创建集合对象
TreeSet<Student> ts = new TreeSet<Student>() ;

// 添加元素
ts.add(s1) ;
ts.add(s2) ;
ts.add(s3) ;
ts.add(s4) ;
ts.add(s5) ;
ts.add(s6) ;
ts.add(s7) ;

// 增强for遍历
for(Student s : ts) {
    System.out.println(s.getName() + "---" + s.getAge());
}

//-------------------------
public class Student implements Comparable<Student>{
    @Override
    public int compareTo(Student o) {
        /**
         * 比较姓名的长度
         */
        int num = this.name.length() - o.name.length() ;
        // 比较内容
        int num2 = (num == 0) ? this.name.compareTo(o.name) : num ;
        // 比较年龄
        int num3 = (num2 == 0) ? this.age - o.age : num2 ;
        return num3;
    }
}
  • 4.5 产生10个1-20之间的随机数要求随机数不能重复案例
/**
 * 产生10个1-20之间的随机数,要求不能重复
 * 分析:
 *         1: 创建一个HashSet集合对象 , 作用: 存储产生的随机数
 *         2: 生成随机数 , 把随机数添加到集合中
 *         3: 使用循环,当集合的长度大于等于10退出循环 , 小于10就一直循环
 */
// 创建一个HashSet集合对象 , 作用: 存储产生的随机数
HashSet<Integer> hs = new HashSet<Integer>() ;
while(hs.size() < 10) {
    // 使用Random类
    Random random = new Random() ;
    int num = random.nextInt(20) + 1 ;
    // 把num添加到集合中
    hs.add(num) ;
}
// 遍历
for(Integer i : hs) {
    System.out.println(i);
}

5.二叉树原理图

1.png


赞赏支持


精彩留言

发表评论