集合简介
集合的概念
对象的容器,定义了对多个对象进项操作的的常用方法。可实现数组的功能。
集合与数组的区别
- 数组长度固定,集合长度不固定。
- 数组可以存储基本类型和引用类型,集合只能存储引用类型。
- 集合存储基本类型可以通过存储其包装类实现
位置
java.util.*;
Collection 体系集合
- 特点 :代表一组任意类型的对象,无序、无下标、不能重复。
- 方法 :
boolean add(Object obj) //添加一个对象。
boolean addAll(Collection c) //讲一个集合中的所有对象添加到此集合中。
void clear() //清空此集合中的所有对象。
boolean contains(Object o) //检查此集合中是否包含o对象。
boolean equals(Object o) //比较此集合是否与指定对象相等。
boolean isEmpty() //判断此集合是否为空。
boolean remove(Object o) //在此集合中移除o对象。
int size() //返回此集合中的元素个数。
Object[] toArray() //此集合转换成数组。
List 集合
ArrayList
底层是数组,查询快,增删慢,线程不安全,必须开辟连续空间
初始容量是 0,执行 add 之后容量变为默认 10 每次扩容时候变为原来的 1.5 倍
LinkedList
底层是双链表,查询慢,增删快,线程不安全,不需开辟连续空间
初始节点个数是 0,每次增加前一个,新节点的 first 指向前一个节点,前一个节点的 next 指向该节点
Vector
底层是数组,查询快,增删慢,线程安全
实际上是在每个方法上添加了 synchronized 关键字,故而线程安全但是有点慢,因为 jdk 优化了 synchronized 也不是特别差。
Set 集合
HashSet
底层是 HashMap,只是 HashMap 中的 key,value 固定不变,故而无序,不可重复,重复会替换
底层是数组 + 链表 + 红黑树的形式
首先根据值计算哈希值,放到数组中,相同哈希值的则以链表的形式存储,当数组长度大于 64 且链表长度大于 8 的时候链表就会变成红黑树的形式,当链表长度小于 6 的时候又从红黑树变成链表
当数组实际存储的数据达到了加载因子*最大长度的时候会进行扩容,变成原来的两倍
存放到数组的时候比较的是 存放对象的 hashCode 方法,当哈希值相等的时候则会比较的是 equals 方法
TreeSet
底层是 TreeMap 红黑树的结构 无序,不可重复
可以对集合元素进行排序,但是集合元素必须实现 Comparable 接口重写 CompareTo 实际就是排序规则
Map 集合
- 特点 :存储一对数据(Key-Value),无序、无下标,键不可重复。
- 方法 :
V put(K key,V value)
// 将对象存入到集合中,关联键值。key 重复则覆盖原值。Object get(Object key)
// 根据键获取相应的值。Set<Map.Entry<K,V>>
// 键值匹配的 set 集合Collection<V> values()
// 返回包含所有值的 Collection 集合。Set<K>
// 返回所有的 key
HashMap
底层是数组 + 链表 + 红黑树的形式
首先根据值计算哈希值,放到数组中,相同哈希值的则以链表的形式存储,当数组长度大于 64 且链表长度大于 8 的时候链表就会变成红黑树的形式,当链表长度小于 6 的时候又从红黑树变成链表
当数组实际存储的数据达到了加载因子*最大长度的时候会进行扩容,变成原来的两倍。加载因子默认 0.75
存放到数组的时候比较的是 存放对象的 hashCode 方法,当哈希值相等的时候则会比较的是 equals 方法
JDK1.8 以前链表是头插入,JDK1.8 以后链表是尾插入
HashMap 在底层将 key_value 对当成一个整体 Entry 对象,根据 key 的 hash 值来决定每个 Entry 的存储位置。
遍历方法 map.keySet 转换成 key 的一个 set 集合。map.entrySet()转换成 entry<k,v> 的 set 集合 Set<Map.Entry<k,v>>
for (Student key : hashMap.keySet()) {
System.out.println(key+" "+hashMap.get(key));
}
for (Entry<Student, String> entry : hashMap.entrySet()) {
System.out.println(entry.getKey()+" "+entry.getValue());
}
TreeMap
实现了 SortedMap 接口(是 Map 的子接口),可以对 key 自动排序。
红黑树的结构 无序,不可重复
红黑平衡排序二叉查找树
每次增删节点就需要重排,LL、LR、RR、RL,每次学会了旋转都好像又忘了
红黑树
红黑树是一种近似平衡的二叉查找树,它能够确保任何一个节点的左右子树的高度差不会超过二者中较低那个的一陪。具体来说,红黑树是满足如下条件的二叉查找树(binary search tree):
- 每个节点要么是红色,要么是黑色。
- 根节点必须是黑色
- 红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)。
- 对于每个节点,从该点至 null(树尾端)的任何路径,都含有相同个数的黑色节点。
在树的结构发生改变时(插入或者删除操作),往往会破坏上述条件 3 或条件 4,需要通过调整使得查找树重新满足红黑树的条件。
Collections 工具类
-
概念 :集合工具类,定义了除了存取以外的集合常用方法。
-
方法 :
public static void reverse(List<?> list)
// 反转集合中元素的顺序public static void shuffle(List<?> list)
// 随机重置集合元素的顺序public static void sort(List<T> list)
// 升序排序(元素类型必须实现 Comparable 接口)Collections.binarySearch(list, 10)
//二分查找必须有序
-
数组转集合:Arrays.asList(array)
-
集合转数组:list.toArray(new Integer[0])
泛型概述
- Java 泛型是 JDK1.5 中引入的一个新特性,其本质是参数化类型,把类型作为参数传递。
- 常见形式有泛型类、泛型接口、泛型方法。
- 语法:
- <T,…> T 称为类型占位符,表示一种引用类型。
- <K,V> 表示健值对
- 表示元素
- 占位符可以任意,上面的是常用的约定见名知意
- 好处:
- 提高代码的重用性。
- 防止类型转换异常,提高代码的安全性。
泛型类
public class myGeneric<T>{T t;}
泛型接口
public interface MyInterface<T> {T server(T t)
泛型方法
public <T> void show(T t) {}
泛型集合
参数化类型、类型安全的集合,强制集合元素的类型必须一致。
ArrayList<T> list = new ArrayList<T>()
public class LinkedList<E>{}
文章参考
https://www.bilibili.com/video/BV1zD4y1Q7Fw
https://lazydog036.gitee.io/2020/10/29/JAVA 集合框架/