美文网首页
Java Collection 集合

Java Collection 集合

作者: 呼语 | 来源:发表于2020-06-14 14:06 被阅读0次

3 Java Collection

1. 接口的继承关系

Collection < List Set Queue

Iterator

Map < HashMap HashTable TreeMap


collection 接口继承关系 集合框架图

2. List

List
  • ArrayList

动态数组实现

扩容机制
发生时机: array.add(object)
验证 now_size+1(最小需求容量)是否需要扩容。

  1. 如果当前数组为空,且当前最小需求容量小于默认容量(10) , 将当前最小需求容量 改为10 ;
  2. 用最小需求容量和当前数组长度作对比,判断是否需要扩容。若大于。则调用grow函数扩容。
  3. 在grow函数中,计算一个1.5倍*旧容量的值newcapacity,与最小需求容量作对比,若小于最小需求容量,则扩容新值改为最小需求容量。
  4. 再判断新值与max_array_list的大小,如果大于max。则新值不可用,使用hugeCapacity函数对最小容量作判断。如果最小需求容量<max, 直接扩容maxsize。若大于,则设置成Integer.MAX, 今后不再扩容。

Fast-Fali机制:
ArrayList里面会维护一个modCount属性值,标识修改状态。

在一个线程A使用迭代器遍历数组的时候,另一个线程B修改了数组结构时,当下一次A调用迭代器.next方法时的时候会抛出异常ConcurrentModificationException。

解决方法:

  1. 在涉及改变结构的地方直接加sychronized关键字来同步。
  2. 或则说使用CopyOnWriteArrayList
    思想: 读写分离。
    在写操作上加锁,通过复制一份新新数据来完成变更操作。
    在这个过程中,旧数据同时存在,可供其他线程读取。
    缺点: 内存占用(会存在两个对象)、数据一致性问题(在进行写的时候,写入的数据不能立马被其他线程读到)

序列化:
数组使用 transient 修饰。
不使用默认的序列化方法,defaultReadObject/ write
自己重写。是的只需要序列化/反序列化size大小数组而不是capacity大小的数组。

  • Vector

    数组实现、线程安全

  • LinkList

    链表实现。可用作队列、双向队列、栈。

栈方法: pop posh
队列方法: poll offer
双向队列方法: offerFirst offerLast pollFirst pollF=Last

3. Set

Se't
  • HashSet

    由HashTable实现,键值对的值为默认值

  • TreeSet

    排序二叉树实现。(注意实现Compareble接口和覆盖Compare函数)

  • LinkedHashMap

    基于LinkedHashTable实现

4. Map

  • HashMap

    数组+链表+红黑树实现

    不是线程安全 (synchronizedMap方法 或者使用ConcurrentHashMap)

    1. capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。
    2. loadFactor:负载因子,默认为 0.75。
    13/04/2018 Page 51 of 283
    3. threshold:扩容的阈值,等于 capacity * loadFactor
    4. 树化阈值 : 8
    5. 列化阈值 : 6
    6. 树化节点树阈值:64
    
  • ConcurrentHashMap

    ConcurrentHashMap 是一个 Segment 数组,Segment 通过继承
    ReentrantLock 来进行加锁。通过同时对不同segment操作进行并发。
    每个segment维护了一个撒列表。

2. List

  • ArrayList

    数组实现

  • Vector

    数组实现、线程安全

  • LinkList

    链表实现。可用作队列、双向队列、栈。

3. Set

  • HashSet

    由HashTable实现,键值对的值为默认值

  • TreeSet

    排序二叉树实现。(注意实现Compareble接口和覆盖Compare函数)

  • LinkedHashMap

    基于LinkedHashTable实现

4. Map

  • HashMap

    数组+链表+红黑树实现

    不是线程安全 (synchronizedMap方法 或者使用ConcurrentHashMap)

    1. capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。
    2. loadFactor:负载因子,默认为 0.75。
    13/04/2018 Page 51 of 283
    3. threshold:扩容的阈值,等于 capacity * loadFactor
    4. 树化阈值 : 8
    5. 列化阈值 : 6
    6. 树化节点树阈值:64
    
  • ConcurrentHashMap

    ConcurrentHashMap 是一个 Segment 数组,Segment 通过继承
    ReentrantLock 来进行加锁。通过同时对不同segment操作进行并发。
    每个segment维护了一个撒列表。
    要存取一个元素需要经过两次hash 。第一次hash定位到segment,第二次hash在散列表上定位到某一个桶。

    ConcurrentMap
  • LinkHashMap

    记录了插入顺序的hashMap , 可以使用Iterator遍历

相关文章

网友评论

      本文标题:Java Collection 集合

      本文链接:https://www.haomeiwen.com/subject/aklxxktx.html