精华内容
下载资源
问答
  • Java 集合源码

    2020-05-23 16:19:39
    Java集合源码剖析 1.Java集合框架 Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合框架下大致可以分为如下五个部分:List列表、Set集合、Map...

    Java集合源码剖析

    1.Java集合框架

    Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合框架下大致可以分为如下五个部分:List列表、Set集合、Map映射、迭代器(Iterator、Enumeration)、工具类(Arrays、Collections)

        Java集合类的整体框架如下:

    https://img-blog.csdn.net/20140628144205625

     

        从上图中可以看出,集合类主要分为两大类:Collection和Map

     

        Collection是List、Set等集合高度抽象出来的接口,它包含了这些集合的基本操作,它主要又分为两大部分:List和Set。

     

        List接口通常表示一个列表(数组、队列、链表、栈等),其中的元素可以重复,常用实现类为ArrayList和LinkedList,另外还有不常用的Vector。另外,LinkedList还是实现了Queue接口,因此也可以作为队列使用。

     

        Set接口通常表示一个集合,其中的元素不允许重复(通过hashcode和equals函数保证),常用实现类有HashSet和TreeSetHashSet是通过Map中的HashMap实现的,而TreeSet是通过Map中的TreeMap实现的。另外,TreeSet还实现了SortedSet接口,因此是有序的集合(集合中的元素要实现Comparable接口,并覆写Compartor函数才行)。

     

        我们看到,抽象类AbstractCollection、AbstractList和AbstractSet分别实现了Collection、List和Set接口,这就是在Java集合框架中用的很多的适配器设计模式,用这些抽象类去实现接口,在抽象类中实现接口中的若干或全部方法,这样下面的一些类只需直接继承该抽象类,并实现自己需要的方法即可,而不用实现接口中的全部抽象方法。

     

        Map是一个映射接口,其中的每个元素都是一个key-value键值对,同样抽象类AbstractMap通过适配器模式实现了Map接口中的大部分函数,TreeMap、HashMap、WeakHashMap等实现类都通过继承AbstractMap来实现,另外,不常用的HashTable直接实现了Map接口,它和Vector都是JDK1.0就引入的集合类。

     

        Iterator是遍历集合的迭代器(不能遍历Map,只用来遍历Collection),Collection的实现类都实现了iterator()函数,它返回一个Iterator对象,用来遍历集合,ListIterator则专门用来遍历List。而Enumeration则是JDK1.0时引入的,作用与Iterator相同,但它的功能比Iterator要少,它只能再Hashtable、Vector和Stack中使用。

     

    Arrays和Collections是用来操作数组、集合的两个工具类,例如在ArrayList和Vector中大量调用了Arrays.Copyof()方法,而Collections中有很多静态方法可以返回各集合类的synchronized版本,即线程安全的版本,当然了,如果要用线程安全的结合类,首选Concurrent并发包下的对应的集合类。

     

    注:

    抽象类:

    通过abstract定义的方法是抽象方法,它只有定义,没有实现。抽象方法定义了子类必须实现的接口规范;

    定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法;

    如果不实现抽象方法,则该子类仍是一个抽象类;

    面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。

     

    transient

    java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。

    Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据 成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字 transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的

     

    Java集合源码剖析

    参考:https://blog.csdn.net/ns_code/article/details/35564663

     

     

     

    展开全文
  • Java集合源码剖析】Java集合框架

    千次阅读 2015-02-10 23:24:37
    Java集合源码

        Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合框架下大致可以分为如下五个部分:List列表、Set集合、Map映射、迭代器(Iterator、Enumeration)、工具类(Arrays、Collections)。

      Java集合类的整体框架如下:


    从上图中可以看出,集合类主要分为两大类:Collection和Map。

      Collection是List、Set等集合高度抽象出来的接口,它包含了这些集合的基本操作,它主要又分为两大部分:List和Set。

        List接口通常表示一个列表(数组、队列、链表、栈等),其中的元素可以重复,常用实现类为ArrayList和LinkedList,另外还有不常用的Vector。另外,LinkedList还是实现了Queue接口,因此也可以作为队列使用。

        Set接口通常表示一个集合,其中的元素不允许重复(通过hashcode和equals函数保证),常用实现类有HashSet和TreeSet,HashSet是通过Map中的HashMap实现的,而TreeSet是通过Map中的TreeMap实现的。另外,TreeSet还实现了SortedSet接口,因此是有序的集合(集合中的元素要实现Comparable接口,并覆写Compartor函数才行)。

        我们看到,抽象类AbstractCollection、AbstractList和AbstractSet分别实现了Collection、List和Set接口,这就是在Java集合框架中用的很多的适配器设计模式,用这些抽象类去实现接口,在抽象类中实现接口中的若干或全部方法,这样下面的一些类只需直接继承该抽象类,并实现自己需要的方法即可,而不用实现接口中的全部抽象方法。

        Map是一个映射接口,其中的每个元素都是一个key-value键值对,同样抽象类AbstractMap通过适配器模式实现了Map接口中的大部分函数,TreeMap、HashMap、WeakHashMap等实现类都通过继承AbstractMap来实现,另外,不常用的HashTable直接实现了Map接口,它和Vector都是JDK1.0就引入的集合类。

        Iterator是遍历集合的迭代器(不能遍历Map,只用来遍历Collection),Collection的实现类都实现了iterator()函数,它返回一个Iterator对象,用来遍历集合,ListIterator则专门用来遍历List。而Enumeration则是JDK1.0时引入的,作用与Iterator相同,但它的功能比Iterator要少,它只能再Hashtable、Vector和Stack中使用。

        Arrays和Collections是用来操作数组、集合的两个工具类,例如在ArrayList和Vector中大量调用了Arrays.Copyof()方法,而Collections中有很多静态方法可以返回各集合类的synchronized版本,即线程安全的版本,当然了,如果要用线程安全的结合类,首选Concurrent并发包下的对应的集合类。

             Java的集合大致可分为:SetListMap三种体系:

           Set代表无序、不可重复的集合;

           List代表有序、重复的集合;

           而Map则代表具有映射关系的集合。

          从JDK1.5以后,Java集合又增加了Queue体系集合,代表一种队列集合实现

    Java的集合类主要由两个接口派生而出:Collection和Map




    Set接口

    Set集合是不允许包含相同的元素的,是根据equals()来判断是否是同一对象

    HashSet是Set接口的典型实现,HashSet是按Hash算法来存储集合中的元素的,因此具有很好的存取和查找性能。

    HashSet有以下特点:

    不能保证元素的排序顺序

    不是同步

    集合元素值可以为null

    存入一个新元素,要判断是否已经存在的标准是两个对象通过equals()比较相等,并且两个对象的hashCode()方法返回值也相等。如果需要某个类的对象保存到HashSet集合中,重写这个类的equals方法和hashCode方法时,应该尽量保证两个对象通过equals比较结果跟hashCode返回结果一致(hashCode的对象的放置位置,而equals是判断两个对象是否的同一个,如果hashCode一样,但是equals不同,则会出现两个不同的元素放同一个位置,反过来的情况更加糟糕)

    LinkedHashSet则是继承了HashSet的子类,使用的是链表结构。也是根据hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,但是由于要维护元素的插入顺序,故性能略低于HashSet的性能

    TreeSet采用红黑树的数据结构对元素进行排序。默认情况下是升序的自然排序,也可以定制排序。当加入一个对象进TreeSet集合中时,TreeSet调用该对象的compareTo(Object obj)方法与容器中的其他对象比较大小,然后根据红黑树算法决定它的存储位置。

    EnumSet的集合元素也是有序的,是以枚举值在Enum类内的定义顺序来决定集合元素的顺序。在内部以位向量的形式存储所以EnumSet对象占用内存很小,而且运行效率很好。尤其是进行批量操作时。

    总结:

    如何选择HashSet和TreeSet,HashSet的性能总是比TreeSet好(特别是最常用的添加、查询元素等操作),因为TreeSet需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的Set时,才应该使用TreeSet,否则都应该使用HashSet。而HashSet的子类LinkedHashSet,对普通的插入、删除操作,LinkedHashSet比HashSet要稍微慢一点(维护链表开销),但是遍历会更快

    EnumSet是所有Set实现类中性能最好的。

    以上都不是线程安全的,如果多线程访问,可以用Collections工具类的synchronizedSortedSet方法来“包装”该Set集合。此操作最好在创建时进行,如

    [java] view plaincopy
    1. SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));  

    List接口

    List集合代表一个有序集合,默认是按照元素的添加顺序设置元素的索引

    ArrayList、Vector和LinkedList

    (1)ArrayList:实现:默认创建一个大小为10Object数组,每次add的时候,有一个minCapacity变量,每次都加1,然后和Object数组的大小比较,如果大于则将当前的Object数组值赋值给一个数组对象,接着产生一个新的数组的容量值(此值计算方法为当前数组大小*1.5+1,如果还小于minCapacity那么就以minCapacity作为新的容量值),得到这个容量值后调用Arrays.copyOf来生成新的数组对象,如果想调整增加策略,可继承ArrayList,并覆盖ensureCapacity方法

    补充:

    其中的Arrays.coryOf是这样实现的,首先创建一个新的数组,该数组对象的类型和之前ArrayList中元素的类型一致的,在这里JDK做了小优化,在创建完新的数组之后调用System.arraycopy通过native方法将之前数组中的对象复制到新的数组中

    ArrayList还提供了add(int,E)方法,跟add()方法的区别是将当前数组对象进行一次复制,即将目前的index及其后的数据往后挪动一位,故要多付出一次复制数组的代价

    (2)Vector线程安全的,和ArrayList一样是采用Object数组实现的,Vector()调用也创建一个大小为10Object数组,并将capacityIncrement设置为0,但是add的时候是不一样的,Vector的add方法加了synchronized关键字,而且当容量不够时进行扩容的策略不一样,Vector的策略是:如果容量不够,那么如果capcacityIncrement大于0,则将Object数组的大小扩为现有size+capcacityIncrement,如果capcacityIncrement小于0,则Object数组的大小扩为现有size的两倍

    (3)LinkedList是基于双向链表机制,add是使用头插法.

        LinkedList:链表实现, 增删快, 查找慢
       由于LinkedList:在内存中的地址不连续,需要让上一个元素记住下一个元素.所以每个元素中保存的有下一个元素的位置.虽然也有角标,但是查找的时候,需要从头往下找,显然是没有数组查找快的.但是,链表在插入新元素的时候,只需要让前一个元素记住新元素,让新元素记住下一个元素就可以了.所以插入很快.由于链表实现, 增加时只要让前一个元素记住自己就可以, 删除时让前一个元素记住后一个元素, 后一个元素记住前一个元素. 这样的增删效率较高。但查询时需要一个一个的遍历, 所以效率较低。

    Map接口:

    Map是映射,跟前面的Set和List有本质的区别。
    散列图HashMap,

    链式散列图LinkedHashMap,

    树形图TreeHashMap是映射的3种实现,

    从名字上来说,有了上述Set的3种实现的分析,这个也是类似的。
    HashMap:效率高
    LikedHashMap:按照添加顺序存储,可以按添加顺序取出
    TreeHashMap:排序性





    展开全文
  • Java集合源码全面分析

    2020-09-02 02:28:26
    下面小编就为大家带来一篇Java集合源码全面分析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Java集合源码剖析-Java集合框架

    千次阅读 2017-12-31 22:14:21
    Hi大家好,我是清和二七,今天我们来聊聊《Java集合源码剖析-Java集合框架》 一.层次关系 Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合...

    Hi 大家好,我是清和二七,今天我们来聊聊《Java集合源码剖析-Java集合框架》

    一.层次关系 

            Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合框架下大致可以分为如下五个部分:List列表、Set集合、Map映射、迭代器(Iterator、Enumeration)、工具类(Arrays、Collections)

            Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。但是却让其被继承产生了两个接口,就是Set和List。Set中不能包含重复的元素。List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式。
            Map是Java.util包中的另一个接口,它和Collection接口没有关系,是相互独立的,但是都属于集合类的一部分。Map包含了key-value对。Map不能包含重复的key,但是可以包含相同的value。
            Iterator,所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方法:
            (1).hasNext()是否还有下一个元素。
            (2).next()返回下一个元素。
            (3).remove()删除当前元素

    二.整体介绍

            从图中可以看出,集合类主要分为两大类:Collection和Map,下面将对他们整体介绍:
            Collection是List、Set等集合高度抽象出来的接口,它包含了这些集合的基本操作,它主要又分为两大部分:List和Set。
            List接口通常表示一个列表(数组、队列、链表、栈等),其中的元素可以重复,常用实现类为ArrayList和LinkedList,另外还有不常用的Vector。另外,LinkedList还是实现了Queue接口,因此也可以作为队列使用。
           Set接口通常表示一个集合,其中的元素不允许重复(通过hashcode和equals函数保证),常用实现类有HashSet和TreeSet,HashSet是通过Map中的HashMap实现的,而TreeSet是通过Map中的TreeMap实现的。另外,TreeSet还实现了SortedSet接口,因此是有序的集合(集合中的元素要实现Comparable接口,并覆写Compartor函数才行)。
           可以看出,抽象类AbstractCollection、AbstractList和AbstractSet分别实现了Collection、List和Set接口,这就是在Java集合框架中用的很多的设计模式,用这些抽象类去实现接口,在抽象类中实现接口中的若干或全部方法,这样下面的一些类只需直接继承该抽象类,并实现自己需要的方法即可,而不用实现接口中的全部抽象方法。
           Map是一个映射接口,其中的每个元素都是一个key-value键值对,同样抽象类AbstractMap实现了Map接口中的大部分函数,TreeMap、HashMap、WeakHashMap等实现类都通过继承AbstractMap来实现,另外,不常用的HashTable直接实现了Map接口,它和Vector都是JDK1.0就引入的集合类。
          Iterator是遍历集合的迭代器(不能遍历Map,只用来遍历Collection),Collection的实现类都实现了iterator()函数,它返回一个Iterator对象,用来遍历集合,ListIterator则专门用来遍历List。而Enumeration则是JDK1.0时引入的,作用与Iterator相同,但它的功能比Iterator要少,它只能再Hashtable、Vector和Stack中使用。
          Arrays和Collections是用来操作数组、集合的两个工具类,例如在ArrayList和Vector中大量调用了Arrays.Copyof()方法,而Collections中有很多静态方法可以返回各集合类的synchronized版本,即线程安全的版本,当然了,如果要用线程安全的结合类,首选Concurrent并发包下的对应的集合类。

    微信公众号:

    图书推荐:数据结构与算法分析--Java语言描述

    链接:https://pan.baidu.com/s/1p_T8frGCmD33z4UM2cbRDg

    提取码:lprj

    Inner Peace

    展开全文
  • Java集合源码分析

    2019-08-02 10:06:05
  • Java集合源码剖析汇总

    千次阅读 2017-08-24 09:45:41
    JAVA集合源码剖析 Java集合之ArrayList源码剖析 Java集合之LinkedList源码剖析 Java集合之Vector源码剖析 Java集合之HashMap源码剖析 Java集合之Hashtable源码剖析 Java集合之TreeMap源码剖析 Java集合之Li
  • Java集合源码剖析

    2019-01-09 15:21:21
    Java集合源码剖析】https://blog.csdn.net/ns_code/article/category/2362915
  • Java集合源码解析

    2018-05-23 17:58:01
    看到了一个很不错的 Java 集合源码解析博客,记录一下: https://blog.csdn.net/u011240877/article/category/6447444
  • java集合源码解析
  • Java集合源码分析详解系列https://www.cnblogs.com/zhangyinhua/tag/Java%E9%9B%86%E5%90%88%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E8%AF%A6%E8%A7%A3%E7%B3%BB%E5%88%97/
  • java集合源码学习笔记
  • Java集合源码学习

    2019-02-26 21:31:25
    Java集合工具包位于java.util包下,包含了很多数据结构。如数组、链表、栈、队列、集合、哈希表等。 Java集合框架大致分为5个部分:List列表、Set集合、Map映射、迭代器(Iterator, Enumeration)、工具类(Arrays, ...
  • JAVA集合源码攻坚战(18)——AbstractQueue前言正文 前言 正文
  • notes:算法刷题指南,Java多线程与高并发,Java集合源码,Spring boot,Spring Cloud等笔记,子级学习笔记随后也会更新
  • Java集合源码实现四:LinkedHashMap(jdk1.8) Java集合源码实现四LinkedHashMapjdk18 类继承关系 什么是LinkedHashMap LinkedHashMap数据结构 源码分析 类继承实现 成员变量 LinkedHashMap中的链表节点 主要方法 构造...
  • Java集合源码实现五:HashSet(jdk1.8) Java集合源码实现五HashSetjdk18 类继承关系 什么是HashSet HashSet数据结构 源码分析 类继承实现 成员变量 主要方法 构造方法 添加元素 删除元素类继承关系:(*=>:接口实现...
  • Java集合源码实现一:ArrayList (jdk1.8) Java集合源码实现一ArrayList jdk18 类继承关系 什么是ArrayList 源码分析 类继承实现 成员变量 主要方法 构造方法 获取元素 添加元素 移除元素 Fail-Fast 机制 为什么要...
  • 1.概述collection框架是用于处理各种数据结构的,要根据各种数据结构的特点理解它它能够保存对象,并提供很多的操作去管理对象,当你面临下面的情况时,也许你应该考虑用集合类1、容器的长度是不确定的2、可以排序3、以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,248
精华内容 5,299
关键字:

java集合源码

java 订阅