`
wu.sheng
  • 浏览: 66990 次
  • 性别: 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 JDK实例宝典

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

    jdk源码 jdk源码

    - **集合框架**: 研究ArrayList、LinkedList、HashMap、HashSet等数据结构的实现。 - **I/O流**: 理解字节流、字符流、缓冲流、对象序列化等概念。 - **网络编程**: 学习Socket通信,HTTP、FTP协议的实现。 - **国际...

    jdk1.8 rt.jar 源码

    2. **集合框架**:`java.util`包中的`ArrayList`、`LinkedList`、`HashMap`、`HashSet`等数据结构的实现,这些是日常编程中最常用的工具。源码可以帮助理解它们的性能特性,比如插入、删除、查找的时间复杂度。 3. ...

    JDK1.8源码,亲测好用。

    List&lt;String&gt; list = new ArrayList&lt;&gt;(); list.sort(Comparator.comparing(String::length)); // 方法引用 ``` `String::length`表示直接使用`String`类的`length()`方法。 **3. Stream API** Stream API是Java 8...

    jdk1.7源码

    通过阅读这些类的源码,可以学习到各种设计模式,如工厂模式、单例模式、装饰器模式等,同时也能理解Java内置数据结构(如`ArrayList`, `HashMap`)的实现细节,这对于提升编程技能和解决问题具有极大帮助。...

    jdk1.6 源码jdk1.6 源码

    深入理解JDK 1.6的源码对于Java开发者来说至关重要,因为它揭示了语言核心库的工作原理,有助于优化代码、理解和解决潜在问题。 1. **Java虚拟机(JVM)**:JDK 1.6中的JVM是Java程序执行的基础,它的主要职责是...

    jdk1.8 sun源码

    6. **集合框架**:`java.util`包中的集合类,如ArrayList、HashMap、LinkedList等,其内部实现细节对于理解数据结构和算法有很大帮助。 7. **I/O流**:`java.io`和`java.nio`包提供了丰富的输入/输出流接口和类,...

    JDK1.6源码

    源码分析能够揭示ArrayList、HashMap、HashSet等数据结构的内部实现,帮助理解其性能特点和适用场景。 8. **网络编程** JDK 1.6的Socket和ServerSocket类提供了基础的网络通信功能。通过源码,我们可以学习到连接...

    jdk源码jdk1.8.0_181

    `java.util`中的ArrayList和HashMap,是常用数据结构的实现;还有`java.io`中的File类,用于文件操作。 5. **launcher**: Java启动器(Java Launcher)是JVM(Java Virtual Machine)启动应用程序的关键组件。在JDK...

    jdk源码和jdk7开发帮助文档(api)

    3. **钻石操作符**:在创建泛型对象时,编译器可以自动推断类型参数,简化代码,如`List&lt;String&gt; list = new ArrayList&lt;&gt;();` 4. **字符串开关**:使用字符串作为switch语句的条件,使得基于字符串的分支判断更加...

    jdk1.6源码包

    在JDK 1.6中,你可以在这里找到如Object、String、ArrayList、HashMap等基础类的源代码,这些是构建任何Java程序的基础。 **6. org 文件夹** org目录通常包含开源组织或标准组织提供的库。在JDK 1.6中,org可能包含...

    jdk1.8 src源码包

    总的来说,JDK 1.8的源码包是一份宝贵的教育资源,它为我们揭示了Java语言背后的复杂性和精妙之处,是每一位Java开发者进阶的必经之路。无论是初学者还是资深开发者,都应该充分利用这份资源,深入探索Java的世界。

    JAVA JDK实例开发宝典源码

    Java JDK实例开发宝典源码是一份非常宝贵的资源,它涵盖了Java编程语言的各个方面,旨在帮助开发者深入理解和熟练运用Java JDK。这份源码集合包含了众多的实际示例,可以帮助初学者和经验丰富的开发者巩固基础,提升...

    jdk的部分源码(jdk)

    这里提供的"jdk的部分源码"压缩包很可能是Oracle JDK或者OpenJDK的一部分,它们都是开源的,允许开发者深入研究和定制。 1. **Java虚拟机(JVM)**: JDK的源码中包含了Java虚拟机的实现,JVM是Java程序的执行环境。...

    jdk1.6源码Ecplise添加

    `java.util.ArrayList`和`java.util.HashMap`是常用的集合类,它们的实现涉及动态数组和哈希表的数据结构;`java.io`包下的类则涵盖了输入输出流的处理,如`FileInputStream`和`PrintWriter`。 通过阅读和学习这些...

    jdk1.6源码

    这些类的源码展示了如何实现数据结构和算法,对于提升算法和数据结构理解有很大帮助。 10. **异常处理** `java.lang.Throwable`及其子类定义了Java的异常处理机制。通过查看源码,我们可以了解到异常的抛出、捕获...

    jdk7源代码

    List&lt;String&gt; list = new ArrayList&lt;&gt;(); ``` 4. **文件系统 API**(`java.nio.file`包):提供了一组新的API用于处理文件系统操作,如Path、Files和Paths类,增强了对文件操作的支持。 5. **改进的枚举接口**:...

    jdk src 源码 压缩包提取

    在源码中,你可以看到`java.lang`、`java.util`、`java.io`等包中的各种基础类是如何实现的,例如`String`、`ArrayList`、`HashMap`等常用数据结构。 首先,`java.lang`包包含了Java语言的基础类和接口,如`Object`...

    JDK1.7的源码文件src.zip

    - **泛型**:通过`java.util.ArrayList&lt;E&gt;`等类,理解泛型的用法和限制。 - **网络编程**:研究`java.net`包,学习如何创建套接字连接,进行TCP和UDP通信。 - **XML处理**:查看`javax.xml`和`org.w3c.dom`包,...

    jdk源码的另一部分

    在深入探讨JDK源码之前,我们先理解一下它的核心概念。JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的工具集合,其中包含了Java编译器、Java运行时环境(JRE)、Java类库以及各种实用...

Global site tag (gtag.js) - Google Analytics