博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java collection 集合源码分析(一)
阅读量:5796 次
发布时间:2019-06-18

本文共 6582 字,大约阅读时间需要 21 分钟。

hot3.png

collection 为java集合的接口,collection的接口继承Iterable

public interface Collection
 extends Iterable

没有自己在画类图了 找到网上有大哥画的关系图如下

145015_1Ex8_268957.jpg

上图中有个位置可能错了,AbstrctList应该继承自

public abstract class AbstractList
 extends AbstractCollection
 implements List

一、List(接口)

    1、ArrayList

        内部持有一个Object[] 数组     

 /**     * Default initial capacity.     */    private static final int DEFAULT_CAPACITY = 10;  //默认大小    /**     * Shared empty array instance used for empty instances.     */    private static final Object[] EMPTY_ELEMENTDATA = {}; //对象数组    /**     * The array buffer into which the elements of the ArrayList are stored.     * The capacity of the ArrayList is the length of this array buffer. Any     * empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded to     * DEFAULT_CAPACITY when the first element is added.     */    private transient Object[] elementData;    /**     * The size of the ArrayList (the number of elements it contains).     *     * @serial     */    private int size; //数组大小

        所有的操作基于这个数组进行组织,一般不轻易对这个数组进行遍历,一般多用system.arraycopy的方式进行操作,删除的动作有时候依赖与gc来回收,如下删除方法:

   /**     * Removes the element at the specified position in this list.     * Shifts any subsequent elements to the left (subtracts one from their     * indices).     *     * @param index the index of the element to be removed     * @return the element that was removed from the list     * @throws IndexOutOfBoundsException {@inheritDoc}     */    public E remove(int index) {        rangeCheck(index);        modCount++;        E oldValue = elementData(index);        int numMoved = size - index - 1;        if (numMoved > 0)            System.arraycopy(elementData, index+1, elementData, index,                             numMoved);  //通过副本的形式完成操作        elementData[--size] = null; // clear to let GC do its work        return oldValue;    }

    2、LinkedList

        LinkedList,内部持有一系列的Node ,node结构如下

private static class Node
 {        E item;        Node
 next;        Node
 prev;        Node(Node
 prev, E element, Node
 next) {            this.item = element;            this.next = next;            this.prev = prev;        }    }

    从上可以看出 node中 保存了前一个和后一个的节点信息,和数据,分为三部分

    对节点的管理如下:

    transient int size = 0; //有多少节点          /**     * Pointer to first node.      * Invariant: (first == null && last == null) ||      *            (first.prev == null && first.item != null)      */     transient Node
 first; //头节点      /**      * Pointer to last node.      * Invariant: (first == null && last == null) ||      *            (last.next == null && last.item != null)      */     transient Node
 last; //尾节点

    所有的操作围绕对节点的增删来操作,看一个添加所有的操作

    /**       * Constructs a list containing the elements of the specified     * collection, in the order they are returned by the collection's     * iterator.     *     * @param  c the collection whose elements are to be placed into this list     * @throws NullPointerException if the specified collection is null     */    public LinkedList(Collection
 c) {         this();        addAll(c);    }   //构造            /**     * Appends all of the elements in the specified collection to the end of     * this list, in the order that they are returned by the specified     * collection's iterator.  The behavior of this operation is undefined if     * the specified collection is modified while the operation is in     * progress.  (Note that this will occur if the specified collection is     * this list, and it's nonempty.)     *     * @param c collection containing elements to be added to this list     * @return {@code true} if this list changed as a result of the call     * @throws NullPointerException if the specified collection is null     */    public boolean addAll(Collection
 c) {        return addAll(size, c);    }           /**     * Inserts all of the elements in the specified collection into this     * list, starting at the specified position.  Shifts the element     * currently at that position (if any) and any subsequent elements to     * the right (increases their indices).  The new elements will appear     * in the list in the order that they are returned by the     * specified collection's iterator.     *     * @param index index at which to insert the first element     *              from the specified collection     * @param c collection containing elements to be added to this list     * @return {@code true} if this list changed as a result of the call     * @throws IndexOutOfBoundsException {@inheritDoc}     * @throws NullPointerException if the specified collection is null     */    public boolean addAll(int index, Collection
 c) {        checkPositionIndex(index);        Object[] a = c.toArray();        int numNew = a.length;        if (numNew == 0)            return false;        Node
 pred, succ;        if (index == size) {            succ = null;            pred = last;        } else {            succ = node(index);  //返回索引处的特征节点,这个方法会优化从头部还是从尾部查找的过程具体参看源码            pred = succ.prev;        }        for (Object o : a) {            @SuppressWarnings("unchecked") E e = (E) o;            Node
 newNode = new Node<>(pred, e, null);            if (pred == null)                first = newNode;            else                pred.next = newNode;            pred = newNode;        }  //添加过程        if (succ == null) {            last = pred;        } else {            pred.next = succ;            succ.prev = pred;        }        size += numNew;        modCount++;        return true;    }

    3、Vector

        arrayList类似,源码多处增加了synchronized 关键字,线程安全

二、Set(接口)

    1、HashSet

        HashSet内部实际持有的是一个hashmap对象,所有的操作都是通过操作map实现,这个map是无值,只有key,

        内部的一个hashmap对象

    private transient HashMap
 map;    public HashSet(Collection
 c) {        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); //开辟一个比原有集合4/3大小的集合。默认16        addAll(c);    }

        看一个获取迭代器的方法

    /**     * Returns an iterator over the elements in this set.  The elements     * are returned in no particular order.     *     * @return an Iterator over the elements in this set     * @see ConcurrentModificationException     */    public Iterator
 iterator() {        return map.keySet().iterator();    }

    2、TreeSet

        TreeSet也是通过map来实现

private transient NavigableMap
 m; //这里使用的是NavigableMap,这个继承自SortedMap接口 since1.6之后

        其他的方法都是调用map的实现,在map中在看

Map 单立一章来写把

ps:以上的源码来自openjdk7u75-b13版本

转载于:https://my.oschina.net/u/268957/blog/499587

你可能感兴趣的文章
Java生成GUID的方法
查看>>
Webpack入门教程三十
查看>>
EAServer 6.1 .NET Client Support
查看>>
锐捷交换机密码恢复(1)
查看>>
Kali linux virtualbox rc=1908 错误解决办法
查看>>
Erlang学习总结之Erlang语法中的逗号(,)、分号(;),句号(.)的正确用法...
查看>>
linux软件包管理之三(源代码安装)
查看>>
数据库三范式是什么?
查看>>
[转载]设置Ubuntu自动连接无线,无须再输入密钥环和无线密码
查看>>
SQL Server 2014 许可证(三)各版本的许可证
查看>>
九叔Xen App测试报告
查看>>
Apache配置
查看>>
Ext gridPanel 单元格数据的渲染
查看>>
Android SDK 的下载代理
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
LNMP一键安装
查看>>
SQL Server数据库概述
查看>>
Linux 目录结构及内容详解
查看>>