ArrayList
一、ArrayList类概述
ArrayList类是一个可以动态变化的数组,与普通数组的区别就是它没有固定的长度。对于ArrayList的理解和应用,需要掌握其容量、扩容条件、add、get、remove、遍历删除等方法的使用,以及其底层数据结构和线程安全性等。
ArrayList继承了AbstractList,并实现了List接口。
二、引入语法格式:
ArrayList objectName = new ArrayList<>();//E:泛指数据类型,用于设置objectName的数组类型
三、ArrayList初始容量及扩容:
- ArrayList的初始容量是指创建ArrayList对象时所分配的内存空间大小。在Java中,如果没有为ArrayList指定初始容量,它将自动分配一个默认的初始容量0。
- 当向ArrayList中添加元素时,如果元素的数量超过了当前容量,ArrayList会自动扩容。默认的扩容机制是将容量增加原来容量的1.5倍。需要注意的是,扩容操作会重新分配内存空间,并将原有元素复制到新空间中,这个过程需要消耗一定的时间。
- 如果你在创建ArrayList对象时指定了初始容量,那么ArrayList的初始容量就是这个指定的容量值。例如,如果你写“ArrayList list = new ArrayList(10);”,那么list的初始容量就是10。
四、ArrayList是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
1.添加元素:
添加元素到ArrayList可以使用add()方法:
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<String> arrList = new ArrayList<String>();
arrList.add("吐泡泡");
arrList.add("SpitBubble");
System.out.println(arrList);
}
}
输出结果
[吐泡泡, SpitBubble]
2.访问元素:
访问ArrayList中的元素可以使用get()方法:
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<String> arrList = new ArrayList<String>();
arrList.add("吐泡泡");
arrList.add("SpitBubble");
System.out.println(arrList);
System.out.println(arrList.get(0));//get()方法访问元素,索引从0开始
System.out.println(arrList.get(1));
}
}
输出结果
[吐泡泡, SpitBubble]
吐泡泡
SpitBubble
3.修改元素
修改ArrayList中的元素使用set()方法:
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> arrList = new ArrayList<>();
arrList.add("吐泡泡");
arrList.add("SpitBubble");
System.out.println(arrList);
System.out.println(arrList.get(0));
System.out.println(arrList.get(1));
arrList.set(0,"Java");//修改链表中的索引为0的元素
System.out.println("修改后的数据为:\n"+arrList.get(0));
System.out.println(arrList.get(1));
}
}
输出结果
[吐泡泡, SpitBubble]
吐泡泡
SpitBubble
修改后的数据为:
Java
SpitBubble
4.删除元素
删除ArrayLIst中的元素可以使用remove()方法:
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> arrList = new ArrayList<>();
arrList.add("吐泡泡");
arrList.add("SpitBubble");
System.out.println(arrList);
arrList.remove(0);
System.out.println(arrList);
}
}
输出结果
[吐泡泡, SpitBubble]
移除索引为0的数组后:[SpitBubble]
5.ArrayLIst长度
计算ArrayLIst中元素的数量使用size()方法:
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> arrList = new ArrayList<>();
arrList.add("吐泡泡");
arrList.add("SpitBubble");
System.out.println("arrList的长度是:" + arrList.size());
}
}
输出结果
arrList的长度是:2
五、ArrayList的迭代
1.for循环迭代数组列表中的元素:
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> arrList = new ArrayList<>();
arrList.add("吐泡泡");
arrList.add("SpitBubble");
arrList.add("Java");
//循环遍历数组
for(int i = 0 ; i < arrList.length ; i++){
System.out.println("arrList.get(i)");
}
}
}
输出结果
吐泡泡
SpitBubble
Java
2.for-each迭代数组列表元素:
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> arrList = new ArrayList<>();
arrList.add("吐泡泡");
arrList.add("SpitBubble");
arrList.add("Java");
//循环遍历数组
for(String i : arrList ){
System.out.println("arrList.get(i)");
}
}
}
输出结果
吐泡泡
SpitBubble
Java
3.迭代器(Iterator)遍历数组列表元素:
调用ArrayList的iterator方法来获取一个迭代器对象,然后使用while循环和hasNext方法来遍历ArrayList中的元素。在每次循环中,我们调用next方法来获取下一个元素,并将其打印到控制台上。
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
ArrayList<String> arrList = new ArrayList<String>();
arrList.add("吐泡泡");
arrList.add("SpitBubble");
arrList.add("Java");
// 使用迭代器遍历ArrayList
Iterator<String> it = arrList.iterator();
while (it.hasNext()) {
String element = it.next();
System.out.println(element);
}
}
}
输出结果
吐泡泡
SpitBubble
Java
六、底层数据结构
在使用ArrayList时,可以通过add、get、remove等方法来添加、查询和删除元素。这些方法的具体实现是通过操作底层的数据结构——数组来完成的。例如,add方法会将元素添加到数组的末尾,get方法会根据索引值计算出元素在数组中的位置,并返回该位置上的元素,remove方法会根据元素的值查找该元素在数组中的位置,并将该位置上的元素置为null,并更新size属性。
由于ArrayList的底层数据结构是数组,因此在查询和遍历元素时,速度非常快。但是,在添加和删除元素时,由于需要重新分配内存空间和复制数组,因此速度比较慢。为了提高程序的效率,可以使用一些优化技巧,例如使用扩容机制和预分配初始容量等。
总之,ArrayList的底层数据结构是数组,这种数据结构在查询和遍历元素时非常高效,但是在添加和删除元素时可能会比较慢。为了提高程序效率,可以使用扩容机制和预分配初始容量等优化技巧。