目录
喜欢的朋友可以关注一下,下次更新不迷路!💕(●'◡'●)
前言
Java 集合,也叫作容器,主要是由两大接口派生而来:一个是 Collection
接口,主要用于存放单一元素;另一个是 Map
接口,主要用于存放键值对。对于Collection
接口,下面又有三个主要的子接口:List
、Set
、 Queue
1、集合框架
List
(对付顺序的好帮手): 存储的元素是有序的、可重复的。Set
(注重独一无二的性质): 存储的元素不可重复的。Queue
(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。Map
(用 key 来搜索的专家): 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),"x" 代表 key,"y" 代表 value,key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。
2、Collection
List
特点
(1)有序性:List中的元素是按照添加顺序进行存放的。因为有序,所以有下标,下标从0开始
(2)可重复性: List中可以存储重复的元素
ArrayList
概念:
底层使用数组来存储元素,而数组的长度是固定的,但ArrayList长度却是可变的。
自动扩容机制:
在ArrayList中,每当添加一个元素时,都需要先检查当前数组容量是否足够,如果容量不足,则需要进行扩容操作。而ArrayList的扩容机制是:将原数组的长度乘以一个增长因子,通常是1.5,生成一个新的大数组,然后将原数组中的元素复制到新数组中来,这样就完成了扩容操作。
LinkedList
概念:
底层使用的是双向链表数据结构
Vector
概念:
允许不同类型元素共存的变长数组
ArrayList的PLUS版
Set
特点
不存放重复的元素
HashSet
HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同) 是按照哈希值来存的所以取数据也是按照哈希值取得。
HashSet不存入重复元素的规则.使用hashcode和equals来判断元素是否相同
TreeSet
红-黑树的数据结构,默认对元素进行自然排序(String)。如果在比较的时候两个对象返回值为0,那么元素重复。
LinkedHashSet
会保存插入的顺序。
sortedSet
特点
SortedSet 是一个按升序维护其元素的集合,根据元素的自然顺序或根据 SortedSet 创建时提供的Comparator进行排序。
Queue
特点
代表一个先进先出(FIFO)的队列
总结
看到array,就要想到角标。
看到link,就要想到first,last。
看到hash,就要想到hashCode,equals.
看到tree,就要想到两个接口。Comparable,Comparator。
3、Map
HashTable
特点
HashTable线程安全 (每一个方法都加了锁,适用于多线程并发的环境)
HashTable是继承Dictionary类 都实现了 map,cloneable serializable 接口
HashTable中,key和value都不能为null
HashMap
特点
HashMap线程不安全(在多线程并发会造成死锁问题)但是他的效率比HashTable高,大部分都是单线程操作
HashMap是继承AbstractMap类 都实现了 map,cloneable serializable 接口
HashMap中,可以允许key和value为空的且存储在数组索引为0处
WeakHashMap
特点
改进的HashMap,实现了“弱引用”,如果一个key不被引用,则被GC回收
WeakHashMap.Entry 和 HashMap.Node 的不同点在于,WeakHashMap.Entry 继承了WeakReference。
弱引用的生存期特别短。垃圾回收的时候,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。
想象一下如下场景:
调用两次 size():第一次为 10,第二次就为 8 了。
两次调用 isEmpty():第一次返回 false,第二次返回 true。
两次调用 containsKey():第一次返回 true,第二次返回 false。
两次调用 get():第一次返回一个 value,第二次返回 null。
TreeMap
特点
TreeMap是一个基于key有序的key value散列表。
- map根据其键的自然顺序排序,或者根据map创建时提供的Comparator排序
- 不是线程安全的
- key 不可以存入null
- 底层是基于红黑树实现的
- 按key排序,key不重复
IdentityHashMap
特点
底层实际就是一个 Object 数组,但是在存储上并没有使用链表来存储,而是将 K 和 V 都存放在 Object 数组上。
ConcurrentHashMap
特点
ConcurrentHashMap
是线程安全的,ConcurrentHashMap
并非锁住整个方法,而是通过原子操作和局部加锁的方法保证了多线程的线程安全,且尽可能减少了性能损耗。
乐观锁嘛,认为更新操作时不会被其他线程影响。所以时候再更新少的情况下性能高。
volatile修饰的节点数组
//ConcurrentHashMap使用volatile修饰节点数组,保证其可见性,禁止指令重排。
transient volatile Node<K,V>[] table;
LinkedHashMap
LinkedHashMap维护了一个Entry的双向链表,保证了插入的Entry中的顺序。