根据接口的定义我们知道,接口的作用是定义标准或者规定,要满足接口中的要求就需要定义一个实现类来实现接口中定义的标准。List接口的常用实现类有ArrayList、Vector、Stack以及LinkedList。其中ArrayList类是较为基础的一个实现类,理解ArrayList类中关于容器的操作之后,对照学习其余的几个实现类是较为理想的方法。
ArrayList的底层是通过数组来实现对容器中的集合进行操作的,因此通过实例化ArrayList类创建的对象中含有的索引必须小于容器中元素的个数。由于ArrayList中的容器中的元素含有索引,因此可以像数组一样,可以通过索引来对容器中的元素进行相关操作。
可以通过List接口来实例化ArrayList容器,这里要注意List接口是泛型接口,在实例化时要指定泛型类型,同时List接口是java.util包下的接口,在实例化容器的时候要进行导包操作。同样的,由于ArrayList类是List接口的实现类,因此在实例化容器时也要进行相应的导包操作,这里要注意的是,在进行导包操作的时候,List接口和ArrayList类极有可能出现无法通过快捷导包的情况,这时我们可以选择手动书写导包代码,也可以在IDEA中选择设置,在设置中找到Editor选项,在这个选项下找到General,在General下有一个Auto Import选项,在这个选项里IDEA自动禁用了java.util.list的快捷键导包操作,我门只要在窗口中选中java.util.list随后在边框周围找到一个减号,点击它将这个java.util.list在禁用导包目录中删除即可通过快捷键Alt+Enter进行导包操作,具体操作如下图所示。
实例化ArrayList容器之后,我们就可以通过对象名来调用ArrayList中的方法了。ArrayList类不仅实现了Collection中的抽象方法,而且由于它是List接口的实现类,因此它还实现了List接口中新增加的通过索引对容器中的元素操作的方法。这些方法的使用在下面的演示代码中做了示范。在这些方法中要注意的是对元素进行删除操作时有两个方法——T remove(index)和 boolean remove(element)。这两个方法看上去很好区分,但是在使用时会产生混淆,前一个方法是对指定索引的元素进行删除操作,但是会返回被删除的元素的值,因此它的返回值类型是根据定义的容器的元素的类型发生变化的,可以理解为一个泛型方法,第二个方法用于删除指定的元素,返回的是一个boolean类型的值,它是一个普通方法。
此外,其余的常用方法中还要注意的是替换方法set,这个方法要传入两个参数,一个是要替换的元素的索引,一个替换之后的内容。这个方法执行以后会返回一个被替换的元素,在使用的时候要注意它的返回值类型。
ArrayList类中实现了Collection中的addAll、retainAll以及removeAll方法,这三个方法是用来对两个不同的集合进行操作,addAll进行并集操作,retainAll进行交集操作,removeAll进行差集操作。这三个操作可以类比到数学中的集合的交、并、补的运算,但是二者只见是存在差异的。
java中不同容器之间的操作有以下几点要注意:
1、并集操作addAll只能在同类型的容器间进行,也就是说,进行并集操作的两个容器在定义时它们的泛型必须是一样的,显然,其余的两个操作交集操作和差集操作也是一样的;
2、进行交集操作,并集操作以及差集操作的两个容器均不能为空;
3、进行交集操作时,两个容器不能是包含关系,也就是说其中一个容器不能是另一个容器的子集;
4、如果对容器a和容器b进行差集操作(a-b),b容器可以不是a容器的子集,在进行差集操作的时候,只在a容器中删除b容器中与a容器中相同的元素,b容器中多余的元素不计入差集操作结果。比如a容器为:1 2 3 6 5,b容器为1 3 j,那么运算结果应为:2 6 5 。这点与数学中的补集运算极为不同,不要将二者混淆。
package com.container.demo;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
public class ArrayListTest {
public static void main(String[] args) {
//实例化ArrayList容器
List<String> list = new ArrayList<>();
//添加元素
boolean flag = list.add("北京尚学堂");
boolean flag1 = list.add("itbz");
System.out.println(flag);
System.out.println(flag1);
//索引的数值不能大于等于元素个数
list.add(1,"laolu");
System.out.println(list.get(0));
System.out.println("_________________");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("_____________________");
//根据索引删除元素
String re = list.remove(0);//删除指定位置的元素,并且返回该位置原来的元素,即返回删除的元素的值
System.out.println("删除的元素是:"+re);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("_________________________");
//删除指定元素
boolean bo = list.remove("laolu");//删除指定元素,返回一个boolean值,用于判断是否删除成功,接口Collection中的方法
System.out.println("是否删除成功:"+bo);
boolean bo1 = list.remove("haha");
System.out.println("是否删除成功:"+bo1);
for (String aa:list
) {
System.out.println(aa);
}
//替换容器中的元素
list.add("beijing");
list.add("shanghai");
list.add("hebei");
for (String bb:list
) {
System.out.print(bb+"\t");
}System.out.println();
String t1 = list.set(1,"首都:北京");//替换指定位置的元素,并返回被替换的元素
System.out.println("被替换的元素为:"+t1);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+"\t");
}
System.out.println();
//清空容器
list.clear();
System.out.println(list.size());
//判断容器是否为空
System.out.println(list.isEmpty());
System.out.println("_________________________");
//判断容器中是否包含某个指定元素
list.add("beijing");
list.add("shanghai");
list.add("hebei");
boolean be1 = list.contains("beijing");
boolean be2 = list.contains("haha");
System.out.println(be1);
System.out.println(be2);
//查找元素位置
list.add(2,"beijing");
list.add(0,"shanghai");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("——————————————————————————————————");
//查找元素第一次出现的位置
int ind = list.indexOf("beijing");
System.out.println("beijing第一次出现的位置索引为:"+ind);
//查找元素最后一次出现的位置
int ind1 = list.lastIndexOf("beijing");
int ind2 = list.lastIndexOf("bei");
System.out.println("beijing最后出现的位置索引为:"+ind1);
System.out.println(ind2);//如果元素不存在,则返回-1
System.out.println("___________________________________");
//将单例集合转换为数组
//将单例集合转换为Object [],但是不能对转换的数组做强制类型转换
Object[] arr01 = list.toArray();
System.out.println(Arrays.toString(arr01));
for (Object ob:arr01
) {
System.out.print(ob+"\t");
}
System.out.println();
//将单例集合转换为致指定类型的数组,但是类型需要参考泛型中的类型
String[] arr02 = list.toArray(new String[list.size()]);
System.out.println(Arrays.toString(arr02));
System.out.println("___________-容器的并集操作-_______");
List<String> a = new ArrayList<>();
List<String> b = new ArrayList<>();
a.add("1");
a.add("2");
a.add("3");
System.out.println("并集操作前的a:");
for (int i = 0; i < a.size(); i++) {
System.out.print(a.get(i)+"\t");
}
System.out.println();
b.add("a");
b.add("b");
b.add("c");
System.out.println("集合b的内容:");
for (int i = 0; i <b.size() ; i++) {
System.out.print(b.get(i)+"\t");
}
System.out.println();
boolean flag6 = a.addAll(b);//a并b结果赋给a。并集必须同类型,且并集操作不能含有空集
System.out.println("并集操作是否成功"+flag6);
System.out.println("并集操作后的a:");
for (int i = 0; i < a.size(); i++) {
System.out.print(a.get(i)+"\t");
}
System.out.println();
System.out.println("-------容器的交集操作-----------");
List<String> a1 = new ArrayList<>();
a1.add("1");
a1.add("3");
a1.add("f");
System.out.println("交集操作前的a1");
for (int i = 0; i < a1.size(); i++) {
System.out.print(a1.get(i)+"\t");
}
System.out.println();
boolean flag7 = a1.retainAll(a);//a1不能是a的子集,交集操作失败
System.out.println("交集操作是否成功:"+flag7);
System.out.println("交集操作后的a1:");
for (int i = 0; i < a1.size(); i++) {
System.out.print(a1.get(i)+"\t");
}
System.out.println();
System.out.println("--------容器的差集操作--------");
a1.add("f");
System.out.println("差集操作前的a:");
for (int i = 0; i < a.size(); i++) {
System.out.print(a.get(i)+"\t");
}
System.out.println();
System.out.println("差集操作前的a1:");
for (int i = 0; i < a1.size(); i++) {
System.out.print(a1.get(i)+"\t");
}
System.out.println();
boolean flag8 = a.removeAll(a1);
System.out.println("差集操作是否成功:"+flag8);
System.out.println("差集操作后的a:");
for (int i = 0; i < a.size(); i++) {
System.out.print(a.get(i)+"\t");
}
}
}