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

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

    • void add(int index,Object o)

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

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

    • int indexOf(Object o)

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

    • int lastIndexOf(Object o)

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

    • Object remove(int index)

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

    • Object set(int index,Object o)

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

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

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

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

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

      根据需求编写如下代码:

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


    图3.7 ArrayList使用

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

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

    -l void addLast(Object o)

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

    • Object getFirst()

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

    • Object getLast()

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

    • Object removeFirst()
    • Object removeLast()

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