-
集合框架
•集合又称为容器,用于存储、提取、删除数据。JDK提供的集合API都包含在 java.util 包内。
•集合框架两大分支:Collection接口和Map接口
-
Collection集合
-
List接口
•概述
1.List接口继承Collection接口;
2.该接口属于数据结构中的线性结构,用户可以根据元素的整数索引来访问元素;
•List接口实现类
1.ArrayList(数组线性表)
a.List 接口的实现类。其内部基于一个大小可变数组来存储
b.允许存储 null 元素
2.LinkedList(双向链表)
a.List 接口的链接列表实现类
b.允许存储 null 元素
3.Vector(向量)
a.功能和ArrayList一样
b.线程安全
4.Stack(栈)
表示后进先出(LIFO)的对象堆栈
-
List接口常用方法
•常用方法
1.add(Object element) 向列表的尾部添加指定的元素
2.size() 返回列表中的元素个数
3.get(int index) 返回列表中指定位置的元素,index从0开始
4.add(int index, Object element) 在列表的指定位置插入指定元素
5.set(int i, Object element) 将索引i位置元素替换为元素element并返回被替换的元素。
6.clear() 从列表中移除所有元素
7.isEmpty() 判断列表是否包含元素,不包含元素则返回 true,否则返回false
8.iterator() 返回按适当顺序在列表的元素上进行迭代的迭代器
9.contains(Object o) 如果列表包含指定的元素,则返回 true。
10.remove(int index) 移除列表中指定位置的元素,并返回被删元素
11.remove(Object o) 移除集合中第一次出现的指定元素,移除成功返回true,否则返回false。
•以ArrayList实现类为例演示List接口方法:
import java.util.ArrayList; //引包
public class Test {
public static void main(String[] args) {
ArrayList list=new ArrayList<>(); //创建ArrayList对象
list.add("tom"); //调用add方法添加“tom”元素
int length=list.size(); //使用size方法得到list元素个数
System.out.println(length); //输出结果为1
在使用add方法的时候我们会发现add方法有重载现象
参数只有Object类的就是我们刚刚使用的直接添加元素的方式,默认添加在最后位置,而第二个add方法可以将元素添加到指定位置,并使原位置及其之后的元素位置后移
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList list=new ArrayList<>();
list.add("tom");
list.add("jim"); //按顺序添加了tom和jim两个元素
list.add(0, "john"); //使用add方法将jhon插入到第一个元素
System.out.println(list.get(0)); //使用get方法返回指定位置(从0开始)的元素
System.out.println(list.get(1)); //同上
}
}
我们看到,使用add插入后,john为第一个元素,而tom变为第二个元素。
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList list=new ArrayList<>();
list.add("tom"); //add方法添加元素
System.out.println(list.size()); //size方法返回元素数量
list.clear(); //使用clear方法清除集合中的元素
System.out.println(list.size()); //再次用size方法返回元素数量
}
}
clear方法可以清除集合中的元素,在这段代码中,原来元素数量为1,而清除后size方法返回的数字为0,说明元素被全部清除。
此时,我们可以用isEmpty() 判断列表是否包含元素
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList list=new ArrayList<>();
list.add("tom"); //add方法添加元素
System.out.println(list.size()); //size方法返回元素数量
list.clear(); //使用clear方法清除集合中的元素
System.out.println(list.size()); //再次用size方法返回元素数量
System.out.println(list.isEmpty()); //isEmpty方法确定是否为空集合
}
}
输出结果为false,证实确实变成了空集合。
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList list=new ArrayList<>();
list.add("tom");
System.out.println(list.set(0, "jim")); //set方法将指定位置元素替换
System.out.println(list.remove(0)); //remove方法将指定位置元素移除
}
}
//运行结果为 tom jim,这说明set和remove方法是有返回值的,返回的值分别为被替换和被移除的元素
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList list=new ArrayList<>();
list.add("tom");
System.out.println(list.set(0, "jim"));
System.out.println(list.remove(0));
boolean flag=list.contains("jim"); //使用contains方法判断集合中是否有jim元素
System.out.println(flag);
}
}
由于contains方法是判断类型的方法,其返回值为布尔类型,因此我们将其返回值赋给布尔型变量flag,然后输出flag,因为之前已经将jim使用remove方法移除,所以结果为false。
那么contains方法是怎么做到的呢?为了深入了解这一点,我们需要去探访contains方法的底层代码
我们按住ctrl键把鼠标移到contains方法上,点击左键就可以探访底层代码,我们发现其返回的实际上是indesOf方法的返回值,那么我们按照前面的操作再查看indesOf方法的底层代码
indexOf方法的代码如图所示,我们看到这个方法实际上是对集合进行了遍历,当我们指定要查找的元素为null值,该方法就会在元素中找null值,而如果为字符串类型,便会调用string中的equals方法判断集合中是否有相同字符串,需要注意的是,我们看到indexOf方法的参数是Object类,而我们实际上可能的元素数据类型为字符串类型,所以这里的equals方法实际上是一个多态现象,因为String是Object的子类,通过Object类来调用这个方法,可以在String类的对象上使用。
最后,只要能找到相同的值,便会返回i,而因为i值等于元素位置,因此一定大于或者等于0,这样子indexOf的返回值就会大于等于0,使得contains方法返回true;否则返回-1,使得contains方法返回false。