学习任务:

视频学习

ArrayList介绍

ArrayList方法概览

动手测试ArrayList入门程序

小结

ArrayList是List接口的实现类,它表示动态数组,何为动态数组?

我们定义一个数组类型的变量需要指定数组的长度,长度一旦指定就无法扩容,比如:我们定义一个100个元素长度的数组,当需要存储的元素个数达到100以上时多余的元素将无法存储,ArrayList动态数组可以解决这个问题,ArrayList可以实现自动扩容数组。

ArrayList的特点如下:

1)查询快

ArrayList的底层是数组,根据索引查询元素速度很快。

2)增删慢

向数组添加或删除元素后需要移动其它元素位置,所以对于频繁增删的需求不建议使用ArrayList。

3)线程不安全

在多线程章节会讲解线程安全的问题,这里先简单理解为当多线程访问ArrayList 中的元素时会出现数据错误的问题。

ArrayList实现了List接口,List接口继承Collection接口,下边介绍Collection接口及List特有的接口:

1)Collection接口

Collection表示一个集合,它所定义的方法为List、Set、Queue所共有的抽象方法,常用的方法如下:

image-20201009173513391

image-20201009173525191

2)List接口

List继承Collection接口:

image-20201009173932637

image-20201009173948450

image-20201009173958737

其中下边的方法是List接口新增方法:

返回此列表中指定位置的元素。
E get(int index) 
用指定的元素(可选操作)替换此列表中指定位置的元素。  
E set(int index, E element) 
将指定的元素插入此列表中的指定位置(可选操作)。 
void add(int index, E element) 
删除该列表中指定位置的元素(可选操作)。
E remove(int index) 
  

本入门程序实现如下功能:

1)构造一个ArrayList集合

查看ArrayList的Api文档,有一个无参构造函数,暂时使用无参构造函数。

2)向集合添加字符串元素

调用add方法添加元素,如下:

boolean add(E e)  

通过Api可知ArrayList支持泛型,有了泛型就可以限制ArrayList集合添加的元素类型。

3)根据索引查询元素

调用get方法根据索引查询元素,如下:

E get(int index)  

如果指定了泛型get返回指定类型的元素。

4) 遍历所有元素

遍历ArrayList可以使用Iterator,这里暂时使用for循环调用get方法查询每一个元素。

5)根据索引删除元素

调用remove方法删除元素,remove有两个方法,如下:

//删除该列表中指定位置的元素。 
E remove(int index)  
//从列表中删除指定元素的第一个出现(如果存在)。 
boolean remove(Object o)  

这里使用第一个方法根据索引删除元素。

代码如下:

package com.pbteach.javase.oop.arraylist.test1;

import java.util.ArrayList;
import java.util.List;


/**
 * ArrayList入门程序
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class ArrayListTest1 {
	
	
	//添加元素(字符串)
	public static void add() {
		
		//ArrayList支持泛型定义如果不指定泛型参数可以添加任何引用类型的元素
		List list_1 = new ArrayList();
		list_1.add("www.pbteach.com");//添加字符串
		list_1.add(new Integer(100));//添加整数
		list_1.add(101);//添加基本类型将自动转为包装类型
		System.out.println(list_1.get(1));
		//遍历
		querylist(list_1);
		
		//建议定义ArrayList时使用泛型
//		List<String> list = new ArrayList<String>();
		//上边的代码也可以写为
		List<String> list_2 = new ArrayList<>();
		
		//添加元素
		list_2.add("hello");
		list_2.add("pbteach");
		list_2.add(".com");
		//遍历
		querylist(list_2);
	}
	
	//遍历
	public static void querylist(List list) {
		//使用get方法访问ArrayList元素,指定下标,与数组一样下标不能超界限
		Object object = list.get(100);
		
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
	}
	//删除元素(字符串)
	public static void delete() {
//		List<String> list = new ArrayList<String>();
		//上边的代码也可以写为
		List<String> list = new ArrayList<>();
		
		//添加元素
		list.add("hello");
		list.add("hello");
		list.add("pbteach");
		list.add(".com");
		//删除第0个元素,注意下标不能越界
		list.remove(0);
		//遍历
		querylist(list);
	}
	
	public static void main(String[] args) {
		//添加元素
		add();
		//删除元素
		delete();
	}

}

通过ArrayList入门程序总结如下:

1)定义ArrayList无需指定长度。

2)ArrayList是有序的,即添加元素和输出元素的顺序一致。

3)ArrayList中可以添加重复元素。

4)ArrayList支持泛型,建议使用泛型。

如果不指定泛型参数则ArrayList中可以添加任何引用类型,如果添加基本类型的数据将自动转为包装类型。

5)下标不能越界。

使用get方法通过下标访问ArrayList的元素,下标和数组的下标一样,不能超过ArrayList的下标界限,否则 会报java.lang.IndexOutOfBoundsException异常。

6)部分可选操作的方法

接口文档中说明此方法是“ 可选操作” 是说明该方法在实现类中可以实现也可不实现,因为该方法在抽象类中已经有默认实现。

为什么add、remove方法都是可选操作呢?

查看源代码果然在抽象类AbstractCollection中对add方法进行了实现,代码如下:

image-20201010103955734

此方法总是抛出一个unsupportedOperationException的异常,说明此方法在抽象类中不可正常使用。

因为并不是所有Collection实现类都提供add方法的,有些Collection集合是只读的,不允许添加、删除元素,此时就不允许调用add和remove,比如:Arrays.asList方法接收变长参数创建一个不可修改的ArrayList。

//创建一个不可修改的List
List<String> list2 = Arrays.asList("www","pbteach");
//执行add抛出异常java.lang.UnsupportedOperationException
list2.add("www.pbteach.com");
提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题