Java中的ArrayList表示一个可调整大小的对象列表。我们可以在这个列表中添加、删除、查找、排序和替换元素。
ArrayList
是集合框架的一部分。它扩展了 ,实现了 接口。 按层次顺序扩展了 和 接口。AbstractList
List
List
Collection
Iterable
阵列列表的层次结构
1.ArrayList的特点
ArrayList
有以下特点 -
- 有序--ArrayList中的元素保留了它们的顺序,默认是这些元素被添加到列表中的顺序。
- 基于索引- 可以使用索引位置随机访问元素。索引以
'0'
开始。 - 动态调整大小--当需要添加的元素多于其当前大小时,
ArrayList
,动态增长。 - 非同步化--ArrayList默认是不同步的。程序员需要适当地使用synchronized关键字或简单地使用Vector类。
- 允许复制--我们可以在ArrayList中添加重复的元素。这在集合中是不可能的。
2.2.ArrayList是如何工作的?
ArrayList
ArrayList类是用一个支持数组来实现的。从ArrayList中添加或删除的元素实际上是在支持数组中修改的。所有 方法都访问这个支持数组,并在同一个数组中获取/设置元素。ArrayList
ArrayList
可以被看作是Java中可调整大小的数组的实现。
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess,
Cloneable, java.io.Serializable
{
transient Object[] elementData; //backing array
private int size; //array or list size
//more code
}
3.Java数组与ArrayList
数组是一个固定大小的数据结构,它的大小必须在初始化时声明。一旦声明了数组的大小,如果不创建一个新的数组,就不可能调整其大小。
Integer[] numArray = new Integer[5];
ArrayList
提供了消除这种大小限制的方法。一个ArrayList
,可以用任何初始大小(默认为16)来创建,当我们添加更多的项目时,ArrayList的大小会动态增长,不需要程序员的任何干预。
ArrayList<Integer> numList = new ArrayList<>();
许多人把
ArrayList
称为动态数组。
4.创建一个ArrayList
4.1.如何创建一个数组?ArrayList
为了创建ArrayList
,我们可以调用它的一个构造函数。
构造函数 | 描述 |
---|---|
ArrayList() | 这是一个默认的构造函数。它创建一个空的ArrayList,初始容量为16。 |
ArrayList(int capacity) | 它创建了一个空的ArrayList,其初始容量为capacity 。 |
ArrayList(Collection<? extends E> c) | 它创建了一个ArrayList,并以集合的元素初始化c 。 |
下面的程序显示了如何在Java中声明和初始化ArrayList。
ArrayList list = new ArrayList();
List<Integer> numbers = new ArrayList<>(6);
Collection setOfElements = ...;
List<Integer> numbers = new ArrayList<>(setOfElements);
4.2.泛型ArrayList
一个通用的ArrayList清楚地提到了它要存储的对象的类型。它有助于避免因错误的类型转换而造成的很多缺陷。
//Non-generic arraylist - NOT RECOMMENDED !!
ArrayList list = new ArrayList();
//Generic Arraylist with default capacity
List<Integer> numbers = new ArrayList<>();
//Generic Arraylist with the given capacity
List<Integer> numbers = new ArrayList<>(6);
//Generic Arraylist initialized with another collection
List<Integer> numbers = new ArrayList<>( Arrays.asList(1,2,3,4,5) );
4.3.ArrayList
的原始类型
在arraylist中,我们应该只添加对象。但是如果我们需要添加原始数据类型,如int
,float
等,我们可以使用它们的封装类在arraylist初始化时提供类型信息。
当我们添加int
或float
值到arraylist时,值会被自动上传到。
在给定的例子中,我们已经创建了一个包含Integer
值的数组列表。当我们添加int
值1
,它被自动转换为new Integer(1)
。
List<Integer> numbers = new ArrayList<>(6);
numbers.add(1); // This runs fine
4.4.在单行中创建和初始化ArrayList
一般来说,创建一个数组列表是一个多步骤的过程。在第一步,我们创建一个空的数组列表。在后面的步骤中,我们用元素来填充这个列表--一个接一个。
使用Arrays.asList()
和构造函数ArrayList(collection)
,我们可以在一条语句中结合这些步骤。
ArrayList<String> charList = new ArrayList<>(Arrays.asList(("A", "B", "C"));
5.从ArrayList中获取元素
为了从ArrayList
,我们有两种方法来获取一个元素。
5.1. get(index)
如果我们事先知道索引位置,那么我们可以调用get(index)
,它将返回存在于index
位置的元素。
请记住,indexes
以零开始。
ArrayList<String> alphabetsList = new ArrayList<>(Arrays.asList(("A", "B", "C"));
String aChar = alphabetsList.get(0); // A
5.2. iterator.next()
使用iterator()
或listIterator()
来获取Iterator
实例的引用。我们可以使用这个遍历器来遍历数组中的元素。
next()
方法返回当前index
位置的元素,并将索引计数增加1。调用hasNext()
方法来检查列表中是否有更多的元素可以迭代。
ArrayList<Integer> digits = new ArrayList<>(Arrays.asList(1,2,3,4,5,6));
Iterator<Integer> iterator = digits.iterator();
while(iterator.hasNext())
{
System.out.println(iterator.next());
}
程序输出。
1
2
3
4
5
6
6.遍历数组列表
6.1.迭代器
使用Iterator在数组列表上进行迭代的Java例子。
ArrayList<Integer> digits = new ArrayList<>(Arrays.asList(1,2,3,4,5,6));
Iterator<Integer> iterator = digits.iterator();
while(iterator.hasNext())
{
System.out.println(iterator.next());
}
6.2.循环
使用for循环在数组上进行迭代的Java例子。当使用for循环时,我们需要使用当前的索引计数器来获取当前的元素。
ArrayList<Integer> digits = new ArrayList<>(Arrays.asList(1,2,3,4,5,6));
for(int i = 0; i < digits.size(); i++)
{
System.out.print(digits.get(i));
}
6.3. forEach 循环
[forEach loop](https://howtodoinjava.com/java/flow-control/enhanced-for-each-loop-in-java/)
的工作原理与简单的for循环基本相同。唯一的区别是,JVM管理计数器的初始化和增量。我们在循环的每次迭代中获得下一个元素。
ArrayList<Integer> digits = new ArrayList<>(Arrays.asList(1,2,3,4,5,6));
for(Integer d : digits)
{
System.out.print(d);
}
7.寻找数组列表的长度
为了得到数组列表的大小,我们使用size()
方法。
ArrayList<Integer> digits = new ArrayList<>(Arrays.asList(1,2,3,4,5,6));
System.out.print( digits.size() ); // 6
8.对数组列表进行排序
ArrayListsort()
方法根据指定的Comparator
实例所引起的顺序对列表进行排序。列表中的所有元素必须是相互的Comparable
。
public class AgeSorter implements Comparator<Employee>
{
@Override
public int compare(Employee e1, Employee e2) {
//comparison logic
}
}
ArrayList<Employee> employees = new ArrayList<>();
employees.add(new Employee(...));
employees.add(new Employee(...));
employees.add(new Employee(...));
employees.sort(new NameSorter());
9.结语
在这个Java教程中,我们学习了如何在Java中使用ArraysLists。我们学会了在ArrayList类中创建、修改和执行高级操作。