JavaSE学习笔记day14

news2024/12/23 10:36:39

二、Set

Set集合是Collection集合的子接口,该集合中不能有重复元素!!

Set集合提供的方法签名,与父接口Collection的方法完全一致!! 即没有关于下标操作的方法

Set接口,它有两个常用的子实现类HashSet,TreeSet

三、HashSet

HashSet实现了Set接口,底层是hash表(实际上底层是HashMap)
该类不允许重复元素,不保证迭代顺序,即无序(插入顺序和遍历顺序不一致)

3.1 方法演示

构造方法

  • HashSet() 构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16加载因子是 0.75
  • HashSet(Collection<? extends E> c) 构造一个包含指定 collection 中的元素的新 set
  • HashSet(int initialCapacity) 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
  • HashSet(int initialCapacity, float loadFactor) 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。

方法

HashSet类中的方法与父接口Set接口中的方法一致,即又跟Collection接口中方法一致

…自行演示

   public static void main(String[] args) {
        // 创建HashSet集合
        HashSet<Integer> set = new HashSet<>( );

        // 放入元素
        boolean r1 = set.add(221);
        System.out.println(r1 );
        boolean r2 = set.add(221);
        System.out.println(r2 );
        set.add(111);
        set.add(111);
        set.add(44);
        set.add(23);

        // 遍历(for + Iterator)
        for(Integer i: set) {
            System.out.println(i );
        }

        // 总结: 顺序问题+ 重复问题
        // 无序即 插入顺序和迭代顺序不一致
        // 不允许重复!
        Iterator<Integer> iterator = set.iterator( );
        while(iterator.hasNext()) {
            Integer integer = iterator.next( );
            System.out.println(integer );
        }


        // 演示其他方法(移除,判断,大小等等)
        System.out.println(set.size() );
        System.out.println(set.isEmpty( ));
        set.clear();
        System.out.println(set.size() );
        System.out.println(set.isEmpty( ));

        HashSet<Integer> set2 = new HashSet<>( );
        set2.add(111);
        // 移除全部指定元素
        System.out.println(set.removeAll(set2));
        System.out.println(set );
    }

3.2 扩容机制[面试]

HashSet底层是Hash表,其实是HashMap.
默认初始容量16,加载因子0.75 —> 扩容的阈值= 容量 * 因子 = 16 * 0.75 = 12
即超过12个元素时就要触发扩容,扩容成原来的2倍

(ps: 初始容量和加载因子是可以通过构造方法创建时修改的…)

练习1: 将字符串数组String [] arr = {“a”,“a”,“b”,“b”,“c”,“c”}去重,变成String[] arr = {“a”,“b”,c"};

// 思路: 遍历数组,将元素放入set集合,再将set集合转数组(toArray)

3.3 去重原理[面试]

  1. 调用add(E e)方法时,会在底层调用元素e的hashcode方法来获得对象的地址值
  2. 如果地址值不一样,直接存储
  3. 如果地址值一样时,会再调用元素的equals方法判断元素的内容是否一样
  4. 如果equals为false,那么存储 但是如果equals判断值为true,那么去重

以后只需要使用工具生成hashcode和equals就可以再HashSet中去重!

public class Student{
    // ..其他代码省略
    // 重写hashcode和equalse
    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }

    @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);
    }
}
 public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>( );
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(1);
        System.out.println(set );

        // 创建几个学生,放入set集合
        // 设想属性一样的学生会去重
        HashSet<Student> stuSet = new HashSet<>( );
        stuSet.add(new Student(18,"zs"));
        stuSet.add(new Student(19,"ls"));
        stuSet.add(new Student(19,"ls"));
        stuSet.add(new Student(20,"ww"));
        System.out.println(stuSet );
    }

四、LinkedHashSet

LinkedHashSet 既有Set的去重的特性,又有Linked结构有序的特性,即
存储在LinkedHashSet 中的元素既不允许重复,又能保证迭代顺序

    public static void main(String[] args) {
        LinkedHashSet<Integer> lhs = new LinkedHashSet<>( );
        lhs.add(211);
        lhs.add(111);
        lhs.add(111);
        lhs.add(44);
        lhs.add(44);
        lhs.add(23);

        System.out.println(lhs );
    }

五、TreeSet

TreeSet是基于 TreeMapNavigableSet 的实现.
可以使用元素的自然顺序对元素进行排序或者根据创建 TreeSet 时提供的 Comparator 进行排序,具体取决于使用的构造方法

即TreeSet会对存储的元素排序,当然也会去重!

5.1 方法演示

构造方法

  • TreeSet()构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
  • TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。

方法

有常规的集合的方法(add,remove,Iterator,size等等),还有一些基于树结构能排序的特性才有的特殊方法,例如范围取值的(ceiling(),floor(),lower(),higher(),首尾取值(),first(),last()…)等操作

   public static void main(String[] args) {

        TreeSet<Integer> set = new TreeSet<>( );
        set.add(44);
        set.add(221);
        set.add(221);
        set.add(23);
        set.add(111);
        set.add(111);
        set.add(0);
        set.add(1114);
        // 发现: 会排序(默认是升序),不能存储重复元素
        System.out.println(set );

        for(Integer i : set) {
            System.out.println(i );
        }

        // 获得第一个(排序后)
        System.out.println("first: " + set.first( ));
        // 获得最后一个(排序后)
        System.out.println("last: " + set.last() );

        System.out.println(set );

        // 获取并移除第一个(排序后)
        System.out.println("第1个" + set.pollFirst());
        // 获取并移除最后一个(排序后)
        System.out.println("最hou1个" + set.pollLast());
        System.out.println(set );

        // 范围取值
        System.out.println(set.lower(100));
    }

5.2 去重排序原理

前提知识: TreeSet底层是TreeMap,TreeMap是红黑树,是一种平衡二叉树(AVL)

练习1:新建User类(age,name),创建TreeSet集合,创建多个User对象,将user对象存入TreeSet集合,实现去重排序,1) 年龄和姓名一致则去重 2) 按照年龄从小到大排序

 TreeSet<User> set = new TreeSet<>( );
  set.add(new User(18,"厄加特"));
  // 运行报错ClassCastException 无法转成Comparable接口

Comparable接口,强行对实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序.
实现这个接口,需要重写comparTo方法,该方法返回值决定了是升序,降序还是去重!

该comparTo(T t)方法运行时 , this指代当前正在调用该方法的对象,参数T就是之前已经存在的元素.

  • 返回值 0 ,意味着此元素(正在存储的元素)和之前的元素相同,即不存储,则去重
  • 返回值正整数,意味着此元素 大于 之前的元素, 放在该节点的右边
  • 返回值负整数,意味着此元素 小于 之前的元素,放在该节点的左边

最后都存储完毕时,取值时采用中序遍历(从根节点开始按照左,中,右的顺序读取)

image-20230223170611586

public class User implements Comparable<User>{
// 属性和方法...
    
/**
 * this 是指代正在存储的元素
 * o    是之前存储的元素
 */
@Override
public int compareTo(User o) {
    System.out.println("此对象--> " + this);
    System.out.println("指定对象--> " + o);
    // 姓名和年龄相同返回0,即去重不存储
    if (this.name.equals(o.getName()) && this.getAge() - o.getAge() == 0) {
        return 0;
    }
    // 年龄相同返回1,即保留下来的不去重的意思
    // 年龄不同的话就正常相减,返回负数或正数
    return this.getAge() - o.getAge() == 0 ? 1 : this.getAge() - o.getAge();
}
}

5.3 练习

需求:创建 5个学生信息(姓名,语文成绩,数学成绩,英语成绩),放入TreeSet集合,输出时按照总分从高到低输出到控制台

package com.qf.set;

import java.util.TreeSet;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class StudentScore implements Comparable<StudentScore>{

    private String name;
    private int chinese;
    private int math;
    private int english;
    // set get 省略
    // 设计方法,获得总分
    public int getTotal(){
        return chinese+math+english;
    }

    @Override
    public String toString() {
        return "StudentScore{" +
                "name='" + name + '\'' +
                "总分='" + getTotal() + '\'' +
                ", chinese=" + chinese +
                ", math=" + math +
                ", english=" + english +
                '}';
    }

    @Override
    public int compareTo(StudentScore o) {
        return o.getTotal() - this.getTotal() == 0 ? 1 : o.getTotal() - this.getTotal();
    }
}

class TestStudentScore {
    public static void main(String[] args) {

        TreeSet<StudentScore> set = new TreeSet<>( );
        set.add(new StudentScore("zhang3",70,70,70 ));
        set.add(new StudentScore("wang5",100,100,100 ));
        set.add(new StudentScore("li4",80,80,80 ));
        set.add(new StudentScore("zhao6",60,60,60 ));
        set.add(new StudentScore("zhou7",90,90,90 ));

        for (StudentScore score : set) {
            System.out.println(score );
        }
    }
}

六、总结

HashSet 方法与父Collection接口中方法一致,正常记
需要向着面试准备: HashSet底层(HashMap),扩容,去重原理

LinkedHashSet 了解

TreeSet底层的树结构能了解就行,只需要指定要想去除排序,必须要实现接口重写方法,返回0去重,返回正负如何如何

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/372185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QML 中的 5 大布局

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在 QML 中,可以通过多种方式对元素进行布局 - 手动定位、坐标绑定定位、锚定位(anchors)、定位器和布局管理器。 说到 anchors,可能很多人都不太了解,它是 QML 中一个非常重要的概念,主要提供了一种相…

C语言几种判断语句简述

C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 fals…

Vuex基础语法

Vuex vuex官网 文章目录Vuexvuex的工作原理图2.vuex的环境搭建3.vuex的使用1.actons2. mutations3.getters4.vuex中的map映射属性4.1 mapState和mapGetters4.2 mapMutations和mapActions5.vuex多组件通信1.通过计算属性获得2.通过mapState获得6.vuex模块化和命名空间6.1模块化…

为什么要用线程池?

1.降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2.提高响应速度。当任务到达时&#xff0c;任务可以不需要的等到线程创建就能立即执行。 3.提高线程的可管理性。线程是稀缺资源&#xff0c;如果无限制的创建&#xff0c;不仅会消耗系统资源&#…

王道《操作系统》学习(一)——计算机系统概述

1.1 操作系统的概念、功能 1.1.1 操作系统的概念&#xff08;定义&#xff09; &#xff08;1&#xff09;操作系统是系统资源的管理者 &#xff08;2&#xff09;向上层用户、软件提供方便易用的服务 &#xff08;3&#xff09;是最接近硬件的一层软件 1.1.2 操作系统的功能…

Java 输入输出流

应用程序经常需要访问文件和目录&#xff0c;读取文件信息或写入信息到文件&#xff0c;即从外界输入数据或者向外界传输数据&#xff0c;这些数据可以保存在磁盘文件、内存或其他程序中。在Java中&#xff0c;对这些数据的操作是通过 I/O 技术来实现的。所谓 I/O 技术&#xf…

Vue2.0开发之——使用ref引用DOM元素(40)

一 概述 什么是ref引用ref引用示例 二 什么是ref引用 ref用来辅助开发者在不依赖于jQuery的情况下&#xff0c;获取DOM元素或组件的引用每个vue的组件实例上&#xff0c;都包含一个$refs对象&#xff0c;里面存储着对应的DOM元素或组件的应用默认情况下&#xff0c;组件的$re…

Vue3之事件绑定

何为事件绑定 当我们开发完UI界面后&#xff0c;还需要和用户交互&#xff0c;所谓交互也就是用户可以点击界面上的按钮&#xff0c;文字&#xff0c;链接等以及点击键盘上的按钮&#xff0c;我们开发的程序可以做出对应的反应。做出的反应会通过UI界面再反馈给用户&#xff0c…

CSS 之层叠规则(权级、权重、顺序)详解

文章目录参考描述定义层叠层叠与冲突规则权重&#xff08;优先级&#xff09;权重值的叠加顺序权级权级层叠规则的运用顺序尾声参考 项目描述MDN WEB Docs优先级Amily_mo令人烦恼的css选择器权值问题 - Amily_mo深入解析CSS基思J.格兰特 / 黄小、高楠 译MDN WEB Docs:not() 描…

华为OD机试用Python实现 -【字符串重新排序】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲字符串重新排序题目描述输入描述输出描述示例一输入输出示例二输入输出Python 代码实现算法思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.csdn.…

JavaEE|TCP/IP协议栈之TCP协议工作机制下

文章目录一、滑动窗口二、流量控制三、拥塞控制四、延时应答五、捎带应答六、面向字节流&#xff08;了解&#xff09;七、异常情况&#xff08;了解&#xff09;关于其他传输层协议一、滑动窗口 为什么要引入滑动窗口&#xff1f; 确认应答和超时重传为TCP可靠传输机制提供支持…

FTP中的TCP传输服务(电子科技大学TCP/IP实验五)

目录 一&#xff0e;实验目的 二&#xff0e;预备知识 三&#xff0e;实验原理 四&#xff0e;实验内容 五&#xff0e;实验步骤 八、总结及心得体会 九、对本实验过程及方法、手段的改进建议 一&#xff0e;实验目的 1、掌握 TCP 协议工作原理 2、掌握 TCP 的连接建立…

阿里团队刚发布的重磅图像生成基础模型,多重条件引导+图像合成,SD级别,5B参数...

一个多小时前刚发的论文&#xff0c;Composer: Creative and Controllable Image Synthesis with Composable Conditions。 我读完了快速帮大家概要一下啊。论文地址见文章最后。阿里巴巴团队开发的这个重磅图像生成模型 Compose&#xff0c;支持多重引导条件的图像生成(合成)&…

containerd安装配置

containerd基本使用命令 containerd安装 容器运行时containerd安装配置 https://blog.csdn.net/rendongxingzhe/article/details/124595415 yum list | grep containerd containerd的本地CLI工具ctr命令 containerd的组件 containerd提供包括容器的运行、测试、发布和接口…

improve-1

类型及检测方式 1. JS内置类型 JavaScript 的数据类型有下图所示 其中&#xff0c;前 7 种类型为基础类型&#xff0c;最后 1 种&#xff08;Object&#xff09;为引用类型&#xff0c;也是你需要重点关注的&#xff0c;因为它在日常工作中是使用得最频繁&#xff0c;也是需要…

DevOps是什么?DevOps能够给我们带来什么?

目录专栏导读一、DevOps是什么&#xff1f;二、为什么会出现DevOps&#xff1f;1、容器化技术的发展&#xff0c;微服务架构的发展&#xff0c;直接促进了DevOps的迅速发展2、敏态需求的增加&#xff0c;即探索性工作的增加3、软件开发活动在企业经营活动中占比的不断增加4、企…

【华为OD机试模拟题】用 C++ 实现 - 水仙花数(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明水仙花数题目输入输出描述示例一输入输出说明示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。…

【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…

基于stm32计算器设计

这里写目录标题 完整de代码可q我获取1 系统功能设计2 系统硬件系统分析设计2.1 STM32单片机核心电路设计2.2 LCD1602液晶显示模块电路设计2.3 4X4矩阵键盘模块设计3 STM32单片机系统软件设计3.1 编程语言选择3.2 Keil程序开发环境3.3 FlyMcu程序烧录软件介绍3.4 CH340串口程序烧…

【华为OD机试模拟题】用 C++ 实现 - 最近的点(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明最近的点题目输入输出示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址…