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()
移除并返回此集合的最后一个数据元素。