`
man_yutao
  • 浏览: 39666 次
  • 性别: Icon_minigender_1
  • 来自: 梦的国度
社区版块
存档分类
最新评论

ArrayList学习

阅读更多
ArrayList有两个私有属性:
1、存储数据的数组elementData
2、记录已有数据内容数目的int size

数组elementData的初始容量是可以通过构造函数int 类型参数指定的,默认长度为10,
如果构造参数是Collection集合,容量为集合size的1.1倍与Integer.MAX_VALUE中较小者。

向ArrayList集合末尾中添加元素的方法
 public boolean add(E o) {
	ensureCapacity(size + 1); 
	elementData[size++] = o;
	return true;
    }

在每次添加元素之前都会调用ensureCapacity方法,这个方法是调整数组大小的一个方法。
具体代码如下
 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;
	    elementData = (E[])new Object[newCapacity];
	    System.arraycopy(oldData, 0, elementData, 0, size);
	}
    }

其中的modCount是ArrayList父类AbstractList中的int属性,初始为0,目的是记录此集合被修改的次数。
if (minCapacity > oldCapacity) {}比较数组所需长度和数组实际长度,当所需长度大于实际长度时,
int newCapacity = (oldCapacity * 3)/2 + 1;
扩展实际长度,数组最终长度为,扩展后实际长度与所需长度中较大者。
以最终数组长度创建新的数组,然后进行内容的复制。

所以在知道集合要添加很多数据时,最好在构造集合时,指定到估计值附近,便可节省复制时间。

自己重构下这个方法,感觉看起来会更加明确
public void ensureCapacity(int minCapacity) {
	modCount++;
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object oldData[] = elementData;
	    elementData = (E[])new Object[((oldCapacity * 3)/2 + 1)<minCapacity?minCapacity:((oldCapacity * 3)/2 + 1)];
	    System.arraycopy(oldData, 0, elementData, 0, size);
	}
    }

向ArrayList集合指定位置添加元素的方法
 public void add(int index, E element) {
	if (index > size || index < 0)
	    throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
	ensureCapacity(size+1);  
	System.arraycopy(elementData, index, elementData, index + 1, size - index);
	elementData[index] = element;
	size++;
    }

方法和简单,扩一下数组容量,将索引后的数据都向后移一位,最后在索引处添加内容,最后将实际数据数量加一。
删除ArrayList指定位置元素的方法
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;//这里我认为改为--size;也不会影响集合的使用。
	return oldValue;
    }

RangeCheck(index);只是检查索引是否越界,
相对于添加,删除简单多了,只要将索引后数据都向前移一位,将原先有数据存储时最后一位变为null。实际数据量减一。
1
1
分享到:
评论
2 楼 man_yutao 2011-12-16  
ciding 写道
可以再看看源代码,增加些含金量。

一般需要比较分析一下集合框架,把框架图画出来。

从使用开始,最后深入到源码的实现,比较多个集合框架在实现某些功能的区别。这样就比较好了

会照着这个方向努力的,谢谢
1 楼 ciding 2011-12-16  
可以再看看源代码,增加些含金量。

一般需要比较分析一下集合框架,把框架图画出来。

从使用开始,最后深入到源码的实现,比较多个集合框架在实现某些功能的区别。这样就比较好了

相关推荐

    Android:ArrayList学习实例

    在Android开发中,ArrayList是一个非常基础且常用的集合类,它继承自Java的AbstractList,并实现了List接口。ArrayList主要用于存储和管理有序的元素序列,它的核心特点是动态扩容,可以在运行时根据需要自动增加...

    Arraylist 学习讲义

    Arraylist 学习讲义,可以供java初学者查看学习。在观看本讲义的过程中,能较好的理解java中Arraylist的使用

    深入Java集合学习系列(三):ArrayList实现原理

    Java集合框架中,ArrayList是一种常见的集合实现类,用于存储和操作对象集合。ArrayList基于动态数组的数据结构,因此它能够提供自动扩容的功能,同时也能够快速地进行随机访问。本篇文档将深入探讨ArrayList的内部...

    深入Java集合学习系列:ArrayList的实现原理

    《深入Java集合学习系列:ArrayList的实现原理》 在Java编程中,ArrayList是集合框架中一个重要的类,属于List接口的实现,它提供了动态数组的功能,允许我们在集合中存储、添加、删除元素,并且可以按索引访问。这...

    ArrayList类操作程序实例

    通过学习ArrayList类的这些操作和特性,你可以更好地理解和使用ArrayList来处理数据。在实际编程中,根据需求选择合适的数据结构,比如如果频繁进行插入和删除操作,考虑使用LinkedList;如果需要快速访问且元素数量...

    ArrayList的学习821.docx

    详细的学习可以通过搜索“ArrayList的动态扩容”来深入了解。 ArrayList的一个重要特性是其非线程安全。这意味着在多线程环境中,多个线程同时修改ArrayList可能会导致数据不一致或异常。为了在多线程环境下安全地...

    c版的arraylist

    在Java编程语言中,`ArrayList`是`java.util`包中的一个重要集合类,它提供了动态数组的功能。这个数据结构允许我们存储、访问...通过学习和理解这个实现,开发者可以更好地理解和运用C语言的数据结构和内存管理技巧。

    C#数组与Arraylist

    在编程领域,尤其是在C#语言中,数组和ArrayList是两种常用的数据存储结构。...在实际编程中,我们应根据需求选择最合适的解决方案,同时,随着技术的发展,不断学习新的数据结构和算法,以适应不断变化的编程环境。

    C++ArrayList

    C++ArrayList类的实现是一个很好的学习和实践C++面向对象编程、内存管理和容器设计的机会。通过这种方式,我们可以深入理解数据结构和算法,并为未来更复杂的数据结构和程序设计打下坚实的基础。在实际项目中,通常...

    模拟java ArrayList Iterator

    总的来说,这个资源提供了学习和实践Iterator设计模式的机会,加深了对Java集合框架的理解。通过模拟ArrayList的Iterator实现,我们可以更深入地掌握如何在实际编程中利用这一强大的工具。同时,这也为我们设计自己...

    arraylist 的运用录像

    告诉我们如何来学习将arrayList进行运用,这是关于C#的程序

    ArrayList集合工具类

    通过查看源代码,我们可以学习到如何在JavaScript环境中模拟ArrayList的行为,以及如何处理与Java中的ArrayList不同的问题,如线程安全和动态扩容等。 总的来说,ArrayList集合工具类是Java编程中的核心组件,它在...

    ArrayList和Linkedlist1

    在IT领域,特别是Java编程中,ArrayList和LinkedList是两种非常重要的数据结构,它们都是List接口的实现类。理解这两者的区别对于优化程序性能...通过深入学习和实践,可以更好地利用这些数据结构提升程序效率和质量。

    ArrayList演示

    ArrayList是Java编程语言中一种常用的动态数组,它属于Java集合框架的一部分,位于`java.util`包下。ArrayList类实现了List接口,提供了可变...通过学习和实践这些例子,你可以更熟练地处理基于数组的动态列表需求。

    ListView显示单列ArrayList_demo

    ListView显示单列ArrayList_demo ...在这个示例程序中,我们学习了如何使用 ArrayList 将数据显示在 ListView 中。我们还学习了 ListView、ArrayList 和 ArrayAdapter 的使用。这些知识点对于 Android 开发非常重要。

    Arraylist例子代码 java

    在这个Java demo中,我们可以学习到ArrayList的基本操作。 1. **创建ArrayList** 创建ArrayList对象时,我们可以指定初始容量,或者不指定,Java会自动设置一个默认值。例如: ```java ArrayList&lt;String&gt; list =...

    ArrayList实现对产品CRUD

    此外,通过实践这个项目,你还可以学习如何使用OOP原则,如封装和继承,来构建更复杂的系统。 总之,理解并熟练运用ArrayList的CRUD操作是每个Java开发者的基本技能。这个项目提供了一个很好的起点,帮助初学者巩固...

    ArrayList源码分析

    ArrayList是Java集合框架中的一员,它是List...通过深入学习ArrayList的源码,我们可以更好地理解其工作原理,从而在实际开发中做出更优的选择,提升程序的效率和稳定性。同时,这也是提升Java编程技能的一个重要步骤。

Global site tag (gtag.js) - Google Analytics