目录
一.简单介绍
二.ArrayList的底层结构
2.1ArrayList的底层结构和操作分析
2.ArrayList 底层源码分析
三.ArrayList 方法
四.代码使用方法
一.简单介绍
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
ArrayList 继承了 AbstractList ,并实现了 List 接口。
ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下:
import java.util.ArrayList; // 引入 ArrayList 类
ArrayList<E> objectName =new ArrayList<>(); // 初始化
- E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
- objectName: 对象名。
ArrayList 是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
二.ArrayList的底层结构
2.1ArrayList的底层结构和操作分析
1、ArrayList的底层结构是一个Object[] elementData,即一个Object类型的数组。
2、创建ArrayList对象时,如果采用的是无参构造器,则数组初始空间为0,第一次添加数组空间扩容至10,如需再次扩容,则扩容至原数组空间的1.5倍。
3、如果采用的是有参构造器,则数组初始空间为传入的参数值,如需再次扩容,则扩容至原数组空间的1.5倍。
4、添加元素的顺序与取出元素的顺序相同。
5、每个元素都有对应的索引,即可以通过索引查找元素。
6、ArrayList可以添加多个null,也可以添加相同元素。
2.ArrayList 底层源码分析
证明ArrayList的底层结构是一个Object类型的数组
1、Debug进入ArrayList arrayList = new ArrayList(),分析ArrayList的底层结构
文档注释表达: 构造一个初始容量为10的空列表。
2、再进入elementData,我们可以看见ArrayList的底层结构是一个Object[] elementData,即一个Object类型的数组。
文档注释: 数组缓冲区,数组列表的元素被存储在其中。
数组列表的容量是这个数组缓冲区的长度。任何空数组列表与elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA将在添加第一个元素时扩展为 DEFAULT_CAPACITY。
3、因为采用的是无参构造器,所以数组初始空间为0,为了证实我们进入DEFAULTCAPACITY_EMPTY_ELEMENTDATA。
源码解释: 用于默认大小的空实例的共享空数组实例。我们将此与EMPTY_ELEMENTDATA区分,以了解何时膨胀多少第一个元素被添加。
4、如果采用的是有参构造器,例如:ArrayList arrayList1 = new ArrayList(8);,Debug进入
文档注释:构造一个具有指定初始容量的空列表。
* @param initialCapacity列表的初始容量
* @抛出IllegalArgumentException如果指定的初始容量为负
此时initialCapacity = 8,满足第一个if条件,所以elementData的初始空间为8。
三.ArrayList的方法(api)
三.ArrayList 方法
Java ArrayList 常用方法列表如下:
方法 | 描述 |
---|---|
add() | 将元素插入到指定位置的 arraylist 中 |
addAll() | 添加集合中的所有元素到 arraylist 中 |
clear() | 删除 arraylist 中的所有元素 |
clone() | 复制一份 arraylist |
contains() | 判断元素是否在 arraylist |
get() | 通过索引值获取 arraylist 中的元素 |
indexOf() | 返回 arraylist 中元素的索引值 |
removeAll() | 删除存在于指定集合中的 arraylist 里的所有元素 |
remove() | 删除 arraylist 里的单个元素 |
size() | 返回 arraylist 里元素数量 |
isEmpty() | 判断 arraylist 是否为空 |
subList() | 截取部分 arraylist 的元素 |
set() | 替换 arraylist 中指定索引的元素 |
sort() | 对 arraylist 元素进行排序 |
toArray() | 将 arraylist 转换为数组 |
toString() | 将 arraylist 转换为字符串 |
ensureCapacity() | 设置指定容量大小的 arraylist |
lastIndexOf() | 返回指定元素在 arraylist 中最后一次出现的位置 |
retainAll() | 保留 arraylist 中在指定集合中也存在的那些元素 |
containsAll() | 查看 arraylist 是否包含指定集合中的所有元素 |
trimToSize() | 将 arraylist 中的容量调整为数组中的元素个数 |
removeRange() | 删除 arraylist 中指定索引之间存在的元素 |
replaceAll() | 将给定的操作内容替换掉数组中每一个元素 |
removeIf() | 删除所有满足特定条件的 arraylist 元素 |
forEach() | 遍历 arraylist 中每一个元素并执行特定操作 |
四.代码使用方法
Demo1:
/**
* java.util.List接口
* List继承自Collection.List集合是可重复集,并且有序,提供了一套可以通过下标操作元素的方法
* 常用实现类:
* java.util.ArrayList:内部使用数组实现,查询性更好,
* java.util.LinkedList:内部使用链表实现,首尾增删元素效果更好。
*
*/
public class ListDemo1 {
public static void main(String[] args) {
List<String>list=new ArrayList<>();
// List<String>list=new LinkedList<>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
list.add("five");
System.out.println(list);
/*
E get(int index)
获取当前list集合中指定下标中第三个元素
*/
//获取集合第三个元素
String str=list.get(2);
System.out.println(str);
//for循环遍历List集合
for (int i=0;i<list.size();i++){
str= list.get(i);
System.out.println(str);
}
/*
E set(int index ,E e)
将给定元素设置到指定位置上,返回值为该位置原来对应的元素。
替换操作
*/
//two
//[one two three four five]
String old=list.set(1,"six");
System.out.println(list);
System.out.println("被替换的元素是:"+old);
/*
将集合反转
*/
//[five four three six one]
for (int i=0;i<list.size()/2;i++){
//获取正数位置上的元素
String e=list.get(i);
//将正数位置上的元素放到倒数位置上
e=list.set(list.size()-1-i,e);
//再将原倒数位置上的元素设置到整数位置上
list.set(i,e);
}
System.out.println(list);
//将集合翻转
for(int i=0;i<list.size()>>2;i++){
//获取正数上位置的元素
String e=list.get(i);
//将正数位置上的元素设置到整数位置上
e=list.set(list.size()-1-i,e);
list.set(i,e);
}
System.out.println(list);
/*
java.util.Collection 是集合工具类,里面提供很多静态方法,可以随便
操作集合
*/
//翻转List集合
Collections.reverse(list);
System.out.println(list);
}
代码结果
Demo2:
/**
* list集合提供了一对重载的add,remove方法
*/
public class ListDemo2 {
public static void main(String[] args) {
List<String>list=new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
list.add("five");
System.out.println(list);
/*
void add(int index,E e)
讲给定元素插入到指定位置
*/
//[one two six three four five]
list.add(2,"six");
System.out.println(list);
/*
E remove(int index)
删除并返回给定位置上的元素
*/
String old=list.remove(3);
System.out.println(list);
System.out.println("被删除的元素是:"+old);
}
}
输出结果:
Demo3
**
* List集合支持获取子集操作
*
* List subList(int start,int end)
* 获取当前集合中指定范围内的子集,两个数字表示下标范围,含头不含尾
*/
public class ListDemo3 {
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
for (int i=0;i<10;i++) {
list.add(i);
}
System.out.println(list);
//获取[3-7]
List<Integer>subList=list.subList(3,8);
System.out.println(subList);
//将数组扩大10倍
//for (int i=0;i<subList.size();i++){
// int n=subList.get(i);
// n=n*10;
// subList.set(i,n);
//}
for (int i=0;i<subList.size();i++){
subList.set(i,subList.get(i)*10);
}
//[30,40 50 60 70]
System.out.println(subList);
//对子集的操作就是对原集合对应元素的操作
System.out.println(list);
//删除list集合中[2-8]
list.subList(2,9).clear();
System.out.println(list);
}
}
输出结果: