小工具知识网

当前位置: 首页 > 行业知识 > Java基础——集合(HashSet 集合类、LinkedHashSet 集合类、Collections 集合工具类、Map 接口、Map 集合的遍历方式)

行业知识

Java基础——集合(HashSet 集合类、LinkedHashSet 集合类、Collections 集合工具类、Map 接口、Map 集合的遍历方式)

2026-10-30 22:06:14 来源:互联网转载

一、HashSet 集合���

        HashSet 集合:底层采取哈希表存储数据(哈希表是一种对于增删改查数据性能都较好的结

        构)

        HashSet 特点:保证元素唯一性

                此特点是hashCode方法和equals方法的配合来完成的

                流程:

                        当添加对象的时候, 会先调用对象的hashCode方法计算出一个应该存入的索引位置,                         查看该位置上是否存在元素     

                        ① 不存在:直接存     

                        ② 存在:调用equals方法比较内容         

                                        false : 存     true : 不存

                        自定义类需要重写了类的hashCode和equals方法

                        快捷方法:在类中右键选择Generate选项,如下图

                        

        HashSet 遍历: 迭代器, 增强for, foreach方法

        HashSet 语法:

                HashSet hs = new HashSet();

                hs.add("b");

        hashCode方法:

                根据对象的属性值计算出的哈希值

                哈希值是JDK根据某种规则算出来的int类型的整数

        HsashSet原理解析

                1.JDK 7 : 数组 + 链表

                        ① 创建一个默认长度16的数组,数组名table

                        ② 根据元素的哈希值跟数组的长度求余计算出应存入的位置( 哈希值 % 数组长度)

                              计算位置的源码:

                        

                                复杂的计算是为了某一个位置挂载的数据过多

                        ③ 判断当前位置是否为null,如果是null直接存入

                        ④ 如果位置不为null,表示有元素,则调用equals方法比较

                        ⑤ 如果一样,则不存,如果不一样,则存入数组

                                JDK 7新元素占老元素位置,指向老元素 (头插法)

                                JDK 8中新元素挂在老元素下面(尾插法)
                2.JDK 8 : 数组 + 链表 +  红黑树

                        ⑥ 扩容数组:

                        ​​​​​​   ​A:  当数组中的元素个数到达了 16 * 0.75 (加载因子) = 12扩容原数组 2 倍的大小

                           B:链表挂载的元素超过了8 (阈值) 个 , 并且数组长度没有超过64

                        ⑦ 链表转红黑树

                            链表挂载的元素超过了8 (阈值) 个, 并且数组长度到达了64
二、LinkedHashSet 集合类

        特点:有序、不重复、无索引。
        原理:底层数据结构是依然哈希表,只是每个元素又额外的多了一个双链表的机制记录存储

                   的顺序。

        
总结:

        1.如果想要集合中的元素可重复

                用ArrayList集合,基于数组的。(用的最多)

        2.如果想要集合中的元素可重复,而且当前的增删操作明显多于查询

                用LinkedList集合,基于链表的。

        3.如果想对集合中的元素去重

                用HashSet集合,基于哈希表的。 (用的最多)

        4.如果想对集合中的元素去重,而且保证存取顺序

                用LinkedHashSet集合,基于哈希表和双链表,效率低于HashSet。

        5.如果想对集合中的元素进行排序

                用TreeSet集合,基于红黑树。后续也可以用List集合实现排序。
三、Collections 集合工具类

        1.可变参数

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

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

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

                组

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

                注:

                ① 一个形参列表中可变参数只能有一个  ② 可变参数必须放在形参列表的最后面

        2.Collections 集合工具类

                java.utils.Collections:是集合工具类

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

                1.public static boolean addAll(Collection list) 打乱List集合元素的顺序

                   例:Collections.shuffle(list);

                3.public static int binarySearch (List list,  T key) 以二分查找法查找元素

                   例:Collections.binarySearch(list, "b")

                   注: 必须是排好序的数据

                4.public static void max/min(Collection coll)根据默认的自然排序获取最大/小值

                   例:ArrayList nums = new ArrayList();

                          Collections.addAll(nums,

                                new Student("张三", 23), new Student("王五", 25), new Student("李四", 24)

                           );

                          Collections.max(nums) 

                          Collections.min(nums)

                   注:自定义类要实现Comparable,重写compareTo方法,否则编译报错

​​​​​​​                5.public static void swap(List list, int i, int j)交换集合中指定位置的元素

                   例:Collections.swap(nums, 0, 2);

                6.排序相关API

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

                 ① public static void sort(List list)将集合中元素按照默认规则排序

                      注意:本方式不可以直接对自定义类型的List集合排序,除非自定义类型实现了比较

​​​​​​​                                 规则Comparable接口

                 ② public static void sort(List list,Comparator

上一篇:蛤蟆吃怎么制作服务器

下一篇:服务器操作平台介绍怎么写?