当前位置: 首页 > news >正文

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(对于基本类型)

示例代码:

    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());//3System.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 3System.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 100list.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实现


http://www.mrgr.cn/news/81746.html

相关文章:

  • PCIe6.0学习小记
  • 分布式版本管理工具——git 中忽略文件的版本跟踪(初级方法及高级方法)
  • 【网络云计算】2024第52周-每日【2024/12/26】小测-理论实操-备份MySQL数据库并发送邮件
  • 【Flutter_Web】Flutter编译Web第三篇(网络请求篇):dio如何改造方法,变成web之后数据如何处理
  • CV(7)--神经网络训练
  • 高阶C语言|深度剖析数据在内存中的存储
  • 【Linux命令】`ps -a` , `ps -ef` 和 `ps aux` 的区别
  • 【虚拟机网络拓扑记录】
  • 快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang)
  • 代码随想录算法训练营第十六天-二叉树-513.找树左下角的值
  • 《机器学习》——利用OpenCV库中的KNN算法进行图像识别
  • IPD管理体系框架架应用实践
  • GFPS扩展技术原理(十)-FMDN Notification
  • 【测试】接口测试
  • 使用 Spring Boot 实现文件上传:从配置文件中动态读取上传路径
  • 计算机体系结构期末复习1:分支预测
  • 本地部署 LLaMA-Factory
  • Rectified Flow 原理简介与示例代码解读
  • provider-10000模块、consumer-80[RestTemplate远程调用]
  • Java编程规约:命名风格
  • C++第五六单元测试
  • Java - 日志体系_Apache Commons Logging(JCL)日志接口库
  • sqlserver 数据库误删-用mdf和ldf文件恢复
  • C# 窗体应用程序嵌套web网页(基于谷歌浏览器内核)
  • 获取页面上所有的img,并保存到本地
  • 3.微服务灰度发布落地实践(组件灰度增强)