List接口
要了解List接口,就不得不说起Java的集合框架。
Collection接口和Map接口
Java 集合框架主要包括两种类型的容器,集合Collection和图Map。
- Collection接口代表了单列集合,它包含了一组Object元素,每个元素都有一个值。
(这里有个“泛型擦除”的概念,在此不提及有兴趣可自行了解) - Map接口代表了双列集合,它包含了一组键值对,每个键值对包含两个值,一个是键,一个是对应的值。
List
Collection 接口又有 3 种子类型,List、Set 和 Queue。
- List 接口存储一组不唯一,有序(插入顺序)的对象。
- 不唯一:允许存储重复的元素。
- 有序:可以精准控制元素添加的位置,因此可以根据索引访问元素。
- <实现类有ArrayList,LinkedList,Vector> 。
- Set 接口存储一组唯一,无序的对象。
- 唯一:元素不允许重复。
- 无序:没有定义顺序,元素的存储顺序可能与添加顺序不同。
- Queue接口:一个先进先出(FIFO)的集合,通常用于模拟队列数据结构。
静态数组
概念
- 是一种线性数据结构。
- 将相同类型的元素存储在连续的内存空间中。
初始化
java中两种创建静态数组的形式如下,
int[] array = new int[5]; // { 0, 0, 0, 0, 0 }
int[] iarray = { 1, 2, 3, 5, 4 };
- 第一行代码创建了一个名叫array的数组,长度大小为5,并且数组的长度大小不能改变。
- 注释的意思是,java会自动给数组内的元素赋值为默认值,即int型的默认值0。
- 第二行代码创建了一个名叫iarray的数组,长度大小为5,并且长度大小也无法改变,且编写者主动赋值为一到五的数字。
ArrayList类
概念和性质
- ArrayList 继承了 AbstractList类 ,并实现了 List 接口。
(AbstractList是List接口的抽象实现类,它继承自AbstractCollection类,并实现了List接口中的方法。) - ArrayList基于动态数组实现,内部使用一个数组来存储元素,当数组容量不足时,会进行扩容操作,通常创建一个新的更大的数组,并将原数组的元素复制到新数组中。
- 插入删除性能:
- 倘若在末尾进行插入和删除操作的性能较好
- 但若在中间或开头进行插入删除操作时,需要移动后续元素,性能较差。
- 随机访问性能:支持通过索引进行快速的随机访问,效率较快。
使用
初始化
ArrayList初始化的基本格式如下,
import java.util.ArrayList; // 引入 ArrayList 类
ArrayList<ElemType> objectName =new ArrayList<>(); // 初始化
ElemType是数组中对象(元素)的引用类型数据,objectName是数组名字。
(注意注意下文中的Element是ElemType引用类型的基本类型。)
(因为实际ArrayList中的元素是对象,所以需要引用类型)
(String可以像使用基本类型一样,但实际是引用类型)
基本类型 | 引用类型 |
boolean | Boolean |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
例如,
import java.util.ArrayList;
ArrayList<Integer> arrayList =new ArrayList<>();
避免繁琐后边的代码例子中引入 ArrayList 类就不写了。
add() 添加元素
ArrayList<ElemType> objectName =new ArrayList<>();
objectName.add(ElemType e);
objectName.add(InterPre i, ElemType e);
可以看到,add()函数有两种添加方法,
- 直接在数组的末尾添加元素e;
- 在索引 i 前面添加元素e;
如,
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(0,6);
for(int i : arrayList) System.out.print(i + " ");//这里的for循环迭代是依次得到数组中的元素,后边会讲
//输出:6 1 2 3
remove() 删除元素
ArrayList<ElemType> objectName =new ArrayList<>();
objectName.remove(index i);
作用:删除索引为 i 上的元素,如
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.remove(2);
for(int i : arrayList) System.out.print(i + " ");
//输出:1 2
get() 访问元素
ArrayList<ElemType> objectName =new ArrayList<>();
objectName.get(index i);
作用:返回索引为i处上的元素,如
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
System.out.println(arrayList.get(2));
//输出:3
set() 修改元素
ArrayList<ElemType> objectName =new ArrayList<>();
objectName.set(index i, ElemType e);
作用:将索引为 i 上的元素修改为 e,如
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.set(1,6);
for(int i : arrayList) System.out.print(i + " ");
//输出:1 6 3
size() 元素数量
int ArrayLength = arrayList.size();
作用:**返回数组的长度,**赋值给ArrayLenth。如,
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
System.out.println(arrayList.size());
//输出:3
其余函数
下面就不给出示例代码和输出结果啦,太多了,但是会给出基本格式和用法。
ArrayList<ElemType> arraylist =new ArrayList<>();
- void arraylist.clear() :删除arraylist 中的所有元素
- boolean arraylist.contains(ElemType e) :判断元素e是否在arraylist中,如果在返回true,否则返回false
- int arraylist.indexOf(ElemType e) :返回元素e在arraylist中的索引
- 若重复出现,返回最先的索引值;
- 若不存在,返回-1。
- boolean arraylist.isEmpty() :判断arraylist是否为空,为空返回true,否则返回false
- void arraylist.removeAll() :作用与arraylist.clear()相同,但是arraylist.clear()时间更快。
- void arraylist.sort(): 将数组排序,使用方法这里略过后面详细说明。
- Elem[] arraylist.toArray(Elem[] num) :将arraylist转化为数组赋给num,数组的元素类型为同引用类型的基本类型。
- String arraylist.toString():将arraylist转化为String类型返回。
迭代数组列表
第一种,通过普通for循环迭代,依次输出arraylist中的元素。
ArrayList<ElemType> arraylist = new ArrayList<>();
/*
......
(赋值操作)
*/
for (int i = 0; i < arraylist.size(); i++)
System.out.println(arraylist.get(i));
第二种,通过for-each迭代,依次输出arraylist中的元素,也就是上文给出的方式。
ArrayList<ElemType> arraylist = new ArrayList<>();
/*
......
(赋值操作)
*/
for (Element e : arraylist)
System.out.println(e);
注意Element是ElemType引用类型的基本类型。
ArrayList排序
借助Collections 类
import java.util.Collections; // 引入 Collections 类
Collections.sort(arraylist);
注意Collections.sort()是升序排序(从小到大)。
本身的sort() 方法
arraylist.sort(Comparator c)
Comparator c 的意思是排序方式,分别为升序和降序。
- 升序参数为 Comparator.naturalOrder()
- 降序参数为 Comparator.reverseOrder()
注意要使用这两个参数,需要引入Comparator类。
实例如下,
import java.util.Comparator;
arraylist.sort( Comparator.naturalOrder()) ;
//得到数组升序排序的结果(从小到大)
arraylist.sort( Comparator.reverseOrder());
//得到数组降序排序的结果(从大到小)