ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。本文主要介绍Java ArrayList的使用方法教程及示例代码

1、Java ArrayList

ArrayList类是可调整大小的数组,可以在java.util包中找到。

Java中的数组与Java中的ArrayList之间的区别在于,数组的大小无法修改(如果要向数组中添加元素或从中删除元素,则必须创建一个新的)。虽然可以随时根据需要从ArrayList中添加和删除元素。语法也略有不同:

例如:

创建一个名为langs的ArrayList对象,该对象将存储字符串:

import java.util.ArrayList; // import the ArrayList class

ArrayList<String> langs = new ArrayList<String>(); // 创建 ArrayList对象

2、向ArrayList添加元素

ArrayList类具有许多有用的方法。 例如,要将元素添加到ArrayList,需要使用add()方法:

例如:

import java.util.ArrayList;

public class Main {
  public static void main(String[] args) {
    ArrayList langs = new ArrayList();
    langs.add("c");
    langs.add("java");
    langs.add("python");
    langs.add("cjavapy");
    System.out.println(langs);
  }
}

3、访问ArrayList中元素

要访问ArrayList中的元素,请使用get()方法并引用索引号:

例如:

langs.get(0);

注意:数组索引以0开头:[0]是第一个元素。 [1]是第二个元素,依此类推。

4、修改ArrayList中元素

要修改元素,需要使用set()方法并引用索引号:

例如:

langs.set(0, "C#");

5、删除ArrayList中元素

要删除元素,需要使用remove()方法并引用索引号:

例如:

langs.remove(0);

要删除ArrayList中的所有元素,请使用clear()方法:

例如:

langs.clear();

6、ArrayList size

要找出ArrayList有多少个元素,需要使用size方法:

例如:

langs.size();

7、循环遍历 ArrayList

使用for循环遍历ArrayList的元素,并使用size()方法指定循环应运行的次数:

例如:

public class Main {
  public static void main(String[] args) {
    ArrayList<String> langs = new ArrayList<String>();
    langs.add("c");
    langs.add("java");
    langs.add("python");
    langs.add("cjavapy");
    for (int i = 0; i < langs.size(); i++) {
      System.out.println(langs.get(i));
    }
  }
}

还可以通过for-each循环遍历ArrayList

例如:

public class Main {
  public static void main(String[] args) {
    ArrayList<String> langs = new ArrayList<String>();
    langs.add("c");
    langs.add("java");
    langs.add("python");
    langs.add("cjavapy");
    for (String i : langs) {
      System.out.println(i);
    }
  }
}

8、其它类型

ArrayList中的元素实际上是对象。在上面的示例中,我们创建了元素 (对象)类型为字符串。Java中的String是一个对象(不是原始类型)。要使用其他类型,例如,int,必须指定等效的包装器类:Integer。对于其他基本类型,需要使用:Boolean表示布尔值,Character表示char,Double表示double,等等:

例如:

创建一个ArrayList来存储数字(添加类型为Integer的元素):

import java.util.ArrayList;

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> myNumbers = new ArrayList<Integer>();
    myNumbers.add(10);
    myNumbers.add(15);
    myNumbers.add(20);
    myNumbers.add(25);
    for (int i : myNumbers) {
      System.out.println(i);
    }
  }
}

9、ArrayList的排序

java.util包中另一个有用的类是Collections类,该类包括用于对列表进行字母或数字排序的sort()方法:

例如:

对字符串的ArrayList进行排序:

import java.util.ArrayList;
import java.util.Collections;  // Import the Collections class

public class Main {
  public static void main(String[] args) {
    ArrayList<String> langs = new ArrayList<String>();
    langs.add("c");
    langs.add("java");
    langs.add("python");
    langs.add("cjavapy");
    Collections.sort(langs);  // Sort cars
    for (String i : langs) {
      System.out.println(i);
    }
  }
}

例如:

对整数数组列表进行排序:

import java.util.ArrayList;
import java.util.Collections;  // Import the Collections class

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> myNumbers = new ArrayList<Integer>();
    myNumbers.add(33);
    myNumbers.add(15);
    myNumbers.add(20);
    myNumbers.add(34);
    myNumbers.add(8);
    myNumbers.add(12);

    Collections.sort(myNumbers);  // Sort myNumbers

    for (int i : myNumbers) {
      System.out.println(i);
    }
  }
}

10、 ArrayList重要的方法、属性和实例

1)构造器

ArrayList提供了三个构造器:

public ArrayList();

默认的构造器,将会以默认(16)的大小来初始化内部的数组

public ArrayList(ICollection);

用一个ICollection对象来构造,并将该集合的元素添加到ArrayList

public ArrayList(int);

用指定的大小来初始化内部的数组

2)IsSynchronized属性和ArrayList.Synchronized方法

IsSynchronized属性指示当前的ArrayList实例是否支持线程同步,而ArrayList.Synchronized静态方法则会返回一个ArrayList的线程同步的封装。

如果使用非线程同步的实例,那么在多线程访问的时候,需要自己手动调用lock来保持线程同步,例如:

ArrayList list = new ArrayList(); 
//... 
lock(list.SyncRoot) //当ArrayList为非线程包装的时候,SyncRoot属性其实就是它自己,但是为了满足ICollection的SyncRoot定义,这里还是使用SyncRoot来保持源代码的规范性 
{ 
list.Add("Add a Item"); 
}

如果使用ArrayList.Synchronized方法返回的实例,那么就不用考虑线程同步的问题,这个实例本身就是线程安全的,实际上ArrayList内部实现了一个保证线程同步的内部类,ArrayList.Synchronized返回的就是这个类的实例,它里面的每个属性都是用了lock关键字来保证线程同步。

3)Count属性和Capacity属性

Count属性是目前ArrayList包含的元素的数量,这个属性是只读的。

Capacity属性是目前ArrayList能够包含的最大数量,可以手动的设置这个属性,但是当设置为小于Count值的时候会引发一个异常。

4)Add、AddRange、Remove、RemoveAt、RemoveRange、Insert、InsertRange

Add:方法用于添加一个元素到当前列表的末尾

AddRange:方法用于添加一批元素到当前列表的末尾

Remove:方法用于删除一个元素,通过元素本身的引用来删除

RemoveAt:方法用于删除一个元素,通过索引值来删除

RemoveRange:用于删除一批元素,通过指定开始的索引和删除的数量来删除

Insert:用于添加一个元素到指定位置,列表后面的元素依次往后移动

InsertRange:用于从指定位置开始添加一批元素,列表后面的元素依次往后移动

Clear:方法用于清除现有所有的元素

Contains:方法用来查找某个对象在不在列表之中

5)TrimSize方法

这个方法用于将ArrayList固定到实际元素的大小,当动态数组元素确定不在添加的时候,可以调用这个方法来释放空余的内存。

6)ToArray方法

这个方法把ArrayList的元素Copy到一个新的数组中。

ArrayList实例:

import java.util.*;
public class ArrayListTest {
    public static void main(String[] args) {
        // 创建ArrayList
        ArrayList list = new ArrayList();
        // 将“”
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        // 将下面的元素添加到第1个位置
        list.add(0, "5");
        // 获取第1个元素
        System.out.println("the first element is: "+ list.get(0));
        // 删除“3”
        list.remove("3");
        // 获取ArrayList的大小
        System.out.println("Arraylist size=: "+ list.size());
        // 判断list中是否包含"3"
        System.out.println("ArrayList contains 3 is: "+ list.contains(3));
        // 设置第2个元素为10
        list.set(1, "10");
        // 通过Iterator遍历ArrayList
        for(Iterator iter = list.iterator(); iter.hasNext(); ) {
            System.out.println("next is: "+ iter.next());
        }
        // 将ArrayList转换为数组
        String[] arr = (String[])list.toArray(new String[0]);
        for (String str:arr)
            System.out.println("str: "+ str);
        // 清空ArrayList
        list.clear();
        // 判断ArrayList是否为空
        System.out.println("ArrayList is empty: "+ list.isEmpty());
    }
}

推荐文档