一、List 接口概述
1、鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组;
2、List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引;
3、List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
4、JDK API中List接口的实现类常用的有: ArrayList、 LinkedList和Vector。
5、List 接口结构
二、常用实现类简单对比
ArrayList、LinkedList、Vector三者的异同:
相同:三个类都是实现了List接口,存储数据的特点相同:存储有序的、可重复的数据
不同点:
(1)ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[] elementData存储;
(2)LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储;
(3)Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储;
三、List 接口方法
List除了从Collection集合继承的方法外, List 集合里添加了一些根据索引来操作集合元素的方法。
这些方法有的已经在 Collection 接口中进行了简要分析,而 List 接口继承自 Collection,因此这里只分析一些 List 特有的方法:
//在index位置插入ele元素
void add(int index, Object ele)
// 将一个集合的所有元素添加到当前集合的指定位置;
boolean addAll(int index, Collection<? extends E> c);
// 用指定的运算结果替代集合中的所有元素
default void replaceAll(UnaryOperator<E> operator);
// 用指定的 Comporator 对集合元素进行排序
default void sort(Comparator<? super E> c);
// 获取指定位置的元素
E get(int index);
// 将某个位置的元素替换为指定元素
E set(int index, E element);
// 将指定元素添加到集合的指定位置
void add(int index, E element);
// 移除指定位置的元素,移除指定index位置的元素,并返回此元素
E remove(int index);
// 某个元素在集合中(第一次出现)的位置
int indexOf(Object o);
// 某个元素在集合中最后一次出现的位置
int lastIndexOf(Object o);
// 返回元素的列表迭代器
// 相当于 list.listIterator(0)
ListIterator<E> listIterator();
// 返回元素的 listIterator(指定起始位置)
ListIterator<E> listIterator(int index);
// 获取集合的子集,返回从fromIndex到toIndex位置的子集合
List<E> subList(int fromIndex, int toIndex);
常用方法总结:
增:add(Object obj)
删:remove(int index) / remove(Object obj)
改:set(int index, Object ele)
查:get(int index)
插:add(int index, Object ele)
长度:size()
四、List 的遍历方式
1、Iterator迭代器方式
2、增强for循环
3、普通的循环
4、案例
1 @Test
2 public void test3(){
3 ArrayList list = new ArrayList();
4 list.add(123);
5 list.add(456);
6 list.add("AA");
7
8 //方式一:Iterator迭代器方式
9 Iterator iterator = list.iterator();
10 while(iterator.hasNext()){
11 System.out.println(iterator.next());
12 }
13
14 System.out.println("***************");
15
16 //方式二:增强for循环
17 for(Object obj : list){
18 System.out.println(obj);
19 }
20
21 System.out.println("***************");
22
23 //方式三:普通for循环
24 for(int i = 0;i < list.size();i++){
25 System.out.println(list.get(i));
26 }
27
28 }
面试题:区分List中remove(int index)和remove(Object obj)
1 @Test
2 public void testListRemove() {
3 List list = new ArrayList();
4 list.add(1);
5 list.add(2);
6 list.add(3);
7 updateList(list);
8 System.out.println(list);//
9 }
10
11 private void updateList(List list) {
12 // list.remove(2);
13 list.remove(new Integer(2));
14 }