List详解
在Java中,List是一个接口,它继承自Collection接口。List接口为数据的有序集合提供了操作接口,其中可以包含重复的元素。这个接口的实现类以特定的方式存储元素,允许元素根据索引进行访问,同时还支持通过迭代器(Iterator)进行遍历。List接口的实现类主要有ArrayList、LinkedList和Vector等
主要特点
- 有序性:List中的元素是按照插入顺序存储的,因此可以通过索引来访问特定位置的元素。
- 允许重复:List中允许存在重复的元素
- 动态大小:与数组不同,List的大小是动态的,可以根据需要添加或删除元素
- 访问速度快:由于ArrayList等实现类是基于数组实现的,因此在随机访问元素时速度很快
- 可选的同步:List的实现类如ArrayList和LinkedList是非同步的,而Vector是同步的。这意味着在多线程环境中,Vector是线程安全的,但性能可能较低;而ArrayList和LinkedList则不是线程安全的,但性能较高
主要方法
·int size():返回列表中的元素个数
·boolean isEmpty():如果列表为空,则返回true
·boolean add(E e):在列表的末尾添加指定的元素
·void add(int index,E element):在列表的指定位置插入指定的元素
·boolean contains(Object o):如果列表包含指定的元素,则返回true
·Iterator<E> iterator():返回按适当顺序在列表的元素上进行迭代的迭代器 关于Iterator接口的详细知识,我们放在Iterator详解中讲
·boolean remove(Object o):从列表中移除 指定元素的第一个匹配项(如果存在)
·E remove(int index):移除列表中指定位置的元素
·E get(int index):返回列表中指定位置的元素
·E set(int index,E element):用指定的元素替换列表中指定位置的元素
·int indexOf(Object o):返回指定元素在列表中首次出现的索引,如果列表不包含该元素,则返回-1
·int lastIndexOf(Object o):返回指定元素在列表中最后一次出现的索引,如果列表不包含该元素,则返回-1
·List<E> subList(int fromIndex,int toIndex):返回列表中指定的[fromIndex,toIndex)区间的部分视图
·Object[] toArray():将列表中的所有元素转换为一个Object类型的数组。由于所有类都是Object的子类,因此这个方法可以适用于任何类型的列表
·<T> T[] toArray(T[] a]:将列表中的所有元素转换为一个指定类型的数组。如果指定的数组足够大以容纳列表中的所有元素,那么列表中的元素将被复制到该数组中,并且该数组将被返回。否则,将根据需要分配一个新的数组,其运行时类型与指定数组的运行时类型相同,并且该数组将被返回
注意:
·如果指定的数组大小不足以容纳列表中的所有元素,则返回一个具有正确大小的新数组
·如果指定的数组大小大于列表的大小,则数组将被填充为null(对于引用类型)或0(对于基本类型)
示例代码:
java
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();//创建一个由数组组成的List集合
//1.boolean isEmpty()
System.out.println(list.isEmpty());//true:为空
//2.boolean add(E e)
list.add(1);
list.add(2);
list.add(3);
//3.int size()
System.out.println(list.size());//3
System.out.println(list.isEmpty());//false:不为空
//4.boolean contains(Object o)
System.out.println(list.contains(100));//false:不包含
//5.void add(int index,E element)
list.add(1,100);//1 100 2 3
System.out.println(list.contains(100));//true:包含
//6.Iterator<E> iterator()
Iterator<Integer> iterator=list.iterator();
//关于Iterator中的hasNext和next方法 我们在Iterator详解中讲
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");//1 100 2 3
}
System.out.println();
//7.boolean remove(Object o):
list.remove((Integer) 100);//如果这里没有加强制转换 就会将100看成下标 这时会超出列表长度
//8.List<E> subList(int fromIndex,int toIndex)
System.out.println(list.subList(0,3));//1 2 3
//9.E remove(int index)
list.remove(0);
System.out.println(list.subList(0,2));//2 3
//10.E get(int index)
System.out.println(list.get(1));//3
//11.E set(int index,E element)
list.set(1,100);
System.out.println(list.subList(0,2));//2 100
list.add(2,2);
System.out.println(list);//2 100 2
//12.int indexOf(Object o)
System.out.println(list.indexOf(2));//0
//13.int lastIndexOf(Object o)
System.out.println(list.lastIndexOf(2));//2
//14.Object[] toArray()
Object[] arr=list.toArray();
System.out.println(Arrays.toString(arr));//2 100
//15.<T> T[] toArray(T[] a]
//创建一个足够大的数组
Integer[] array1=new Integer[list.size()];
Integer[] str1=list.toArray(array1);
System.out.println(Arrays.toString(str1));//2 100
//创建一个大于 列表大小 的数组
Integer[] array2=new Integer[list.size()+1];
Integer[] str2=list.toArray(array2);
System.out.println(Arrays.toString(str2));//2 100 null
//创建一个小于 列表大小 的数组
Integer[] array3=new Integer[list.size()-1];
Integer[] str3=list.toArray(array3);
System.out.println(Arrays.toString(str3));//2 100
}
List接口的实现类
·ArrayList:基于数组实现的List。它允许对元素进行快速随机访问,但在插入和删除元素时可能性能较低(尤其是在列表的开头或中间位置)。ArrayList的大小可以动态地增长和缩减
·LinkedList:基于链表实现的List。它提供了列表的开头和结尾快速添加或删除元素的能力。然而,与ArrayList相比,LinkedList在随机访问元素时性能较低
·Vector:一个古老的、基于数组实现的、同步的List。与ArrayList类似,但所有方法是同步的,因此在多线程环境中是线程安全的。然而,由于同步的开销,Vector的性能通常比ArrayList低
关于ArrayList和LinkedList 我们之后也会进行讲解
注意:在多线程环境下,如果需要考虑线程安全性,那么可能需要使用Collections.synchronizedList 方法来包装一个非同步的List,或者使用CopyOnWriteArrayList等线程安全的List实现