目录
- 1. 初识集合框架
- 2. ArrayList的介绍
- 3. ArrayList的使用
- 3.1 构造方法
- 3.2 add
- 3.3 addAll
- 3.4 remove
- 3.5 get
- 3.6 set
- 3.7 contains
- 3.8 IndexOf
- 3.9 lastIndexOf
- 3.10 subList
- 4. ArrayList的遍历
- 4.1 简单粗暴法
- 4.2 循环遍历法
- 4.3 迭代器
1. 初识集合框架
Java集合框架是Java编程语言提供的一组接口和类,用于存储和操作数据。它提供了各种类型的集合,如列表、集合、映射等,以及用于操作和管理集合的接口和类。
Java集合框架主要包括以下部分:蓝色代表接口,红色代表类,黄色代表抽象类
前面我们自己实现了一个顺序表:Java数据结构-顺序表,那么我们每次想要使用这个数据结构的时候,都需要自己实现一遍吗?不需要!Java给我们提供了ArrayList这个类,我们使用它就好了!
2. ArrayList的介绍
ArrayList是集合框架中的一个泛型类,可以存储任意的数据,使用可以传递类型,它实现了List接口,ArrayList的本质其实是一个数组。ArrayList使用方法有两种:
ArrayList<Integer> arr = new ArrayList<>();List<Integer> list = new ArrayList<>();
这两个区别在于:List是一个接口,ArrayList是一个类,因为ArrayList实现了List接口,所以List中有的方法arr都可以调用,并且arr还能调用ArrayList独有的方法。所以ArrayList能调用的方法更多
3. ArrayList的使用
下面列举了一些ArrayList的常用方法
3.1 构造方法
ArrayList的构造方法有3个
第一个:不带参数的构造方法
可以看出,调用不带参数的构造方法时,并没有给数组分配内存,数组长度是0
第二个:带一个整型类型参数的构造方法
initialCapacity表示初始容量,也就是说,我们可以通过参数来指定数组的大小
第三个:
这个参数有点奇怪,它表示:只要是Collection本身或者实现了Collection接口的都能进行传递
举个例子:
从LinkedList第一张图可以看到,LinkedList是实现了Collection接口的,所以下面代码中list也能作为参数传递给ArrayList,这样可以把list中所有的数据全部添加到arr1中
public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(100);ArrayList<Integer> arr1 = new ArrayList<>(list);arr1.add(99);System.out.println(arr1);}
3.2 add
add方法的功能:在顺序表的末尾添加数据
add的原理:如果说,实例化ArrayList,调用不带参数的构造方法时,没有分配内存,数组长度是0,那么add是如何添加的?来看源码:
总结:调用不带参数的构造方法,第一次add时,会给数组分配大小为10的内存,如果容量不够,会自动扩容1.5倍
3.3 addAll
将指定集合的所有元素插入列表,可以指定插入位置,如果不指定默认是尾插
原型:
public boolean addAll(int index, Collection<? extends E> c);
public boolean addAll(Collection<? extends E> c);
举例:arr1中有1 ,2,3 , 4,arr2有99,将arr1整体插入arr2
public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(3);arr1.add(4);ArrayList<Integer> arr2 = new ArrayList<>();arr2.add(99);System.out.println("arr2在addAll之前:");System.out.println(arr2);arr2.addAll(arr1);System.out.println("addAll之后:");System.out.println(arr2);}
输出结果:
3.4 remove
删除元素,如果参数为整数,表示删除该下标的值,如果参数为一个对象,表示删除列表中的这个元素
原型:
public E remove(int index);
public boolean remove(Object o);
例:
public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(3);arr1.add(4);System.out.println("删除前 " + arr1);arr1.remove(0);System.out.println("删除0下标 " + arr1);arr1.remove(Integer.valueOf(3));System.out.println("删除3这个元素 " + arr1);}
输出结果:
3.5 get
获取index下标位置的元素
原型:
public E get(int index);
3.6 set
将index下标位置设置为element
原型:
public E set(int index, E element);
例:
public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(3);arr1.add(4);System.out.println("set前" + arr1);arr1.set(0, 99);System.out.println("set后" + arr1);}
输出结果:
3.7 contains
判断列表中是否包含某个元素,如果包含返回true,否则返回false
例:
public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(3);arr1.add(4);System.out.println(arr1.contains(1));System.out.println(arr1.contains(99));}
输出结果:
3.8 IndexOf
获取第一次出现的o的下标,如果不包含o返回-1
public int indexOf(Object o);
例:
public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(3);arr1.add(4);System.out.println(arr1.indexOf(3));System.out.println(arr1.indexOf(99));}
输出结果:
3.9 lastIndexOf
原型:
public int lastIndexOf(Object o);
返回最后一次出现的o的下标
例:
public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(1);arr1.add(4);System.out.println(arr1.lastIndexOf(1));}
输出结果:
3.10 subList
public List<E> subList(int fromIndex, int toIndex);
截取部分List,从fromIndex下标截取到toIndex(不包括toIndex),截取的结果不是生成新的列表,而是保存fromIndex的位置,所以修改截取部分的内容的同时也会修改原来的列表
例如:
public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(1);arr1.add(4);List<Integer> list = arr1.subList(1, 3);System.out.println("截取后的list" + list);System.out.println("修改前" + list);list.set(0, 99);System.out.println("修改前" + list);}
输出结果:
4. ArrayList的遍历
4.1 简单粗暴法
直接使用System.out.println输出,因为重写了toString方法,所以会按一定的格式输出所有元素
例:
public static void main(String[] args) {ArrayList<Integer> arr = new ArrayList<>();arr.add(1);arr.add(2);arr.add(3);arr.add(4);System.out.println(arr);}
输出结果:
4.2 循环遍历法
使用for循环遍历或者for each
例:
for循环:
public static void main(String[] args) {ArrayList<Integer> arr = new ArrayList<>();arr.add(1);arr.add(2);arr.add(3);arr.add(4);for (int i = 0; i < arr.size(); i++) {System.out.print(arr.get(i) + " ");}}
输出结果:
for each
public static void main(String[] args) {ArrayList<Integer> arr = new ArrayList<>();arr.add(1);arr.add(2);arr.add(3);arr.add(4);//冒号左边也可以是基本数据类型(会自动拆箱)for (Integer x : arr) {System.out.print(x + " ");}}
输出结果:
4.3 迭代器
使用Iterator:
public static void main(String[] args) {ArrayList<Integer> arr = new ArrayList<>();arr.add(1);arr.add(2);arr.add(3);arr.add(4);//迭代器IteratorIterator<Integer> it = arr.iterator();while (it.hasNext()) {System.out.print(it.next() + " ");}}
输出结果:
使用ListIterator
public static void main(String[] args) {ArrayList<Integer> arr = new ArrayList<>();arr.add(1);arr.add(2);arr.add(3);arr.add(4);//ListIterator:List专属迭代器 顺序遍历ListIterator<Integer> it = arr.listIterator();while (it.hasNext()) {System.out.print(it.next() + " ");}}
输出结果:
public static void main(String[] args) {ArrayList<Integer> arr = new ArrayList<>();arr.add(1);arr.add(2);arr.add(3);arr.add(4);//ListIterator:List专属迭代器)倒序遍历ListIterator<Integer> it = arr.listIterator(arr.size());while (it.hasPrevious()) {System.out.print(it.previous() + " ");}}
输出结果:
今天的内容就到这里,感谢老铁们的点赞、收藏、评论~❤