文章目录
别人博文引用
看了别人了的java集合博文总结,发现自己好像从来没有系统的总结过。借着看博文,整理一下Java集合的知识框架。
常用的集合类有哪些?
Map接口和Collection接口是所有集合框架的父接口:
Collection接口的子接口包括:Set接口和List接口
Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等
Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
线程安全:其中ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。Vector、HashTable是线程安全的。
Java 容器分为 Collection 和 Map 两大类,Collection集合的子接口有Set、List、Queue三种子接口。我们比较常用的是Set、List,Map接口不是collection的子接口。
Collection集合主要有List和Set两大接口
- List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。
- Set:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet。
- Map是一个键值对集合,存储键、值和之间的映射。 Key无序,唯一;value 不要求有序,允许重复。Map没有继承于Collection接口,从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
Map 的常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap
集合框架底层数据结构
Collection
List
-
Arraylist: Object数组 每次增加的容量为 原本容量的一半
-
Vector: Object数组
-
LinkedList: 双向循环链表
Set -
HashSet(无序,唯一):基于 HashMap 实现的,底层采用 HashMap 来保存元素
-
LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 - LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的。
-
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树。)
Map -
HashMap: JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间
-
LinkedHashMap:LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外, LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。
-
HashTable: 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的
-
TreeMap: 红黑树(自平衡的排序二叉树)
**哪些集合类是线程安全的?**向量和hashtable
vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
statck:堆栈类,先进后出。
hashtable:就比hashmap多了个线程安全。
enumeration:枚举,相当于迭代器。
————————————————
版权声明:本文为优快云博主「ThinkWon」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/ThinkWon/article/details/104588551
环境说明:JDK1.8 IDEA2019.1
Set集合
HashSet
- HashSet(无序,唯一):基于 HashMap 实现的,底层采用 HashMap 来保存元素
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
通过查看源代码,set直接封装了一个hashmap。
LinkedHashSet
LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 - LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的。
TreeSet
实现了SortedSet,所以有序。
IDEA自带UML功能导出图片总是卡死,只能截图了。
List
Arraylist
纯数组,自动扩容。
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
(oldCapacity >> 1) 自动扩容一半。初始默认容量是10个。
LinkedList
借图理解双向链表
- LinkedList内部使用链表实现,相比于ArrayList更加耗费空间。
- LinkedList插入,删除节点不用大量copy原来元素,效率更高。
- LinkedList查找元素使用遍历,效率一般。
Stack
Map
HashMap
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
TreeMap
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
Hashtable
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable
JUC并发集合
jdk5.0以后提供了多种并发容器来替代同步类容器从而改善性能,如:ConcurrentHashMap,ConcurrentSkipListMap,ConcurrentSkipListSet,ConcurrentLinkedQueue和ConcurrentLinkedDeque等。以CopyOnWrite开头的集合类,如opyOnWriteArrayList,CopyOnWriteArraySet等
ConcurrentHashMap
package java.util.concurrent;
public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>
implements ConcurrentMap<K,V>, Serializable
从接口到实现类的UML图
Map接口实现
关键总结
HashMap是整个集合中最重要的集合类,其余大部分依据它实现,该类实现必须掌握,也是面试问得最多的原因。
参考博文:
https://blog.youkuaiyun.com/qq_42105629/article/details/97545510
补充:
查看类或接口的继承关系:ctrl + h