`
pengzhoushuo
  • 浏览: 12864 次
  • 性别: 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方法可以用数组进行操作或查询。
分享到:
评论

相关推荐

    jdk源码(完整版)

    总之,JDK源码的完整版为Java开发者提供了一个宝贵的资源,能够深入理解Java平台的运作机制,从而提升编程技能和解决问题的能力。通过研究`javax`、`com`、`org`、`jdk`、`java`、`launcher`、`sun`等包下的源代码,...

    java JDK 源码

    通过研究Java JDK源码,开发者能够深入了解类库的设计模式、线程管理、内存分配、垃圾收集、异常处理等核心机制,从而提升编程技巧,编写出更高效、稳定和可维护的Java应用。同时,源码也是学习Java规范和最佳实践的...

    jdk源码 jdk源码

    Java Development Kit (JDK) 源码是学习和理解Java平台核心机制的关键资源。...通过深入阅读JDK源码,开发者不仅可以增强对Java语言特性的理解,还能提高解决实际问题的能力,这对于成为一名优秀的Java开发者至关重要。

    java jdk1.8 源码

    Java JDK 1.8源码是Java开发工具包的一个重要组成部分,它包含了Java语言的核心类库,对于深入理解和学习Java编程语言以及其运行机制至关重要。源码提供了对JVM(Java虚拟机)、类库和API的直接洞察,帮助开发者探究...

    javaJDK1.8 源码(.java文件) 新手教程资料

    2. **集合框架**:Java集合框架是Java程序设计中的核心部分。源码中,我们可以看到`List`、`Set`、`Map`等接口以及它们的实现类的实现细节,如`ArrayList`和`LinkedList`的区别,`HashMap`和`TreeMap`的内部数据结构...

    jdk 源码 完整版

    包含了语言的关键类库,如`java.lang`中的Object、String、Integer等基本类型和系统类,`java.io`中的输入/输出流操作,`java.util`中的集合框架,以及`java.awt`和`javax.swing`用于图形用户界面的设计。...

    JDK 源码 java

    深入研究JDK源码对于理解Java的工作原理至关重要,特别是对于那些寻求提升技术水平、进行底层优化或参与开源项目的人来说。 在Java的源码中,我们可以找到许多关键组件,如: 1. **javax**:这个包包含了Java标准...

    JDK8完整源码包

    这份"JDK8完整源码包"包含了JavaFX、Sun私有实现等核心组件的源代码,为深入理解Java平台的工作原理提供了宝贵的资源。 首先,JavaFX是Java的图形用户界面(GUI)库,自JDK 8起成为标准部分,它提供了丰富的UI组件...

    java JDK1.6.0源码 源代码

    - 分析JDK源码有助于理解类库内部的工作机制,比如垃圾收集器的工作方式、集合框架的设计原理、网络通信的实现细节等。 - 通过查看源码,可以学习到如何在实际项目中应用设计模式,提高代码质量和可维护性。 - 对...

    java,jdk源码

    除此之外,JDK源码还包含了大量的Java标准库(Java Standard Library),这些库提供了丰富的功能,如集合框架、多线程、网络编程、I/O操作等。例如,`java.util`包下的ArrayList、HashMap等集合类的实现,展示了如何...

    java源码之jdk源码

    Java源码是深入理解Java平台工作原理的关键,JDK源码包含了Java开发工具集的核心实现。通过对JDK源码的学习,开发者可以了解到Java语言的底层机制,提升编程技能,更好地解决实际问题。以下将详细探讨Java源代码和...

    jdk1.6 源码jdk1.6 源码

    2. **类库**:JDK 1.6包含了大量的预定义类库,如java.lang、java.io、java.util等,这些源码揭示了标准API的实现细节。例如,`java.util.concurrent`包在并发编程中提供了高级工具,如线程池、锁和并发集合,通过...

    Java jdk源码

    Java JDK源码是Java开发人员深入...总的来说,研究Java JDK源码是一次深入学习之旅,它可以帮助开发者从底层理解Java的工作方式,提升编程技艺,解决复杂问题,并且更好地利用Java的特性来设计高效、可靠的软件系统。

    java jdk 1.6 1.7 1.8 源码

    首先,JDK 1.6源码包含了Java 6版本的所有核心类库,如基础集合框架、I/O流、多线程、网络编程、反射、异常处理等。这个版本引入了许多新特性,比如改进的垃圾回收算法、Swing组件的增强以及对XML处理的加强。通过...

    jdk源码包jdk-11.0.1

    【描述】"jdk源码包"意味着这个压缩文件包含了Java开发工具集(JDK)的所有源代码。通过分析这些源码,开发者可以学习到Java语言的内部工作原理,包括类库、虚拟机(JVM)以及各种工具的实现细节。 【标签】"jdk"和...

    java_jdk8源码

    对于任何希望提升Java技术水平,特别是对性能优化、并发编程或者想要成为一名更高级的Java开发者的人来说,研究JDK源码是不可或缺的一环。在这里,我们将探讨一些关键的知识点,帮助你更好地理解和利用这份宝贵的...

    java jdk1.7源码包,用于centos7使用jdk1.7编译openjdk1.8的 1.7版本

    在开发和维护Java应用程序时,理解并熟悉JDK源码对于开发者来说至关重要,特别是当需要对源代码进行调试、优化或扩展时。 首先,让我们深入了解一下JDK 1.7的关键特性: 1. **Diamond操作符**:在JDK 7中引入了...

    jdk源码的另一部分

    2. **集合框架**:`java.util`包是Java集合框架的入口,包括`List`、`Set`、`Map`接口及其实现,如`ArrayList`、`HashSet`、`HashMap`。这些容器允许我们存储、管理和操作对象。 3. **I/O流**:`java.io`包提供了...

    JAVA JDK实例开发宝典源码

    4. **集合框架**:Java集合框架是处理数据的重要工具,包括ArrayList、LinkedList、HashSet、HashMap等。源码会包含如何创建、添加、删除元素,以及遍历和操作集合的各种方法。 5. **多线程编程**:Java提供了丰富...

    JDK源码,整合所有内容

    - **对象和类**:Java是面向对象的语言,类是其核心,JDK源码中包含了大量内置类,如`Object`、`String`、`Exception`等。 - **接口与多态**:`interface`定义了类的行为规范,多态性是Java的一大特性,体现在方法...

Global site tag (gtag.js) - Google Analytics