`
wu.sheng
  • 浏览: 65813 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jdk6标准类库源码解读 之 数据结构 (一) ArrayList<E>

阅读更多

最近受到一次面试的启发,开始看jdk6的标准源码,在这里记录下自己看的过程中的体会,和大家分享。

从最常用的数据结构开始 

     ArrayList<E>

  • 此对象的存储采用的是标准的Object数组(elementData)进行存储,同时使用一个整形记录数组(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.
     */
    private transient Object[] elementData;

    /**
     * The size of the ArrayList (the number of elements it contains).
     *
     * @serial
     */
    private int size;
  • 对象默认初始化存储容量为10
    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
	this(10);
    }
  •  对象中的存储数组elementData会随着需要存储数据的增加而扩大。在调用对象的add方法时,arraylist会首先判断容量是否足够,不够时,采用newCapacity = (oldCapacity * 3)/2 + 1的策略,进行扩充。此策略只计算一次,如果扔不足够,则直接按照新的容量进行扩展。
    public boolean add(E e) {
        ensureCapacity(size + 1); // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

    public void ensureCapacity(int minCapacity) {
        modCount++;
        int oldCapacity = elementData.length;
        if (minCapacity > oldCapacity) {
            Object oldData[] = elementData;
            int newCapacity = (oldCapacity * 3) / 2 + 1;
            if (newCapacity < minCapacity)
                newCapacity = minCapacity;
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
    }
  • 对象中的存储数组elementData不会随着需要存储数据的减少而缩小。对象只会改变elementData中的数据存储位置,进行迁移,并依赖gc判断移除对象的回收。
    public E remove(int index) {
        RangeCheck(index);

        modCount++;
        E oldValue = (E) elementData[index];

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index + 1, elementData, index, numMoved);
        elementData[--size] = null; // Let gc do its work

        return oldValue;
    }

 

  • indexof采用的是标准的遍历算法,时间复杂度很高,效率很低。并且都是从前开始匹配。contains方法同理。
    public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i] == null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

 

上面可以通过源码,更准确的看到标准类库中对象的特点,后面会继续加入其他的数据类型、和标准类库中的其他类。

2
9
分享到:
评论

相关推荐

    java反编译工具jad 1.5.8g(可以反编译jdk1.5,1.6)

    For example:&lt;br&gt;&lt;br&gt; jad -o -dtest -sjava *.class&lt;br&gt;&lt;br&gt; (or jad -o -d test -s java *.class, which has the same effect)&lt;br&gt;&lt;br&gt;This command decompiles all .class files in the current directory &lt;br&gt;...

    jdk6.0和tomcat6.0经典配置

    &lt;br&gt;&lt;br&gt;&lt;br&gt;安装和配置jdk6.0和tomcat6.0&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;调试(jsp):&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;1.到Tomcat的安装目录的webapps目录,可以看到ROOT,examples, tomcat-docs之类Tomcat自带的的目录.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;2.在...

    基于JSP的实验室教学管理系统

    实验室教学管理系统(Web版 全套源码 安装即用)&lt;br&gt;&lt;br&gt;本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。&lt;br&gt;&lt;br&gt;系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...

    实验室教学管理系统

    实验室教学管理系统(Web版 全套源码 安装即用)&lt;br&gt;&lt;br&gt;本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。&lt;br&gt;&lt;br&gt;系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...

    基于JSP的办公自动化系统

    &lt;Web版办公自动化系统&gt;(全套源码 安装即用)&lt;br&gt;&lt;br&gt;本系统是一个完整的JSP应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。&lt;br&gt;&lt;br&gt;系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出优秀的JSP...

    基于JSP的在线考试系统

    &lt;br&gt;&lt;br&gt;本系统是Web模式的在线考试管理系统&lt;br&gt;&lt;br&gt;运行环境:Tomact+JDK&lt;br&gt;&lt;br&gt;编程模式:JSP+JavaBean+JavaServlet&lt;br&gt;&lt;br&gt;后台数据库:MS-Access&lt;br&gt;&lt;br&gt;系统主要完成的功能如下:&lt;br&gt;&lt;br&gt;.基本信息管理 考生...

    基于JSP新闻发布系统

    新闻发布管理系统(Web版 全套源码 安装即用)&lt;br&gt;&lt;br&gt;本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。&lt;br&gt;&lt;br&gt;系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出优秀...

    精通Java:JDK、数据库系统开发Web开发(实例代码)

    Java异常处理机制&lt;br&gt;第8章 Java反射机制&lt;br&gt;第9章 数据结构与集合类&lt;br&gt;第3篇 图形用户界面&lt;br&gt;第10章 Java Swing(上)&lt;br&gt;第11章 Java Swing(下)&lt;br&gt;第12章 Applet网页小程序&lt;br&gt;第13章 图形编程&lt;br&gt;第14章 ...

    航空订票信息管理系统

    航空订票系统管理系统(Web版 全套源码 安装即用)&lt;br&gt;&lt;br&gt;本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。&lt;br&gt;&lt;br&gt;系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...

    jsp航空订票系统

    航空订票系统管理系统(Web版 全套源码 安装即用)&lt;br&gt;&lt;br&gt;本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。&lt;br&gt;&lt;br&gt;系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...

    CentOS 5.2 下安装JDK

    本TXT文件为第一章:Linux 下安装 JDK&lt;br&gt;测试环境:系统 CentOS 5.2&lt;br&gt;第一步:查看Linux自带的JDK是否已安装并卸载……&lt;br&gt;第二步:安装JDK步骤……&lt;br&gt;第三步:配置环境变量&lt;br&gt;三步完成安装&lt;br&gt;其他安装请见&lt;br...

    c版的arraylist

    java.util包中的ArrayList很常用,参考jdk源码中的ArrayList.java,写了一个c版的ArrayList,&lt;E&gt;目前仅坚持 char *(字符串) 和 int (整型).

    基于JSP + Tomact的实验室教学管理系统

    实验室教学管理系统(Web版 全套源码 安装即用)&lt;br&gt;&lt;br&gt;本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。&lt;br&gt;&lt;br&gt;系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...

    aspose-words-18.8-jdk16-crack.jar

    &lt;Signature&gt;sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=&lt;/Signature&gt; ...

    JDK7新特性(完整篇)

    1.1 JDK7新特性&lt;一&gt;概述 . . . . . . . . . . . . . . 1.2 JDK7新特性&lt;二&gt; 语法 . . . . . . . . . . . . . 1.3 JDK7新特性&lt;三&gt; JDBC4.1 . . . . . . . . . . 1.4 JDK7新特性&lt;四&gt; NIO2.0 文件系统 . . . 1.5 JDK...

    jdk6 源码 SRC

    jdk6 源码jdk6 源码jdk6 源码jdk6 源码jdk6 源码jdk6 源码

    JSF1.2+EJB3.0实现的一个项目实例

    创建数据库表结构及测试数据&lt;br&gt; 在jsfejb3-ejb源码DBScript目录下有一个脚本:employee.sql是数据库的建库、建表、建测试数据为一体的脚本,可直接使用。&lt;br&gt; &lt;br&gt; 4).发布项目&lt;br&gt;  a. ejb端:如果是用Myeclipse把...

    JDK1.8【函数式接口】【定义与使用】【源码】

    JDK1.8【函数式接口】【定义与使用】【源码】 文章地址:https://blog.csdn.net/m0_37969197/article/details/124146253 * 函数式接口(类的定义与适应形式,只是一种类的定义形式,属于新增语法) * 包:java....

Global site tag (gtag.js) - Google Analytics