今天发现自己除了arraylist,hashmap,hashset三个框架后,其他一概不知,所以要特别强化的学习一下。先来一张集合的家谱图
一个一个数据结构慢慢地了解
跟list相关的集合
arraylist
中文名:有序列表
[图片上传失败...(image-23e23-1516539859307)]
属性: 动态数组(1.5倍动态扩展);int newCapacity = oldCapacity + (oldCapacity >> 1);,无容量限制,非线程安全,查询快,修改慢
用途:非多线程情况下,动态存储不定量的对象,需要频繁查询
适用于通过为位置来读取元素的场景
linkedlist
中文名:双向链表
[图片上传失败...(image-e91559-1516539859307)]
属性:双向链表,无容量限制,非线程安全,查询慢,修改快
用途:非多线程情况下,需要频繁修改的时候
适用于要头尾操作或插入指定位置的场景
vector
中文名:容器
照片:我没找到vector的照片,但是vector的结构是和arraylist的结构一样。都是动态数组
属性:动态数组(2倍动态扩展)int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity),无容量限制,线程安全(与arraylist不同的地方),查询和修改都一般
用途:多线程下,增删改查频繁的情况
适用于要线程安全的ArrayList的场景
stack
中文名:栈
属性:继承vector,线程安全,只允许操作栈顶。先进后出,后进先出
用途:计算器的加减乘除
jvm的java虚拟机栈
适用于线程安全的LIFO场景
与map相关的集合
hashtable
中文名:哈希表
属性:线程安全,key-value存储,key,value不允许null。性能很差(因为同步)
用途:虽然该类可以作为多线程下hashmap的替代;但是java并发包下concurrenthashmap是一个更好的选择。concurrenthashmap不光线程安全,而且性能更好(分段锁)
hashmap
中文名:哈希映射
[图片上传失败...(image-a932f-1516539859307)
属性:线程不安全,key-value存储,key,value允许null。具有很高的查询性能(时间复杂度(log1)),entry是单链表
用途:单线程下,需要一 一对应的存储数据(如id对应用户)。
适用于大部分key-value的存取场景
linkedhashmap
中文名:链表和哈希表实现
[图片上传失败...(image-ba349-1516539859307)]
属性:线程不安全,key-value存储,key,value允许null,遍历比hashmap(当hashmap容量小的时候)慢
记录了插入顺序,entry是双向循环链表
用途:需要保存插入记录的对象集合
treemap
中文名:红黑树
[图片上传失败...(image-d4b020-1516539859307)]
属性:二叉树,
节点是黑色或红色,
根节点黑色,
叶子节点和空节点黑色。
红节点的子节点都是黑的。
任意节点到叶子节点的所有路程都有相同的黑节点
非线性安全,查询时间复杂度(logn)
用途:需要按自然顺序或自定义顺序遍历键的时候
适用于需排序存放的key-value场景
跟set有关的集合
hashset
中文名:哈希集合
属性:底层是个hashmap,所以具备hashmap的性质。
用途:hashset的查找效率比arraylist高,可用于查找和判断是否存在重复对象
适用于对排序没有要求的非重复元素的存放
linkhashset
中文名:
照片:参照linkhashmap
属性:线程不安全,记录了插入顺序,entry是双向循环链表。存不重复的对象
用途:需要保存插入记录的不重复对象集合
treeset
中文名:
照片 :参照treemap
属性:二叉树,
节点是黑色或红色,
根节点黑色,
叶子节点和空节点黑色。
红节点的子节点都是黑的。
任意节点到叶子节点的所有路程都有相同的黑节点
非线性安全,查询时间复杂度(logn)
用途:需要按自然顺序或自定义顺序遍历对象的时候
适用于需排序存放的k不重复对象场景