行业知识
Java基础——集合(HashSet 集合类、LinkedHashSet 集合类、Collections 集合工具类、Map 接口、Map 集合的遍历方式)
一、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
上一篇:蛤蟆吃怎么制作服务器
下一篇:服务器操作平台介绍怎么写?