Java容器简介-欢迎大佬指正

来源:互联网 发布:精选淘宝怎么卸载 编辑:程序博客网 时间:2024/05/21 10:15

Java容器简介

描述顺序按版本来,如有遗漏,欢迎补充

使用到的数据结构

  1. 数组
  2. 链表
  3. 哈希表
  4. Map
  5. 红黑树
  6. 跳表

如果对以上数据结构不了解,建议翻看《数据结构》,都是基础知识点,学完之后,再看容器,就会感觉一目了然。
建议把二叉搜索树的整个系列都学习下,包括B+, B-,B*, AVL,红黑树。(虽然我看完忘的干干净净,但我觉得可以影响你的思考方式)

依赖的技术

  1. CAS(Compare and Swap) 如果与预期值相同,那么就交换,否则什么都不干。Java中的主要函数有:
    • UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
    • UNSAFE.putObject(this, itemOffset, item);
  2. volatile 不使用CPU缓存。
  3. AQS(AbstractQueuedSynchronized) 基于前面两种技术,主要用于加锁,例如’ReentrantLock`

这里简单描述,细节自行网上查找,每一个都是一个长篇文章。

Java 1.0

  1. Vector
  2. HashTable

已不推荐使用,记住是线程安全,效率低下即可。

Java 1.2

由于线程安全容器的效率低下,所以推出线程不安全,但效率高的容器,同步由用户控制。

  1. ArrayList 使用数据结构数组,有自动扩容的功能。
  2. LinkedList 使用数据结构链表,是一个双向链表,所以拥有队列和栈的功能
  3. HashMap 使用数据结构哈希表,要点是如何取哈希值,哈希冲突如何解决。

    • This map usually acts as a binned (bucketed) hash table, but
    • when bins get too large, they are transformed into bins of
    • TreeNodes, each structured similarly to those in
    • java.util.TreeMap
      未细看源码,我的理解是,有哈希冲突时,数据放在一个桶里,当这个桶过大时,将其转化为类似TreeMap的树。
  4. TreeMap 使用数据结构红黑树,由于能根据大小保持顺序,所以key需要继承自Comparable或者创建时提供Comparator

  5. LinkedHashMap 继承自HashMap,通用实现LinkedHashIterator等内部类,拥有了按插入顺序访问和LRU功能。
  6. HashSet 使用HashMap实现(组合形式,非继承),所有的valueprivate static final Object PRESENT = new Object();
  7. TreeSet 默认使用TreeMap实现,创建时,也可以指定实现NavigableMap接口的类。同样value也为PRESENT

Java 1.4

  1. LinkedHashSet 继承自HashSet,好像没有添加什么新功能,源码里基本都是构造函数?_?。

Java 1.5

在1.5版本里,推出线程安全,阻塞的容器(Blocking系列),使用1.5中的新锁。还有线程安全,非阻塞容器(Concurrent系列),使用CAS技术。分别对应于悲观锁和乐观锁思想。

  1. PriorityQueue 优先队列,使用了数据结构(非内存中的堆)
  2. ArrayBlockingQueue 使用数据结构数组,固定大小,线程安全,循环使用,不存在移动元素的情况,修改时,使用ReentrantLock进行加锁。
  3. LinkedBlockingQueue 使用数据结构单向链表,使用双锁队列算法,固定大小,线程安全。offertake使用不同的锁。使用到ReetrantLockCondition
  4. LinkedBlockingDeque 使用数据结构双向链表,固定大小,线程安全。单锁,使用ReentrantLock加锁。
  5. PriorityBlockingQueue 使用数据结构,固定大小,线程安全。单锁,使用ReentrantLock加锁。
  6. ConcurrentLinkedQueue 使用数据结构链表,应该是基于这篇论文《Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms》修改而来。依赖CAS,线程安全。
  7. ConcurrentHashMap 使用数据结构哈希表,依赖CAS,线程安全。有点不同的时,发生冲突时,使用synchronized(f)同步代码块,估计是树的调整比较麻烦。

Java 1.6

1.5中并没有提供TreeMap对应的并发版本,如果像ConcurrentHashMap一样,直接同步整个代码块,还不如将这个操作交给用户。
红黑树在并发中,有一个问题,发生变动时,需要修改的值较多,情况也变多。用无锁设计,情况将变的复杂起来。跳表功能与红黑树相似,修改相对较少,方便实现无锁设计(源码中的不同情况还是有点多…),跳表存在的问题是,有多级索引,占用空间过多(空间换时间)。
1. ConcurrentSkipListMap 使用数据结构跳表,依赖CAS,线程安全。
2. ConcurrentSkipListSet 跟之前一样Set又使用对应版本的Map。默认使用ConcurrentSkipListMap或者指定实现ConcurrentNavigableMap接口的类。线程安全。

Java 1.7

  1. ConcurrentLinkedDeque 使用数据结构双向链表,与ConcurrentLinkedQueue类似。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 潍坊市住房公积金管理中心 阜阳市住房公积金查询 赣州住房公积金 太原住房公积金查询个人账户 郑州市住房公积金查询 杭州住房公积金管理中心 乐山市住房公积金管理中心 长春住房公积金查询 青海住房公积金查询网 住房公积金管理 宜春住房公积金查询 惠州市住房公积金管理中心 玉林住房公积金查询个人账户 枣庄住房公积金查询 六安住房公积金管理中心 厦门住房公积金查询 渭南市住房公积金个人查询 乐山住房公积金查询个人账户 深圳住房公积金电话多少 南宁住房公积金查询 住房公积金查询电话12329 济宁住房公积金管理中心 宁德市住房公积金查询窗口 兰州市住房公积金查询系统 孝感住房公积金查询 兰州住房公积金查询 滁州住房公积金 上海住房公积金网 个人住房公积金查询网 省住房公积金管理中心 韶关市住房公积金管理中心 长沙住房公积金管理中心 赣州住房公积金查询 西安住房公积金查询 南充住房公积金查询 北京住房公积金查询 南宁住房公积金查询个人账户 东莞住房公积金 资阳住房公积金查询 西安市住房公积金查询系统 郑州住房公积金查询