`
pengzhoushuo
  • 浏览: 12506 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

JDK源码研究之2Java集合设计

阅读更多
集合接口体系:

Iterable
           ---->Collection
                          ---->List
                           ---->Set  
                                  ---->SortedSet
                                 ---->NavigableSet(6.0)
                          ---->Queue
                                   ---->Deque

Map
           ---->SortedMap
                    ---->NavigableMap(6.0)

集合类体系:

Collection
          ---->AbstractCollection
  
               ---->AbstractList(implements List)
                        ---->AbstractSequentialList
                                  ---->LinkedList
                        ---->ArrayList
               ---->AbstractQueue(implements Queue)
                     ---->PriorityQueue   
            ---->AbstractSet(implements Set)
                       ---->EnumSet
                      ---->HashSet
                     ---->TreeSet
             ---->ArrayDeque(implements Deque)

Map
  ---->AbstractMap
            ---->EnumMap
            ---->HashMap
           ---->IdentityHashMap
          ---->TreeMap
           ---->WeakHashMap



1、Iterable里面只有一个方法Iterator<T> iterator(),该方法返回集合内部元素的叠代.在AbstractCollection 中就可以看出这种设计的好处了,在AbstractCollection中有两个未实现的方法iterator()跟size(),还有一个特殊的方法是add(E e),总会抛出UnsupportedOperationException。
   其他Collection接口的方法实现均可以通过前两个方法来实现。当需要一个不可修改的集合时,只需要在子类实现iterator()与size()方法即可,如果还想可以修改内部的元素,在子类还需实现add(E e)方法。

2、与AbstractCollection类似,AbstractList也最大程度实现了List接口的方法,内部类里面还默认实现了一个Iterator,留下了add(int,E),remove(int i),set(int,E),get(int i),size()方法给子类实现。AbstractQueue、AbstractSet同理。
  
3、Map与Collection是平行的,并没有相互继承,从技术上来说可以把(key,value)作为一个Entity看待,从而让Map继承Collection,但这样做会大大增加复杂度甚至可能导致接口的污染。Map属于集合,但不继承Collection,这种以引用代替继承的做法值得推荐,也告诉了我们一个道理:不要为了继承而继承!

4、List与Set的区别是Set中的元素不允许重复,而Map中的Key默认就是不允许重复的,事实上JDK中的Set就是通过引用Map来实现的,set元素作为map的key,value是一个默认的object。

5、ArrayDeque是一个双向队列,内部是一个由一个数组和两个指针组成的循环数组组成。

6、ArrayList里面也是一个数组,在大学数据结构中也学过,由于位置是连续的,get(i)这种随机操作速度快,而remove(i)因为删除之后要把i之后的元素向前移,速度慢。

7、在JDK1.0时候有一个接口Dictionary现在已经被Map代替了,它的实现类HashTable也被HashMap代替了,不过HashTable的每个方法都是有synchronized关键字的。

8、EnumMap以Enum作为Key,由于Enum内部维护了枚举成员的位置(从0开始),所以get(key)类似的操作定位相当快,比HashMap要快。

9、EnumSet是一个抽象类,提供了N个静态方法来创建具有多个Enum的set。64个以内元素个数时用RegularEnumSet,64个以上时用JumboEnumSet

10、HashMap,这个最经常使用的类,很多人还不了解其内部实现。其实他内部也是维护了一个Entity数组,把key做hash后再经过余位等运算便可以找到其在数组中的位置。当元素个数 > 加载因子*容量 时会将容量增加一倍,如果HashMap较大,复制操作也颇为耗时,所以对于元素大小范围确定的HashMap,在new时就提供其初始容量是一个明智的选择。

11、HashSet,内部其实就维护着一个HashSet,LinkedHashSet内部维护的是LinkedHashMap。

12、IdentityHashMap,把equal换成了=,内部的rehash算法颇复杂。

13、Iterator里面三个方法hasNext(),next(),remove(),代替了Enumeration的很长的方法,ListIterator是一个可以双向移动的Iterator

14、LinkedHashMap,链式结构的HashMap,里面是一个双向链表,做put或get操作时先把已有的元素删除,再把新元素加到头里。这样近期最活跃的元素就处在顶端了,所以能用来做LRU实现。

15、LinkedList,List的链式实现,它的特性决定能作为堆栈、队列、双端队列使用。

16 NavigableSet接口扩展了SortedSet & NavigableMap接口扩展了SortedMap,提供了更细致的“子集合”方法。

17、Stack直接继承自废弃类Vector,Vector里每一个方法均为sychronized的,建议继承ArrayList实现一个非同步的Stack以得到在单线程下效率更高的堆栈实现。

18、TreeMap与TreeSet里面维护的是一个堆数据结构,大顶堆或小顶堆实现有序结构。

19、WeakHashMap,如果key为软引用,那么其value是会丢失的,GC会自动回收。

20、Collections里面包含N个static方法可以对collection操作(包括Map)或查询(如二分查询etc.),里面有或干个包装器如synchronizedMap返回Map的包装器,返回同步实现。

21、其实数组是一个最原始的集合,Arrays类提供了N个static方法可以用数组进行操作或查询。
分享到:
评论

相关推荐

    Java集合类源码(摘自jr源码)

    摘自jr源码,是jdk的源码,有需要研究java集合类的可以下载

    java 集合源码学习,jdk1.8集合类所有的源码讲解

    java 集合源码学习

    java集合源码-jdk-collection:java集合类源码阅读

    集合源码 JDK-Collection集合入门 总的list和set类结构大致如下所示 Map不继承Collection,其结构如下 首先介绍下迭代器的概念 迭代器无非是一个接口,假设我们有一个数组,如果我们要实现迭代器,只需要根据该接口定义...

    jdk源码阅读.zip

    jdk1.8源码(包含1.8API),想提升JAVA技术,阅读JDK源码必不可少,里面的IO框架,集合框架,并发框架等经典源码都值得一读!

    jdk源码合集 1.7-1.9

    JDK源码【1.7/1.8/1.9】,方便查看代码; Java官方demo。 JDK源码【1.9】,模块化系统、JShell、集合工厂方法等

    java面向对象编程源码

    全书内容包括面向对象的编程思想、Java语言的基础知识、异常处理、类与对象的生命周期、多线程、Java集合、输入/输出和GUI编程等。其最大特色是以六条主线贯穿全书:面向对象编程思想、Java语言的语法、Java虚拟机...

    清华妹子的Java仓库(进阶学习路线)

    本仓库记录了我的Java学习进阶之路,涵盖了Java基础、JDK源码、JVM中的重要知识,附有代码和博客讲解,旨在提供一个Java在线共享学习平台,帮助更多的Java学习入门者进阶。 Java学习 本仓库记录了我的Java学习进阶...

    计算机后端-Java-Java核心基础-第25章 集合02 12. HashMap在JDK8中的源码分析.avi

    计算机后端-Java-Java核心基础-第25章 集合02 12. HashMap在JDK8中的源码分析.avi

    计算机后端-Java-Java核心基础-第25章 集合02 11. HashMap在JDK7中的源码分析.avi

    计算机后端-Java-Java核心基础-第25章 集合02 11. HashMap在JDK7中的源码分析.avi

    java8集合源码-Java:Java

    java8集合源码核心-Java java中堆和栈的区别? Java 8 发布的重要特性是什么? 什么是 JVM,它是否独立于平台? 什么是 JIT 编译器? Java中的类加载器是什么? 什么是不同类型的类加载器? Java Compiler 存储在 ...

    java开发jwt认证 令牌,jwt.jar包 jwt 实现token认证,支持jdk1.7版本 java令牌

    jwt.jar包 jwt所需jar包集合 使用commons-codec.jar + java-jwt.jar进行token认证,支持jdk1.7及以上版本,目前大多数jwt支持至少需要1.8及以上,资源不好找,且行且珍惜。 如果需要源码以及功能实现方式,请联系...

    JDK源码选读.pdf

    学Java的最佳途径之一就是坚持阅读它的源码,不是JRE的源码,那些你读了也吸收不了多少,而是常用类库的源码,就是我们常用的那些类,尤其是集合类。源码里蕴含着丰富的代码技巧,设计模式,编程风格,绝对是大师级...

    jdk1.6 windows 64位

    组成 JDK包含的基本组件包括: ·javac – 编译器,将源程序转成字节码 ·jar – 打包工具,将相关的类文件打包成一个文件 ·javadoc – 文档生成器,从源码注释中提取文档 ·jdb – debugger,查错工具 ·java –...

    尚硅谷_宋红康_第11章_Java集合.pdf

    ·基于JDK 11,将Java8、Java9、Java10、Java11新特性一网打尽 ·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的...

    Java JDK实例宝典

    第1章 Java基础 1.1 转换基本数据类型 1.2 Java的运算符 1.3 控制程序的流程 1.4 计算阶乘 1.5 实现命令行程序 第2章 Java面向对象程序设计 2. 1 复数类 2. 2 equals.chashCode...

    尚硅谷-深入Java集合4:LinkedHashMap的实现原理.pdf

    ·基于JDK 11,将Java8、Java9、Java10、Java11新特性一网打尽 ·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的...

    尚硅谷_宋红康_第11章节练习_Java集合.doc

    ·基于JDK 11,将Java8、Java9、Java10、Java11新特性一网打尽 ·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的...

    java8集合源码分析-Awesome-Java:真棒-Java

    Java语言和JDK源码 Java语言的基础理论知识 并发编程 Java并发编程相关的内容,并发包源码分析等 集合框架 Java集合框架,并发容器,同步容器等 IO框架 Java基础字节流 字符流 NIO等 Java8 Java8语言的行为参数化和...

    Java Core源码

    无论是Java初学者还是从事Java开发的经验者,Java Core源码都是必学的,尤其要对集合框架collection、Java并发控制、Java I/O等的源码实现深入学习,有很多优秀思想,同时也是大企业面试中最常出考点的地方。

    java8集合源码-java:JDK8新特性

    java8集合源码定时器和定时器任务 定时器是线程调度任务以在后台线程中执行的工具。 任务可以安排为一次性执行,或定期重复执行。 与每个 Timer 对象相对应的是一个单独的后台线程,用于按顺序执行所有计时器的任务...

Global site tag (gtag.js) - Google Analytics