ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Day06、Set系列集合-集合嵌套

2022-05-13 23:34:58  阅读:204  来源: 互联网

标签:Map Set put Day06 maps 集合 排序 public


Day06、Set系列集合-集合嵌套

Set系列集合

image-20220501211158106

Set系列集合特点

无序:存取顺序不一致

不重复:可以去除重复

无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素

Set 集合实现类特点

HashSet : 无序、不重复、无索引。

LinkedHashSet: 有序、不重复、无索引。

TreeSet: 排序、不重复、无索引。

Set 集合的功能上基本上与collection的API一致。

HashSet底层原理

. HashSet 集合底层采取哈希表存储的数据。

. 哈希表是一种对于增删改查数据性能都较好的结构。

哈希表的组成

. JDK8 之前的, 底层使用数组+ 链表组成

. JDK8 开始后,底层采用数组+ 链表+ 红黑树组成。

哈希值

是JDK根据对象的地址,按照某种规则算出来的int类型的数值

Object类的API

public int hashCode():返回对象的哈希值

对象的哈希值特点

同一个对象多次调用hashCode()方法返回的哈希值是相同的

默认情况下,不同对象的哈希值是不同的。

image-20220501214052995

image-20220501214244255

哈希表的详细流程:

  1. 创建一个默认长度16 , 默认加载因为0.75 的数组, 数组名table

  2. 根据元素的哈希值跟数组的长度计算出应存入的位置

  3. 判断当前位置是否为null , 如果是null 直接存入, 如果位置不为null , 表示有元素,则调用equals 方法比较属性值, 如果一样, 则不存, 如果不一样, 则存入数组。

  4. 当数组存满到16 * 0.75 = 12 时, 就自动扩容, 每次扩容原先的两倍

HashSet去重复原理解析

image-20220502120556330

案例:

image-20220502121837239

LinkedHashSet集合概述和特点:

有序、不重复、无索引

image-20220502122049377

TreeSet集合概述和特点

  • 不重复、无索引、可排序

  • 可排序: 按照元素的大小默认升序( 有小到大) 排序。

  • TreeSet 集合底层是基于红黑树的数据结构实现排序的, 增删改查性能都较好。

  • 注意: TreeSet 集合是一定要排序的可以将元素按照指定的规则进行排序。

TreeSet集合默认的规则

  • 对于数值类型: lnteger, Double, 官方默认按照大小进行升序排序。

  • 对于字符串类型: 默认按照首字符的编号升序排序。

  • 对于自定义类型如Student 对象, TreeSet 无法直接排序。

结论: 想要使用TreeSet 存储自定义类型需要制定排序规则

自定义排序规则

  • TreeSet 集合存储对象的的时候有2 种方式可以设计自定义比较规则

方式一

  • 让自定义的类( 如学生类) 实现Comparable接口重写里面的compareTo方法来定制比较规则。

方式二

  • Treeset 集合有参数构造器, 可以设置Comparator 接口对应的比较器对象, 来定制比较规则。

image-20220502124417757

image-20220502124921748

image-20220502124939241

可变参数

  • 可变参数用在形参中可以接收多个数据。

  • 可变参数的格式: 数据类型...参数名称

  • public static void sum(int... nums) {
    

可变参数的作用

  • 传输参数非常灵活, 方便。可以不传输参数, 可以传输1 个或者多个, 也可以传输一个数组

  • 可变参数在方法内部本质上就是一个数组。

可变参数的注意事项:

  1. 一个形参列表中可变参数只能有一个

  2. 可变参数必须放在形参列表的最后面

  3. public static void sum1(int age,int... nums) 
    

Collection集合工具类

. java.utiIs.coIIections: 是集合工具类

. 作用: collection并不属于集合, 是用来操作集合的工具类。

Collections 常用的API

方法名称 说明
public static boolean addAII(CoIIection<? super T> c ,T...elements) 给集合对象批量添加元素
public static void shuffIe(List<?> list) 打乱List 集合元素的顺序

Collections排序相关API

  • 使用范围: 只能对于List 集合的排序。

排序方式1 :

方法名称 说明
public static void sort(List list) 将集合中元素按照指定规则排序
注意: 本方式不可以直接对自定义类型的List 集合排序, 除非自定义类型实现了比较规则Comparable接口。

排序方式2 :

方法名称 说明
public static void sort(List list,Comparator<? super T > c) 将集合中元素按照默认规则排序
Collections.sort(apples, new Comparator<Apple>() {
    @Override
    public int compare(Apple o1, Apple o2) {
        return Double.compare(o1.getPrice(),o2.getPrice());
    }
});

Collection体系的综合案例:斗地主

public class GameDemo {
    /*
    1、定义一个静态的集合存储54张牌对象;
     */
    public static List<Card> allCards = new ArrayList<>();

    /*
    2、做牌:定义静态代码块初始化牌数据
     */
    static {
        //3、定义点数:个数确定,类型确定,使用数组
        String[] sizes = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        //4.定义花色:个数确定、类型确定,使用数组
        String[] colors = {"♠", "♥", "♦", "♣"};
        //5.组合点数和花色
        int index = 0;
        for (String size : sizes) {
            index++;
            for (String color : colors) {
                //6.封装成一个牌对象
                Card c = new Card(size, color, index);
                //7.存入到集合容器中去
                allCards.add(c);
            }
        }
        //8、大小王存入到集合对象中去
        Card c1 = new Card("", "

标签:Map,Set,put,Day06,maps,集合,排序,public
来源: https://www.cnblogs.com/cafune02/p/16268720.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有