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

之ArrayList

 
阅读更多

首先看类定义:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable



 private transient Object[] elementData;


 public ArrayList(int initialCapacity) {
 super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
 this.elementData = new Object[initialCapacity];
    }

    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
 this(10);
    }

 

使用无参的构造方法时,ArrayList将我们初始一个长度为10的Object[]数组

下面再看看 add函数

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

 

调用add函数时会将当前数组的长度+1后,通过ensureCapacity 函数进行判断数组大小是否可用,如果超过可用大小,那么ArrayList底层会生成一个新的数组,长度为原数组的1.5倍+1,值得关注的是Arrays.copyOf(elementData, newCapacity);

我们再看下移除函数

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

 

删除数组元素的时候,也会进行System.arraycopy..要将被删除元素的后续元素向前移动

 

总结:

ArrayList:
        1) ArrayList底层使用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的Object类型数组
        2) 如果生成的数组超过10个,那么ArrayList底层会生成一个新的数组,长度为原数组的1.5倍+1,然后将原数组的元素复制到新数组之中,并且后续增加的内容都会放到新数组之中,当新数组无法容纳增加的元素时,重复该过程
        3) 对于ArrayList元素的删除操作,需要将被删除元素的后续元素向前移动,代价比较高

分享到:
评论

相关推荐

    集合之ArrayList.md

    Arraylist

    毕业设计源码之ArrayList,LinkList链表接口实现.zip

    在本毕业设计中,主要涉及了Java编程语言的高级特性,特别是对集合框架中的ArrayList和LinkedList两种数据结构的实现。这两个类是Java中常用的数据存储容器,它们都是List接口的实现,但各自有着不同的特点和应用...

    java小程序之ArrayList的使用

    作业 10-08 1. 随机产生 20 个整数(10以内的),放入一个ArrayList中, 用迭代器遍历这个ArrayList 2. 并删除其中为 5 的数 3. 再产生 3 个整数,插入到位置 4 处 4. 把所有值为 1 的数都变成 10

    java毕业设计之ArrayList,LinkList链表接口实现源码.zip

    在本Java毕业设计项目中,主要探讨了两种重要的数据结构——ArrayList和LinkedList,它们都是Java集合框架中的核心组件,属于List接口的实现类。ArrayList和LinkedList各有特点,适合不同的应用场景,理解并掌握这两...

    毕业设计之ArrayList,LinkList链表接口实现源码.zip

    java毕业设计,项目包含完整前后端源码,带数据库sql文件。项目可正常运行! 环境说明: 开发语言:Java 前端框架:小程序 JDK版本:JDK1.8 数据库:mysql 5.7+ 部署容器:tomcat7+ 数据库工具:Navicat11+ ...

    集合嵌套之ArrayList嵌套ArrayList实例

    这里我们关注的是集合嵌套,特别是ArrayList类型的嵌套,也就是一个ArrayList包含另一个ArrayList的实例。这种结构可以用来表示复杂的数据结构,例如多层关系的数据,如本例中的学校与班级、班级与学生的层次关系。 ...

    List集合之ArrayList

    ArrayList是Java集合框架中List接口的一个具体实现,它继承了AbstractList抽象类,并实现了List、RandomAccess、Cloneable和Serializable接口。ArrayList的核心特点是其内部基于动态数组的数据结构,即使用Object...

    jni操作arraylist对象

    在这个主题中,我们将深入探讨如何在JNI中操作ArrayList对象并添加一个int类型的数据。 首先,我们需要理解ArrayList在Java中的本质。ArrayList是Java集合框架中的一个重要类,它实现了List接口,用于存储可变大小...

    ArrayList转化为DataTable

    在.NET框架中,ArrayList和DataTable是两种常用的集合类,它们分别代表了两种不同的数据存储方式。ArrayList是一个基于对象数组的动态大小的列表,而DataTable则是一个内存中的表格数据结构,通常用于存储和操作关系...

    使用对象ArrayList填充DataGrid,C#源代码ArrayList MyList = new ArrayList();

    首先,ArrayList是.NET Framework中的一个类,它继承自System.Collections.ArrayList,主要用于存储动态大小的可变数组。ArrayList可以存储任何类型的对象,非常灵活,但不提供类型安全。在C#中,我们通常更推荐使用...

    C# Array和ArrayList,List区别

    ### C# 中 Array、...- **List**:结合了 Array 和 ArrayList 的优点,是现代 C# 编程中最常用的集合类型之一,支持类型安全性和高效的动态调整大小。 在实际开发过程中,应根据具体需求选择最合适的集合类型。

    JNI与C++数据类型传递示例(包括ArrayList对象、ArrayList嵌套返回)

    一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList&lt;ArrayList&lt;String&gt;&gt;等。

    你必须知道的C# ArrayList

    C# ArrayList是一个重要的数据结构,它是.NET框架早期版本中用于动态数组存储的类。这个类在System.Collections命名空间中,提供了灵活的大小调整和数据管理功能。ArrayList在C#编程中扮演了重要的角色,尤其在处理...

    arraylist用法

    ### ArrayList的使用详解 #### 一、什么是ArrayList? `ArrayList`是.NET框架中提供的一种动态数组类型,它属于`System.Collections`命名空间。与普通的数组相比,`ArrayList`具有更强大的功能,比如它可以动态地...

    用C语言模拟ArrayList

    在C语言中,ArrayList是一种常见的数据结构,它模拟了Java或.NET等高级语言中的动态数组。ArrayList提供了在数组中添加、删除和查找元素的便利操作,而无需预先知道数组的大小。下面,我们将深入探讨如何用C语言实现...

    ArrayList类操作程序实例

    ArrayList类是Java编程语言中一个常用的集合类,它属于Java集合框架的一部分,位于`java.util`包中。ArrayList是一个基于数组实现的动态列表,可以存储任何类型的数据,并且支持动态扩容。在本实例中,我们将深入...

    c版的arraylist

    在Java编程语言中,`ArrayList`是`java.util`包中的一个重要集合类,它提供了动态数组的功能。这个数据结构允许我们存储、访问和管理一组元素。而在C语言中,由于没有内置的类似集合的数据类型,程序员需要自定义...

    Android ArrayList关键字查询.rar

    在Android开发中,ArrayList是一个非常重要的数据结构,它属于Java集合框架的一部分,但在Android环境中被广泛使用。ArrayList关键字查询是Android应用中常见的功能,尤其在显示大量数据的ListView中,用户通常需要...

Global site tag (gtag.js) - Google Analytics