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

Java集合类--ArrayList

阅读更多

http://www.cnblogs.com/huangfox/archive/2010/10/09/1846758.html 


Java集合类 

一、 概述 

集合类是java中常用的工具,使用频率最多的是Collection和Map两个接口的实现类,Collection存放多个单对象,而Map存放多个Key-value形式的键值对。

Collection又分成两大接口:List和Set,其最大的区别就是List容许存放重复的对象,而Set不行。常见的实现类参见下图:

图——Collection常见的实现类

在集合类的应用当中,我们需要注意以下几点:

  • Collection的创建;
  • Collection添加对象;
  • Collection删除对象;
  • 获取Collection当中单个对象;
  • 遍历Collection中的对象;
  • 判断对象是否存在于Collection中;
  • Collection中对象的排序;

 

 

 

二、 ArrayList
   

2.1      创建ArrayList()

public ArrayList(int initialCapacity) {

    super();

       if (initialCapacity < 0)

           throw new IllegalArgumentException("Illegal Capacity: "+

                                              initialCapacity);

    this.elementData = new Object[initialCapacity];

    }

super()为一个空方法,因此在创建ArrayList的最重要的语句是:

this.elementData = new Object[initialCapacity];

他实例化了一个Object数组,并且将该数组赋给了当前实例的elementData属性,此数组的大小由initialCapacity指定。因此可知ArrayList是由对象数组存放数据的。

2.2      添加对象:add(E)

添加一个对象即将该对象插入到elementData数组当中,但是当数据满时,需要对其进行扩容。

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 awin:

           elementData = Arrays.copyOf(elementData, newCapacity);

    }

    }

当add(E)时,首先将当前ArrayList中的对象数量加1,赋值给变量minCapacity,然后将其与Object数组的大小进行比较,如果minCapacity大,先将Object数组赋值给一个新的数组对象(oldData),然后生成一个新的数组容量值。新数组容量值为当前容量的1.5倍再加1。最后调用Arrays.copyOf来生成新的数组对象。

如果想修改ArrayList的扩容策略,可继承ArrayList,并覆盖ensureCapacity方法。

2.3      添加对象:add(int,E)

将对象添加的到指定位置,那么就必须将该位置以后的所有数据向后移动一个位置。在这个过程中需要考虑数组容量的问题。

public void add(int index, E element) {

    if (index > size || index < 0)

        throw new IndexOutOfBoundsException(

       "Index: "+index+",Size: "+size);

 

    ensureCapacity(size+1);  // Increments modCount!!

    System.arraycopy(elementData,index, elementData, index + 1,

            size - index);

    elementData[index] = element;

    size++;

    }

首先将指定位置后的数据移动一个位置:

System.arraycopy(elementData, index, elementData, index + 1,

            size - index);

然后见预添加的对象插入到指定位置:

elementData[index] = element;

知识点扩充 

arraycopy

publicstatic void arraycopy(Object src, int srcPos, Object dest, int destPos,int length)

从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的编号等于 length 参数。源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1 位置。

如果参数 src 和 dest 引用相同的数组对象,则复制的执行过程就好像首先将 srcPos 到 srcPos+length-1 位置的组件复制到一个带有 length 组件的临时数组,然后再将此临时数组的内容复制到目标数组的 destPos 到 destPos+length-1 位置一样。

 

2.4      删除对象:remove(E)

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;

    }

重点关注:

fastRemove(index);

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),传入fastRemove,将index后所有数据向前移动一个单位,并且将最后一个数据设置为null,然gc对其进行回收。

Remove(E)比较耗时的步骤是:遍历数组与目标数据进行比较。

2.5      删除数据:remove(int)

public E remove(int index) {

    RangeCheck(index);

 

    modCount++;

    EoldValue = (E) elementData[index];

 

    int numMoved = size - index - 1;

    if (numMoved > 0)

        System.arraycopy(elementData, index+1, elementData, index,

                numMoved);

    elementData[--size] = null; // Letgc do its work

 

    return oldValue;

    }

虽然remove(int)多了一步

RangeCheck(index);范围检测 

但是不用对数据进行比较,因此remove(int)的效率比remove(E)的效率要高。

2.6      遍历对象:iterator()

关于iterator实例:

public Iterator<E> iterator(){

    return new Itr();

    }

每次调用iterator方法返回一个Itr实例,该实例包含属性

Cursor,

Cursor起到光标的作用,在hasNext中与当前数据的长度进行比较,如果相等则说明遍历完成,返回false。

public boolean hasNext() {

           return cursor != size();

    }

Iterator实例还包含属性

expectedModCount

expecteModeCount描述了在创建iterator时ArrayList实例的状态,即获取那时modCount的值。

public E next() {

           checkForComodification();

        try {

       Enext = get(cursor);

       lastRet = cursor++;

       return next;

        } catch (IndexOutOfBoundsException e) {

       checkForComodification();

       throw newNoSuchElementException();

        }

    }

对ArrayList实例中对象数组的大小产生影响的动作将会影响实例的modCount属性,在next方法中,需要iterator持有的expecteModeCount与当前的modCount进行比较,若不相同则说明在iterator遍历的过程中ArrayList实例发生了变化(对象数组长度发生变化)。该功能由checkForComodfication方法执行:

final void checkForComodification() {

        if (modCount != expectedModCount)

       throw newConcurrentModificationException();

    }

    }

因此在使用iterator对ArrayList实例进行遍历的过程中,不能使用add、remove等方法。

2.7      判断存在或获取位置 

Contains(E)、indexOf、lastIndexOf无非都是对对象数组的遍历和数据之间的比较,不做过多说明。

2.8      注意点 

  • ArrayList是无容量限制的。
  • ArrayList在删除数据时并不会减小数组的容量,如果想要减少数组容量可以使用trimToSize方法。
  • 在查找数据时,遍历数组,对非null的数据使用的是equal进行比较。
  • ArrayList是非线程安全的。

分享到:
评论

相关推荐

    java集合类详解(set list ArrayList等java集合类详述)

    Java 集合类详解 Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。 Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、...

    JSP应用开发-Java集合类-List接口.pptx

    Java集合类——List接口 Java中的集合类是用来存放对象的,相当于一个容器,里面包容着一组对象。Java API提供的集合类位于java.util包内。Java中的集合类可以分为两类,一类是数组,另一类是集合。数组也是容器,...

    跟我学Java-day14-ArrayList集合.pdf

    day14-ArrayList集合 1.ArrayList 1.1ArrayList类概述【理解】 什么是集合 提供一种存储空间可变的存储模型,存储的数据容量可以发生改变 ArrayList集合的特点 底层是数组实现的,长度可以变化 泛型的使用 ...

    Java基础----集合类汇总

    本文将深入探讨Java集合类的汇总,包括List、Set和Map这三大核心接口及其实现类。 首先,让我们从List接口开始。List是一种有序的集合,允许有重复元素,并且支持通过索引来访问元素。ArrayList和LinkedList是List...

    java笔记--集合类

    ### Java集合类详解:List与ArrayList的精妙区别 在Java编程中,集合类是处理数据存储和操作的重要工具,其中List和ArrayList是最常见的类型之一。List作为一个接口,提供了有序的元素存储方式,确保元素按照插入...

    Java-Java集合体系-List-Set

    理解并熟练运用Java集合体系中的List、Set、Map接口及其实现类,对于日常开发和面试来说至关重要,因为它们是许多Java框架和库的基础。在实际项目中,根据需求选择合适的集合类型可以提高代码的效率和可维护性。在...

    【IT十八掌徐培成】Java基础第10天-03.List-集合框架-ArrayList.zip

    在Java编程语言中,集合框架是处理对象数组的核心工具,它提供了一种高效、灵活的方式来存储和操作数据。本课程“【IT十八掌徐培成】...同时,理解ArrayList与其他集合类的区别和适用场景,有助于编写出更优化的代码。

    Java集合类List-Set-Map的区别和联系.doc

    Java 集合类 List-Set-Map 的区别和联系 Java 集合类 List、Set 和 Map 是 Java 语言中最基本的集合类,它们之间存在着紧密的联系和区别。在本文中,我们将对 Java 集合类 List、Set 和 Map 的区别和联系进行详细的...

    精通java集合框架--List,Set..

    ### 精通Java集合框架——List, Set, Map #### 概述 Java集合框架是一种高度抽象且灵活的数据组织工具,它通过一系列接口来定义不同类型的数据容器,并提供了丰富的操作这些容器的方法。本文将深入探讨Java集合...

    java集合类ArrayList简单雇员管理系统.doc

    Java集合类ArrayList简单雇员管理系统 本文将从标题、描述、标签和部分内容中提取相关知识点,并进行详细的解释。 标题和描述 从标题和描述中,我们可以看到这是一个使用Java集合类ArrayList实现的简单雇员管理...

    2JAVA编程高级-集合类.pdf

    `Collection`接口是Java集合框架的核心接口之一,它是所有集合类的根接口。该接口定义了一组对象的通用操作,并且是`Set`和`List`接口的父接口。 **Collection接口的主要特点**: - 可以存放不同类型的数据。 - 子...

    Java集合排序及java集合类详解.pdf

    ### Java集合排序及Java集合类详解 #### 一、集合框架概述 集合框架是Java编程语言的核心组件之一,用于组织和操作数据集。Java集合框架提供了多种数据结构,包括列表(List)、集(Set)和映射(Map),这些数据结构...

    java基础--list(ArrayList、LinkedList、匿名类).docx

    【Java基础——List接口详解(ArrayList、LinkedList、匿名类)】 在Java编程中,List接口是集合框架的重要组成部分,提供了有序存储元素的功能。ArrayList和LinkedList是List接口的两种主要实现,它们各有优缺点,...

    java-集合-知识点汇总

    Java集合可以分为两大类:Collection和Map。 Java集合的类型 Java集合有多种类型,常见的有ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。 * ArrayList:是一个基于数组的列表实现,支持随机...

    day09-ArrayList集合&学生管理系统.pdf

    ArrayList是Java集合框架中的重要部分,是一种能够存储可变数量元素的集合。ArrayList的特点是基于数组的数据结构,这使得它在随机访问元素时表现良好,但数组的缺点是容量固定,而ArrayList弥补了这一点,它的容量...

    Java 集合框架(2-9)-Collection - ArrayList 源码解析.pdf

    ArrayList是Java集合框架中的一个重要组件,它属于List接口的实现类,提供了一种动态数组的逻辑视图。ArrayList以高效、灵活的方式存储和操作对象序列,是开发过程中常用的容器之一。本文将深入解析ArrayList的内部...

    Java集合类性能分析

    ### Java集合类性能分析 #### 一、Java集合框架概览 Java集合框架是一个非常重要的概念,它提供了处理数据集合的标准方法。集合框架的核心部分主要包括集合接口、抽象类以及具体的实现类。 - **集合接口**:Java...

    2024年java面试题-java集合相关面试题

    根据给定文件的信息,我们可以总结出以下关于Java集合的相关知识点: ### 一、集合容器概述 #### 1. 什么是集合? 集合(Collection)是指在Java中用来存储、检索及操作一组对象的一种容器。它是一种高级的数据...

    java集合类学习笔记.doc

    ### Java集合类学习笔记知识点详解 #### 一、集合框架概述 ##### 1.1.1 容器简介 在Java编程中,容器是用于存储和管理对象集合的重要工具。当我们处理大量的对象时,比如存储多个员工的信息,仅仅依赖于基本的...

Global site tag (gtag.js) - Google Analytics