其他分享
首页 > 其他分享> > Day06、Set系列集合-集合嵌套

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

作者:互联网

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 存储自定义类型需要制定排序规则

自定义排序规则

方式一

方式二

image-20220502124417757

image-20220502124921748

image-20220502124939241

可变参数

可变参数的作用

可变参数的注意事项:

  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

排序方式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