3.6 List接口

  List接口是Collection接口的子接口,在实现了List接口的集合中,元素是有序的,而且可以重复。List接口和Set接口一样,可以容纳所有类型的对象。List集合中的数据元素都对应一个整数型的序号索引,记录其在集合中的位置,可以根据此序号存取元素。

  JDK中实现了List接口的常用类有ArrayList和LinkedList。

3.6.1 List接口方法

  List接口继承自Collection接口,除了拥有Collection接口所拥有的方法外,它还拥有下列方法:

  • void add(int index,Object o)

  在集合的指定位置插入指定的数据元素。

  • Object get(int index)

  返回集合中指定位置的数据元素。

  • int indexOf(Object o)

  返回此集合中第一次出现的指定数据元素的索引,如果此集合不包含该数据元素,则返回-1。

  • int lastIndexOf(Object o)

  返回此集合中最后出现的指定数据元素的索引,如果此集合不包含该数据元素,则返回-1。

  • Object remove(int index)

  移除集合中指定位置的数据元素。

  • Object set(int index,Object o)

  用指定数据元素替换集合中指定位置的数据元素。

3.6.2 ArrayList使用

  ArrayList实现了List接口,在存储方式上ArrayList采用数组进行顺序存储。ArrayList对数组进行了封装,实现了可变长度的数组。与ArrayList不同的是LinkedList,它在存储方式上采用链表进行链式存储。

  通过数据结构的学习,可得出这样的结论,因为ArrayList是用数组实现的,在插入或删除数据元素时,需要批量移动数据元素,故性能较差;但在查询数据元素时,因为数组是连续存储的,且可以通过下标进行访问,所以在遍历元素或随机访问元素时效率高。LinkedList正好与之相反,这一点在企业面试时经常被问到,需要大家深刻领会。

  继续修改“租车系统”的代码,学习ArrayList集合的使用。假设“租车系统”有如下需求调整。

  (1)用户可以遍历这个系统里所有的车辆,但只能看到车型和车名。

  (2)当用户选中某辆车时,需要完整显示车辆信息。

  根据需求编写如下代码:

  1. import java.util.*;
  2. import com.bd.zuche.*;
  3. class TestZuChe2
  4. {
  5. public static void main(String[] args)
  6. {
  7. int index = -1; //用于显示序号
  8. Scanner input = new Scanner(System.in);
  9. //创建ArrayList集合,用于存放车辆
  10. List vehAL = new ArrayList();
  11. Vehicle c1 = new Car("战神","长城");
  12. Vehicle c2 = new Car("跑得快","红旗");
  13. Vehicle t1 = new Truck("大力士","5吨");
  14. Vehicle t2 = new Truck("大力士二代","10吨");
  15. vehAL.add(c1); //将c1添加vehAL集合的末尾
  16. vehAL.add(c2);
  17. vehAL.add(t1);
  18. vehAL.add(t2);
  19. System.out.println("***显示“租车系统”中全部车辆***");
  20. index = 1;
  21. //增强for循环遍历
  22. for(Object obj:vehAL){
  23. if(obj instanceof Car)
  24. {
  25. Car car = (Car)obj;
  26. System.out.println(index + " 该车是轿车,其车名为:" + car.getName());
  27. }else{
  28. Truck truck = (Truck)obj;
  29. System.out.println(index + " 该车是卡车,其车名为:" + truck.getName());
  30. }
  31. index++;
  32. }
  33. System.out.print("请输入要显示详细信息的车辆编号:");
  34. //根据索引获取vehAL集合中元素,类型转换后调用show()方法输出
  35. ((Vehicle)vehAL.get(input.nextInt()-1)).show();
  36. }
  37. }

  编译、运行程序,运行结果如图3.7所示。通过代码和运行结果可以看出,此例中采用了增强for循环的方式遍历了ArrayList集合中的所有元素,集合中元素的顺序是按照add()方法调用的顺序依次存储的,再通过调用ArrayList接口的get(int index)方法获取指定位置的元素,并输出该对象的信息。

3.6 List接口 - 图1


图3.7 ArrayList使用

3.6.3 LinkedList使用

  LinkedList和ArrayList在逻辑结构上没有本质区别,只是存储结构上的差异导致程序员在决定使用哪个List实现类时需要做出选择。LinkedList接口除了拥有ArrayList接口提供的方法外,还增加了如下一些方法。

  • void addFirst(Object o)

  将指定数据元素插入此集合的开头。

-l void addLast(Object o)

  将指定数据元素插入此集合的结尾。

  • Object getFirst()

  返回此集合的第一个数据元素。

  • Object getLast()

  返回此集合的最后一个数据元素。

  • Object removeFirst()

  移除并返回此集合的第一个数据元素。

  • Object removeLast()

  移除并返回此集合的最后一个数据元素。