一、ArrayList简介
Java中的ArrayList是一种动态数组,可以实现可变长度的数组功能。ArrayList继承了AbstractList类,并且实现了List接口,能够进行快速的元素访问和简单的增删操作。
ArrayList中的元素可以是任意对象,不支持基本数据类型,需要使用其包装类。ArrayList会自动进行扩容和缩容,对于数据量大或者不确定的情况下,使用ArrayList非常方便。
二、ArrayList的基本使用
要使用ArrayList,需要在代码中引入java.util包。
import java.util.ArrayList;
创建一个ArrayList对象的方式为:
ArrayList<String> list = new ArrayList<>();
上面的代码定义了一个元素类型为String的ArrayList对象list,其中<>表示泛型的语法糖,可以在Java7之后自动推导泛型类型,不必在尖括号中重复定义元素类型。
接下来,我们可以向ArrayList添加元素:
list.add("Java"); list.add("Python"); list.add("C++");
使用add()方法可以添加元素到ArrayList中,支持添加任何对象。如果添加的元素是基本数据类型,则需要使用其包装类。
获取ArrayList的元素数量可以使用size()方法:
int size = list.size(); System.out.println("The size of the list is: " + size);
如果要获取ArrayList中的某个元素,可以使用get()方法并传入元素索引:
String firstElement = list.get(0); System.out.println("The first element is: " + firstElement);
ArrayList中的索引从0开始,与数组相同。如果获取超出范围的元素,将会抛出IndexOutOfBoundsException异常。
删除ArrayList中的某个元素可以使用remove()方法:
list.remove(1);
上面的代码删除了索引为1的元素,也就是第二个元素Python。如果要删除ArrayList中的所有元素,可以使用clear()方法:
list.clear();
三、ArrayList的遍历
ArrayList提供了多种遍历方式,具体可以根据实际需要进行选择。
1、使用for循环遍历
for(int i=0; i < list.size(); i++) { String element = list.get(i); System.out.println("Element " + i + ": " + element); }
利用for循环和get()方法可以遍历ArrayList中的所有元素。index为元素索引,element为元素值。
2、使用foreach循环遍历
for(String element : list) { System.out.println(element); }
利用foreach循环可以遍历ArrayList中的所有元素,element为元素值。
3、使用迭代器遍历
Iterator<String> iterator = list.iterator(); while(iterator.hasNext()) { String element = iterator.next(); System.out.println(element); }
利用迭代器可以遍历ArrayList中的所有元素,next()方法获取当前位置的元素值,hasNext()方法判断是否存在下一个元素。
四、ArrayList的排序
要对ArrayList进行排序,首先需要实现Comparator接口,其中的compare()方法用于定义比较规则。
class SortArrayList implements Comparator<String> { public int compare(String s1, String s2) { return s1.compareTo(s2); } }
上面的代码定义了一个SortArrayList类,实现了Comparator接口,并重写了compare()方法。在本例子中,我们使用了String类的compareTo()方法来进行字符串的比较。
接下来,使用Collections类的sort()方法对ArrayList进行排序,传入自定义的比较器对象:
Collections.sort(list, new SortArrayList());
上面的代码对ArrayList进行了排序,并使用foreach循环输出了排序后的结果。
for(String element : list) { System.out.println(element); }
五、ArrayList的复制和截取
要对ArrayList进行复制,可以使用clone()方法或者构造一个新的ArrayList对象并将原ArrayList对象传入构造函数。对于小规模的ArrayList,使用clone()方法更为便利:
ArrayList<String> copyList = (ArrayList<String>)list.clone();
上面的代码复制了一个ArrayList对象,并将结果保存在copyList中。
对于大规模的ArrayList,使用构造函数相对更为高效:
ArrayList<String> subList = new ArrayList<>(list.subList(1, 4));
上面的代码截取了从第二个元素(索引为1)起至第四个元素(索引为3)结束的子集合,然后构造一个新的ArrayList对象,并将该子集合作为参数传递给构造函数。
六、ArrayList的同步
如果需要对ArrayList进行线程同步,可以使用Collections类中的synchronizedList()方法:
List<String> synchronizedList = Collections.synchronizedList(list);
上面的代码返回一个线程安全的ArrayList对象,对这个对象进行操作时会自动进行线程同步。
七、代码示例
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; public class ArrayListDemo { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("Java"); list.add("Python"); list.add("C++"); int size = list.size(); System.out.println("The size of the list is: " + size); String firstElement = list.get(0); System.out.println("The first element is: " + firstElement); list.remove(1); list.clear(); list.add("Java"); list.add("Python"); list.add("C++"); // 使用for循环遍历 for(int i=0; i < list.size(); i++) { String element = list.get(i); System.out.println("Element " + i + ": " + element); } // 使用foreach循环遍历 for(String element : list) { System.out.println(element); } // 使用迭代器遍历 Iterator<String> iterator = list.iterator(); while(iterator.hasNext()) { String element = iterator.next(); System.out.println(element); } // 排序 class SortArrayList implements Comparator<String> { public int compare(String s1, String s2) { return s1.compareTo(s2); } } Collections.sort(list, new SortArrayList()); for(String element : list) { System.out.println(element); } // 复制和截取 ArrayList<String> copyList = (ArrayList<String>)list.clone(); ArrayList<String> subList = new ArrayList<>(list.subList(1, 4)); // 同步 List<String> synchronizedList = Collections.synchronizedList(list); } }