1.List集合基础
-
List接口继承自Collection接口,它包含了Collection中的所有方法。List接口定义了两个很重要的方法:
-
get(int index):获得指定索引位置的元素
-
set(int index,Object obj):将集合中指定索引位置的对象修改为指定的对象
2.List接口的实现类
常用实现类有:ArrayList和LinkedList
- ArrayList类:实现的是可变数组,允许保存所有的元素,包括null。优点:可以根据索引位置对集合中的元素进行快速随机访问;缺点:向指向位置插入或者删除对象的速度较慢。
- LinkedList类:采用链表结构保存对象。优点:便于向集合中插入和删除对象。缺点:随机访问元素时效率较慢。
- 对比:当需要向集合类中指定位置插入或删除时,用LinkedList类实现List集合效率较高;当需要随机访问集合中的对象时,ArrayList类实现List集合的效率较高;
- 使用List集合时,通常声明为List类型,通过不同的实现类来实例化集合
List list1=new ArrayList<>();
List list2=new LinkedList<>();
3.常用方法:
代码练习:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
List <String> courses=new ArrayList<>();//向上转型
// list是一个接口,不能直接使用,所以new一个实现类ArrayList
courses.add("C语言");//尾插
courses.add("Java SE");
courses.add("Java Web");
courses.add("Java EE");
//和数组一样,允许添加重复元素
courses.add("C语言");
//可以直接按照输入顺序输出,集合类都可以直接打印
System.out.println(courses);
//可以类似数组的方式获取指定下标的方式访问
System.out.println(courses.get(0));//get()获取指定下标元素
courses.set(0,"数据结构"));//set(),修改指定位置的元素
//get(),set()方法对顺序表有效,对链表也有效
System.out.println(courses);//再次打印
//subList()方法,截取部分元素[1,3),注意是左闭右开区间
List<String> subList=courses.subList(0,3);
System.out.println("截取[0,3)的结果是:"+subList);
//remove(),删除遇到的第一个元素,遇到则删除返回true,没有元素则返回false
System.out.println(courses.remove("C语言"));
System.out.println("判断数据结构是否在线性表中:"+courses.contains("数据结构"));
System.out.println(courses);
// courses.clear();//清空,无返回值
//重新构造
List<String> courses2 = new ArrayList<>(courses);
System.out.println(courses2);
List<String> courses3 = new LinkedList<>(courses);
System.out.println(courses3);
//引用的转换
ArrayList<String> courses4 = (ArrayList<String>) courses2;
System.out.println(courses4);//无错
LinkedList<String> courses5 = (LinkedList<String>) courses3;
System.out.println(courses5);
// ArrayList<String> c1 = (ArrayList<String>) courses3;//错误类型
// LinkedList<String> c2 = (LinkedList<String>) courses2;//错误类型
//上述例子说明ArrayList和LinkedList不能直接强制互相转换
}
}
结果:
[C语言, Java SE, Java Web, Java EE, C语言]
C语言
C语言
[数据结构, Java SE, Java Web, Java EE, C语言]
截取[0,3)的结果是:[数据结构, Java SE, Java Web]
true
判断数据结构是否在线性表中:true
[数据结构, Java SE, Java Web, Java EE]
[数据结构, Java SE, Java Web, Java EE]
[数据结构, Java SE, Java Web, Java EE]
[数据结构, Java SE, Java Web, Java EE]
[数据结构, Java SE, Java Web, Java EE]
Process finished with exit code 0
//问题:输出了两行C语言,不太懂,应该只有一行
//已解决,set()方法不是用来输出的,多输出了一次
错误转换异常:
Exception in thread "main" java.lang.ClassCastException: java.util.LinkedList cannot be cast to java.util.ArrayList