前言 : 这几天一直沉迷于HashMap
,LinkedHashMap
, ConcurrentHashMap
的源码之中越陷越深.. 这里说明一下 对于源码这个东西不能太过于详细去挖掘 不然就会出现我这几天这样的情况 ConcurrentHashMap
的原理最让人难以理解. 推荐大概看一下源码后找个对应的视频来解惑. 太难了 .. 废话不多说了 总的来说看了源码之后收获还是有的
集合框架
集合框架体系图png
Java
集合里使用接口来定义功能,是一套完善的继承体系。Iterator
是所有集合的总接口,其他所有接口都继承于它,该接口定义了集合的遍历操作,Collection
接口继承于Iterator
,是集合的次级接口(Map独立存在),定义了集合的一些通用操作。
-
set
无序 不可重复 ,重复元素会盖掉 继承于Collection
接口 (元素虽然无放入顺序,但是元素在set
中位置是由该元素的HashCode
决定的,其位置其实是固定,加入Set
的Object
必须定义equals()
方法;) 检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 -
list
有序 可重复 插入和删除过程伴随着数据的移动 继承于Collection
接口,另外list
支持for
循环,也就是通过下标来遍历,也可以使用迭代器Iterator
, 和数组类似,List可以动态增长,查找元素效率高,插入和删除比较慢 -
Map
:映射键值对,键唯一,值多个 -
并发问题
HashSet Vector ArrayList LinkedList HashMap 线程安全 安全 不安全 线程不安全 不安全 不安全 不安全 是否重复 不重复 可以 可以 可以 (key)不重复 是否有序 无序 有序 有序 有序 无序
ArrayList , LinkedList和Vector的区别
-
ArrayList
-
优点:
ArrayList
是实现了基于动态数组的数据结构,因地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。 -
缺点:
ArrayList
要移动数据,所以插入和删除操作效率比较低 -
适用场景:当需要对数据进行对应访问的情况下选用
ArrayList
插入数据效率一般 不代表不用使用
-
-
LinkedList
-
优点:
LinkedList
基于链表的数据结构 地址是任意的, 对于新增和删除数据有较好的性能 -
缺点: 查询较慢 因为
LinkedList
插叙需要移动指针 详情见LinkedList
简述 -
适用场景 :对数据对此进行添加和删除操作时采用
linkedList
性能较高
-
-
Vector
-
优点:
Vector
是多线程安全的,Vector
可以设置增长因子 -
缺点:
Vector
是一种老的动态数组,是线程同步的使用悲观锁synchronied
,效率很低,一般不赞成使用 -
适用场景 :和
ArrayList
如果集合中的元素的数目大于目前集合数组的长度时,在集合中使用数据量比较大的数据,用Vector有一定的优势。一般不使用Vector
-
ArrayList和LinkedList的动态扩容
-
ArrayList
-
ArrayList
的初始大小为0, 当添加第一个元素时候数组大小变成10 在后续扩容的时候会变成之前容量的1.5倍 -
数组的扩容 只能新建一个指定容量的数组然后对数组进行元素的赋值
-
-
LinkedList
-
LinkedList
双向链表 没有初始化大小, 也没有扩容机制 添加元素只需要移动指针即可
-
HashSet和TreeSet的区别
-
HashSet
-
优点 基于哈希表实现的,允许有一个Null 无序不可重复
-
缺点 :
HashSet
中存放的数据必须实现HashCode()
放入对象是以hashCode
为标识 不能存放hashCode
相同元素 -
适用场景 :
HashSet
基于hash算法实现 为了快速查找使用HashSet
-
-
TreeSet
-
优点 基于红黑树实现
TreeSet
中存放的数据时自动排序好的 -
缺点 不允许有null
-
适用场景 排序功能使用
TreeSet
-
set集合为何能保证元素不重复
-
在往
set
中添加元素时,如果指定元素不存在,则添加成功。 -
当向
HashSet
中添加元素时 首先会计算出元素的HashCode
值,然后用这个元素的HashCode/hashset集合的大小(size)+1
得出元素的存储位置, 如果这个位置为空,直接添加到这个位置,不为空,用equals
比较二个元素是否相等,相等就不添加 则否找一个空的位置添加
HashMap与TreeMap、HashTable的区别及适用场景( 重点)
-
HashMap
-
优点:
HashMap
允许空键值 允许一个null
键和多个null
值 基于哈希表实现, -
缺点:
-
非线程安全 ,
-
使用
HashMap
要求的键类明确定义了hashCode()
和equals()
可以重写hasCode()
和equals()
,为了优化HashMap
空间的使用,您可以调优初始容量和负载因子, -
散列表的冲突处理主分两种,一种是开放定址法,另一种是链表法。
HashMap
实现中采用的是链表法。 -
HashMap
没有排序
-
-
适用场景 适用于
Map
中插入、删除和定位元素。
-
-
TreeMap
-
优点 :安全基于红黑树实现
-
缺点 非线程
-
适用场景 适用于按自然顺序或自定义顺序遍历键(key)
-
-
HashTable
-
优点
HashTable
是同步的 -
缺点
HashTable
不允许Null键。 -
适用场景
HashTable
是同步的
-
-
HashMap
和HashTable
的主要区别-
HashMap
没有排序,允许一个null
键和多个null
值,而Hashtable
不允许 -
HashMap
把Hashtable
的contains 方法去掉了,改成containsvalue
和containsKey
, 因为contains 方法容易让人引起误解; -
Hashtable
继承自Dictionary
类,HashMap
是Jdk1.2 引进的Map
接口的实现; -
Hashtable
的方法是Synchronized
的,而HashMap
不是,在多个线程访问Hashtable
时,不需要自己为它的方法实现同步,而HashMap
就必须为之提供额外的同步。Hashtable
和HashMap
采用的hash/rehash
算法大致一样,所以性能不会有很大的差异。 -
HashMap
和Hashtable
的底层实现都是数组 + 链表(+红黑树 ---jdk8)结构实现的
-
网友评论