java常用集合

首先请区分Collections , 它只是集合操作的工具类。

下面一张图展示常用List、Set 集合

下面一张图展示常用Map集合族谱

 

 

常用集合随笔

        List

       List之下需要注意的集合实现在ArrayList 、 LinkedLIst、Vector下的Stack。

      存储元素的特点:有序可重复,有序即入和出顺序一致。

      ArrayList 底层采用数组结构存储,线性数据存储,查看效率极高,但是增、删、改会慢一些,因为会涉及到移动操作。其初始化容量为10,扩容规则为原始容量的1.5

    LinkedList 底层采用双向链表,既然是链式而非线性结构,其查询速度必然比不上基于数组的ArrayList,但是增删改只是更改指针而无需移动操作,所以速度会非常快。

  Verctor底层采用数组实现,多线程下安全,线程同步,效率底下,初始容量10,扩容规则基于原容量2倍。

   查多用Array,改多用LIst,防并发 java.util.concurrent.CopyOnWriteArrayList而不是Vector,

 java.util.concurrent.ConcurrentLinkedDeque 或者 java.util.concurrent.ConcurrentLinkedQueue而不是Stack。

不推荐使用Vector或Stack

Set

 无序不可重复,之下需注意的集合实现 HashSet、TreeSet

HashSet 底层其实是HashMap,当value都为null时,其实就成了HashSet,说白了就是为了达到散列表存储的效果(HashMap就是个散列表),增加元素时,put的key,value都是统一一份,遍历元素其实是遍历Map的key值。初始化容量16,默认加载因子0.75

TreeSet 底层其实是一个TreeMap ,而TreeMap底层是一个可排二叉数据结构。不可重复,按元素大小顺序排序。

 

Map

   接口Map以键值对的方式存储,key起主导作用,value附属于key上,所有key无序不可重复。是一维数组和单向链表结合运用的数据结构。

   HashMap 底层hash散列表,存入key部分元素时,会调用hashCode和equels两个方法,决定key是否相等,所以key是自定对象一般需要实现这两个方法。

   关于存储 , 当put (key,value) 时,首先以key的哈希值在一维数组中查找是否存在对应的哈希值的下标,如果不存在,直接将元素存入集合中(哈希值为数组的下标)。如果存在,该下标对应的单向链表上进行key值的equals比较,如果存在相等,覆盖value,如果不存在相当的key则存入在链上。

 关于查询,通过key的hashcode方法获取哈希值,查看数组中是否存在对应的哈希值,如果存在,即定位到对应数组下标(哈希值)下的单向链表,拿着key的值和链表上每个key进行equals,锁定到的那个数据的value即key对应的值。

哈希值和数组下标之间的转换规则,称为哈希算法。

TreeMap实现SortedMap接口,底层是可排二叉树,key部分为无序不重复,但可以根据key的排序规则进行排序。

关于并发解决

 

HashTable   线程安全map,但是性能太差,因为锁的粒度太粗暴。

jdk7中 ConcurrentHashMap具备更好的并行性,从ConcurrentHashMap读取数据的时候ConcurrentHashMap是不会加锁的。另外,ConcurrenthashMap在写的时候不会全部加锁。它仅仅锁住Map中正在被写入的部分。每一个segment都是一个HashEntry<K,V>[] table, table中的每一个元素本质上都是一个HashEntry的单向队列,HashEntry以及其内部每个value都是volatile。

jdk8中的改进:

      

 1、干掉了臃肿的segement,采用Node结点数组的方式,Node + CAS + Synchronized 实现并发控制,通过key的哈希值找到node相应的位置,如果node未初始化,采用cas插入相应数据。 如果node存在,且不处于移动状态,对改node进行上锁,遍历结点下链表进行插入或更新操作。

2、将原先table数组+单向链表的数据结构,变更为table数组+单向链表+红黑树的结构。 有利于实现,将key的hash均匀分布到数组中。后续会讲到红黑书,具体分析该应用带来的效率提升。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值