List详解

List详解

在Java中,List是一个接口,它继承自Collection接口。List接口为数据的有序集合提供了操作接口,其中可以包含重复的元素。这个接口的实现类以特定的方式存储元素,允许元素根据索引进行访问,同时还支持通过迭代器(Iterator)进行遍历。List接口的实现类主要有ArrayList、LinkedList和Vector等

主要特点

  1. 有序性:List中的元素是按照插入顺序存储的,因此可以通过索引来访问特定位置的元素。
  2. 允许重复:List中允许存在重复的元素
  3. 动态大小:与数组不同,List的大小是动态的,可以根据需要添加或删除元素
  4. 访问速度快:由于ArrayList等实现类是基于数组实现的,因此在随机访问元素时速度很快
  5. 可选的同步: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实现

相关推荐
L.S.V.38 分钟前
Java 溯本求源之基础(三十)——封装,继承与多态
java·开发语言
码农爱java39 分钟前
设计模式--装饰器模式【结构型模式】
java·设计模式·面试·装饰器模式·原理·23 中设计模式
星就前端叭1 小时前
【开源】一款基于SpringBoot的智慧小区物业管理系统
java·前端·spring boot·后端·开源
带刺的坐椅1 小时前
RxSqlUtils(base R2dbc)
java·reactor·solon·r2dbc
silence2502 小时前
深入了解 Reactor:响应式编程的利器
java·spring
weixin_SAG2 小时前
21天掌握javaweb-->第19天:Spring Boot后端优化与部署
java·spring boot·后端
m0_748247552 小时前
SpringMVC跨域问题解决方案
java
Elcker2 小时前
KOI技术-事件驱动编程(Sping后端)
java·spring·架构
GitNohup2 小时前
Spring boot处理跨域问题
java·spring boot·跨域
Just_Paranoid2 小时前
使用 IDE生成 Java Doc
java·开发语言·ide