`
darkjune
  • 浏览: 308510 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDK ArrayList 删除源码

 
阅读更多

ArrayList是JDK提供的一个数组list,其实现基于java的数组, elementData是声明在该类里面的实际保存数组的变量:

 

private transient Object[] elementData;

 

删除:

remove的时候,需要遍历整个数组,找到匹配的元素, 然后调用内部私有方法,进行快速删除(fastRemove),这个删除方法不检查数组下标长度等。

    public boolean remove(Object o) {
	if (o == null) {
            for (int index = 0; index < size; index++)
		if (elementData[index] == null) {
		    fastRemove(index);
		    return true;
		}
	} else {
	    for (int index = 0; index < size; index++)
		if (o.equals(elementData[index])) {
		    fastRemove(index);
		    return true;
		}
        }
	return false;
    }

 删除的方式是调用系统类的arraycopy方法对数组本身进行自复制,也可以说是自覆盖,从找到元素的后一个index开始复制(index+1),

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

 其实就是把该index后从index+1开始的数组全部覆盖到从index开始的位置,等于将整个数组左移了一位,所有移动的数量是numMoved。 然后再将数组最后一位清空。

 

填加:

    public boolean add(E e) {
	ensureCapacity(size + 1);  // Increments modCount!!
	elementData[size++] = e;
	return true;
    }

 可以看到在填加元素时,首先检查是否需要对数组扩容,如果没问题,则将元素加入到目前数组的size++的位置,既加入到ArrayList的末尾。size是类级变量,java中int初始化给了默认值0。

检查容量的源码为:

    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);
	}
    }

 比较时检查数组目前长度与传入的所需size,如果长度不够,则做扩容,扩容用目前长度的1.5倍来计算。 这里源码中还额外计算了最小容量与新容量的大小,使增加后的数组长度能到一个合理的大小。

新的数组数据用Arrays.copyOf方法进行克隆。 该方法还可以在程序员可以预估List大小时设定List的容量,减少其内部数组elementData的扩容次数。

 

List的特性与数组类似,内部实现也依赖于数组,并提供了更方便的方法,如增删时越界检查及自动扩容等,是JDK加强数组使用便利性的一种封装。

分享到:
评论

相关推荐

    JDK8的ArrayList源码文件

    JDK8的ArrayList源码文件

    jdk1.8 sun源码

    这个"jdk1.8 sun源码"压缩包很可能包含了这些未公开的Sun Microsystems的源代码,使得开发者有机会深入研究Java平台的内部工作原理,这对于进行底层优化、理解和调试Java程序有着极大的帮助。然而,值得注意的是,...

    jdk源码 jdk源码

    Java Development Kit (JDK) 源码是学习和理解Java平台核心机制的关键资源。它包含了许多关键组件的源代码,使开发者能够深入探索Java语言的底层实现,从而提升编程技巧,优化性能,并理解标准库的工作原理。在这个...

    jdk1.6 源码jdk1.6 源码

    7. **集合框架**:JDK 1.6的`java.util`包包含了各种集合实现,如ArrayList、LinkedList、HashMap等。源码分析可以揭示它们的内部结构和操作算法,这对于理解性能和选择合适的集合类型很有帮助。 8. **网络编程**:...

    ArrayList源码分析(含jdk1.8).pdf

    通过以上对ArrayList源码的分析,可以总结出如下关键知识点: 1. ArrayList的实现基于动态数组,可以动态地进行容量的调整; 2. ArrayList具有默认初始化容量10,以及无参构造时延迟初始化的特性; 3. ArrayList...

    ArrayList源码Jdk1.8

    ### ArrayList源码解析(JDK 1.8) #### 概述 `ArrayList`是Java集合框架中的一个核心组件,它提供了动态数组的功能。与固定大小的数组不同,`ArrayList`可以随着元素的增加而自动扩展其容量。在JDK 1.8中,`...

    jdk1.8 src源码包

    - **理解API底层实现**: 通过阅读源码,可以深入理解常用API的工作原理,如ArrayList如何动态扩容,HashMap如何实现快速查找等。 - **优化代码**: 了解系统内部开销,可以帮助编写更高效的代码,避免不必要的性能...

    jdk的部分源码(jdk)

    通过源码,我们可以学习这些类和接口的实现,例如ArrayList和HashMap的工作原理,线程同步的细节,以及Socket通信的底层实现。 4. **异常处理**: 源码中展示了Java如何处理异常,包括检查性异常和运行时异常。理解...

    java jdk 实例宝典源码

    Java JDK实例宝典源码是Java开发者的重要参考资料,它涵盖了JDK中的各种核心类库、API及其实现的源代码。这些源码对于深入理解Java语言的底层运作机制、优化代码以及解决实际问题有着不可估量的价值。下面,我们将...

    jdk1.6源码包

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

    jdk1.8source源码

    源码分析是深入理解Java平台工作原理的关键,对于开发者来说,能够查看和学习JDK的源代码是提升技能的重要途径。在这个压缩包中,包含了一些主要的Java核心库的源代码,如`com`, `org`, `launcher`, `java`, 和 `...

    JDK1.6中Arraylist,Vector,LinkedList源码

    在JDK 1.6中,ArrayList提供了线程不安全的高效操作,适合于非并发环境下的高性能读写操作。其优点在于随机访问快速,因为数组支持索引直接访问;缺点是插入和删除元素需要移动后续元素,效率较低。 Vector与...

    JDK1.7源码包

    **JDK1.7源码包详解** JDK(Java Development Kit)是Oracle公司发布的Java编程语言的开发工具包,它是Java开发环境的基础。JDK1.7,也被称为Java SE 7(Java Standard Edition 7),是Java发展历程中的一个重要...

    jdk1.8源码下载

    JDK 1.8的源码中包含了很多关键的Java类库,如基础集合框架(如ArrayList, HashMap)、并发工具类、IO流、网络编程API以及重要的语言新特性。以下是JDK 1.8中的一些重要知识点: 1. **Lambda表达式**:这是JDK 1.8...

    JDK1.6源码

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

    jdk源码阅读一:ArrayList

    ### jdk源码阅读一:ArrayList #### 一、ArrayList简介与特性 ArrayList作为Java集合框架中的重要组成部分,被广泛应用于各种应用场景。它的主要特点包括: - **基于数组实现**:ArrayList采用数组作为其底层数据...

    源码解析jdk7.0集合:ArrayList的底层实现原理.pdf

    在探讨 JDK 7.0 中 ArrayList 的底层实现原理之前,首先需要了解 ArrayList 作为 Java 集合框架中 List 接口的动态数组实现类的基本概念。ArrayList 提供了一种存储有序、可重复、允许为 null 的数据结构,并且该...

    JDK源码,整合所有内容

    - JDK1.8中对集合框架进行了重大更新,`ArrayList`、`LinkedList`、`HashSet`、`HashMap`等都有对应的源码,可以深入理解它们的工作原理和性能差异。 - **Stream API**:新引入的流API提供了函数式编程的支持,...

Global site tag (gtag.js) - Google Analytics