Set集合与哈希值 day9

1.set的集合概述和特点
2.哈希值
3.HashSet集合概述和特点
4.HashSet保证元素唯一的源码分析
5.数据结构之哈希表
6.LinkedHashSet集合概述和特点
7.TreeSet集合概述和特点

1.set的集合概述和特点

在这里插入图片描述

    Set<String> set = new HashSet<String>();

    set.add("hello");
    set.add("world");
    set.add("java");

    System.out.println(set.add("hello"));
    System.out.println("----------------------------");
    for (String s:set){
        System.out.println(s);
    }

运行结果
在这里插入图片描述

2.哈希值

在这里插入图片描述

示例:注释为运行结果
在这里插入图片描述
字符串String中重写了hasCode方法,所以“重地”和“通话”的哈希值相同

3.HashSet集合概述和特点

在这里插入图片描述

    HashSet<String> hs = new HashSet<String>();

    hs.add("hello");
    hs.add("world");
    hs.add("java");
    
    hs.add("world");
    for (String s:hs){
        System.out.println(s);  
    }

输出:
在这里插入图片描述

4.HashSet保证元素唯一的源码分析

HashSet集合添加一个元素的过程
在这里插入图片描述

在这里插入图片描述

5.数据结构之哈希表

存储流程
在这里插入图片描述
练习:

/*
要求:
创建一个存储学生对象的集合,并存储3个学生对象,在控制台遍历
要求学生对象的成员变量值相同,我们就认为是同一个对象
 */
public class set {
public static void main(String[] args){
    HashSet<Student> hs = new HashSet<Student>();

    Student s1 = new Student("盖俊豪",22);
    Student s2 = new Student("王宇",23);
    Student s3 = new Student("王硕",24);
    Student s4 = new Student("盖俊豪",22);

    hs.add(s1);
    hs.add(s2);
    hs.add(s3);
    hs.add(s4);

    for (Student s:hs){
        System.out.println(s.getName()+","+s.getAge());
    }
}
}

运行结果:
在这里插入图片描述
重写Student类中的equals()方法:alt+insert 自动生成
在这里插入图片描述
重新运行:
在这里插入图片描述

6.LinkedHashSet集合概述和特点

在这里插入图片描述

    LinkedHashSet<String> linkedHashSet = new LinkedHashSet<String>();

    linkedHashSet.add("hello");
    linkedHashSet.add("world");
    linkedHashSet.add("java");
    linkedHashSet.add("world");
    for (String s : linkedHashSet){
        System.out.println(s);
    }

结果
在这里插入图片描述

7.TreeSet集合概述和特点

在这里插入图片描述

    TreeSet<Integer> ts = new TreeSet<Integer>();

    ts.add(10);
    ts.add(40);
    ts.add(30);
    ts.add(50);
    ts.add(20);

    ts.add(30);
    for (Integer i:ts){
        System.out.println(i);
    }

运行结果:
在这里插入图片描述
自然排序Comparable的使用

/*
存储学生对象遍历,创建集合使用无参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
 */
public class set {
public static void main(String[] args){
    TreeSet<Student> ts = new TreeSet<Student>();

    Student s1 = new Student("xishi",29);
    Student s2 = new Student("wangzhaojun",28);
    Student s3 = new Student("diaochan",30);
    Student s4 = new Student("yangyuhuan",31);
    Student s5 = new Student("linqingxia",31);

    ts.add(s1); //添加第一个元素不需要比较
    ts.add(s2);
    ts.add(s3);
    ts.add(s4);
    ts.add(s5);
    //添加第二个元素会与第一个元素比较,通过重写的compareTo方法。返回0表明与第一个元素相同,不存入。返回1表明s2大于s1,所以s2存在了s1后面,升序。返回-1表明s2小于s1,所以s2存在了s1前面面,降序
    for (Student s:ts){
        System.out.println(s.getName()+","+s.getAge());
    }
}

}

使Student继承Comparable
重写compareTo方法,负责会出现ClassCastException异常
在这里插入图片描述

在这里插入图片描述

比较器排序Comparator的使用

/*
存储学生对象遍历,创建集合使用无参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
 */
public static void main(String[] args){
    TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() { //匿名内部类
        @Override
        public int compare(Student o1, Student o2) {
            int num = o1.getAge()-o2.getAge();
            int num2 = num == 0 ? o1.getName().compareTo(o2.getName()) : num;
            return num2;
        }
    });

    Student s1 = new Student("xishi",29);
    Student s2 = new Student("wangzhaojun",28);
    Student s3 = new Student("diaochan",30);
    Student s4 = new Student("yangyuhuan",31);
    Student s5 = new Student("linqingxia",31);

    ts.add(s1); //添加第一个元素不需要比较
    ts.add(s2);
    ts.add(s3);
    ts.add(s4);
    ts.add(s5);
    for (Student s:ts){
        System.out.println(s.getName()+","+s.getAge());
    }

}

在这里插入图片描述
练习1:成绩排序

/*
用TreeSet集合存储多个学生信息(姓名,语文成绩,数学成绩),并遍历该集合
要求:按照总分从高到低出现
 */

public static void main(String[] args){
    TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
        @Override
        public int compare(Student s1, Student s2) {
            int num1 = s2.getMath()+s2.getChinese()-s1.getMath()-s1.getChinese();
            return num1;
        }
    });

    Student s1 = new Student("王宇",85,89);
    Student s2 = new Student("吴彬",99,100);
    Student s3 = new Student("盖俊豪",90,91);

    ts.add(s1);
    ts.add(s2);
    ts.add(s3);


    for (Student s : ts){
        System.out.println(s.getName()+","+s.getChinese()+","+s.getMath());
    }
}

练习2:不重复的随机数

/*
需求:
    编写一个程序,获取10个1到20之间的随机数,要求随机数不能重复,并在控制台输出
思路:
    1.创建Set集合
    2.创建随机数对象
    3.判断集合的长度是否小于10
        是:产生一个随机数,添加到集合
        回到3继续
    4.遍历集合
 */

public static void main(String[] args){
    Set<Integer> set = new HashSet<Integer>();  //使用HashSet不会排序,TreeSet会排序
    //Set<Integer> set = new TreeSet<Integer>();

    Random r = new Random();

    while(set.size()<10){
        int number = r.nextInt(20)+1;
        set.add(number);
    }

    for (Integer i :set){
        System.out.println(i);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值