最近在学习Java的集合框架部分,先从简单一点的ArrayList开始吧!

1、什么是ArrayList
ArrayList就是传说中的动态数组,可以说是Array的复杂版本,它提供了如下一些好处:

  • 动态的增加和减少元素。
  • 实现了Collection和List接口。
  • 灵活的设置数组的大小。

2、如何使用ArrayList
做一个简单的测试:

import java.util.ArrayList;

public class ArrayList_Test {
public static void main(String[] args)
{
ArrayList arrayList = new ArrayList();
for(int i=0;i<11;i++)
arrayList.add(i*5);//给数组增加11个int元素
arrayList.remove(5);//将第6个元素移除
Object[] array = arrayList.toArray();
for(Object object:array)
{
System.out.println(object.toString());
}
}
}

输出:

0
5
10
15
20
30
35
40
45
50

可能有人会疑惑,为什么不直接把arrayList转换成一个int数组呢?这样不是更加方便吗?当然是有原因的,因为ArrayList保存的是Object对象,所以用arrayList.toArray()得到的是Object对象构成的数组,而且int只是一个基本数据类型,并不是对象。那么有人会问,可以转换成int的封装类Integer的对象数组啊,没测试时,我也是这样认为的,当我将Object[]强制类型转换成Integer[]后,我运行程序时报错了,就是下面的程序。

//报错的程序:
import java.util.ArrayList;

public class ArrayList_Test {
public static void main(String[] args)
{
ArrayList arrayList = new ArrayList();
for(int i=0;i<11;i++)
arrayList.add(i*5);//给数组增加11个int元素
arrayList.remove(5);//将第6个元素移除
Integer[] array = (Integer[])arrayList.toArray();
for(Integer integer:array)
{
System.out.println(integer.intValue());
}
}
}

报错: ​​java.lang.ClassCastException​​​。
百度一查是–强制类型转换异常。
原因:
​​​java.lang.ClassCastException​​​是进行强制类型转换的时候产生的异常,强制类型转换的前提是父类引用指向的对象的类型是子类的时候才可以进行强制类型转换,如果父类引用指向的对象的类型不是子类的时候将产生​​java.lang.ClassCastException​​异常。

但是我们可以用范型去弥补这些不足:

import java.util.ArrayList;

public class ArrayList_Test {
public static void main(String[] args)
{
ArrayList<Integer> arrayList = new ArrayList<Integer>();
for(int i=0;i<11;i++)
arrayList.add(i*5);//给数组增加11个int元素
arrayList.remove(5);//将第6个元素移除
for(Integer integer:arrayList)
{
System.out.println(integer.intValue());
}
}
}

3、ArrayList重要的方法和属性
(1)构造器
ArrayList提供了三个构造器:
​​​public ArrayList()​​​:默认的构造器,将会以默认(10)的大小来初始化内部的数组。
​​​public ArrayList(Collection)​​​:用一个Collection对象来构造,并将该集合对象的元素添加到ArrayList。
​​​public ArrayList(int)​​:用指定的大小来初始化内部的数组。

(2)基本方法介绍:
下面是一些方法的介绍,后面出现的 ? 是“任意类”的意思,extends继承不多说,E 是指定类型。

​add(E o)​​ :将指定的元素追加到此列表的尾部。

​add(int index, E element)​​ :将指定的元素插入此列表中的指定位置。

​addAll(Collection< ? extends E> c)​​ :按照指定 Collection 的迭代器所返回的元素顺序,将该 Collection 中的所有元素追加到此列表的尾部。

​addAll(int index, Collection< ? extends E> c)​​ :从指定的位置开始,将指定 Collection 中的所有元素插入到此列表中。

​clear()​​ :移除此列表中的所有元素。

​contains(Object elem)​​ :如果此列表中包含指定的元素,则返回 true。

​ensureCapacity(int minCapacity)​​ :如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。

​get(int index)​​ :返回此列表中指定位置上的元素。

​indexOf(Object elem)​​ :搜索给定参数第一次出现的位置,使用 equals 方法进行相等性测试。

​isEmpty()​​:测试此列表中是否没有元素。

​lastIndexOf(Object elem)​​ :返回指定的对象在列表中最后一次出现的位置索引。

​remove(int index)​​ :移除此列表中指定位置上的元素。

​remove(Object o)​​ :从此列表中移除指定元素的单个实例(如果存在),此操作是可选的。

​set(int index, E element)​​:用指定的元素替代此列表中指定位置上的元素。

​size()​​ :返回此列表中的元素数。

​toArray()​​​ 、​​toArray(T[] a)​​ :返回一个按照正确的顺序包含此列表中所有元素的数组;返回数组的运行时类型就是指定数组的运行时类型。

注意:

  • 如果在初始化ArrayList的时候没有指定初始化长度的话,默认的长度为10。
  • ArrayList在增加新元素的时候如果超过了原始的容量的话,ArrayList扩容ensureCapacity的方案为“原始容量*3/2+1"。
  • ArrayList是线程不安全的,在多线程的情况下不要使用。
  • ArrayList实现遍历的几种方法。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test{
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("HAHAHAHA");

//第一种遍历方法使用foreach遍历List
for (String str : list) {
//也可以改写for(int i=0;i<list.size();i++)这种形式
System.out.println(str);
}

//第二种遍历,把链表变为数组相关的内容进行遍历
String[] strArray=new String[list.size()];
list.toArray(strArray);
//这里也可以改写为for(String str:strArray)这种形式
for(int i = 0 ; i < strArray.length() ; i++){
System.out.println(strArray[i]);
}

//第三种遍历 使用迭代器进行相关遍历

Iterator<String> ite=list.iterator();
while(ite.hasNext())
{
System.out.println(ite.next());
}
}
}