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

集合框架--List集合详解

List集合

List 接口直接继承 Collection 接口,它定义为可以存储重复元素的集合,并且元素按照插入顺序有序排列,且可以通过索引访问指定位置的元素。常见的实现有:ArrayList、LinkedList。

  • Arraylist:有序、可重复、有索引

  • Linked List:有序、可重复、有索引

  • 不同点:底层采用的数据结构(存储,组织数据的方式)不同,应用场景不同

额外的主要方法:

E get(int index) - 获取指定位置的元素E set(int index, E element) - 替换指定位置的元素void add(int index, E element) - 在指定位置插入元素E remove(int index) - 移除指定位置的元素int indexOf(Object o) - 返回指定元素第一次出现的索引int lastIndexOf(Object o) - 返回指定元素最后一次出现的索引List<E> subList(int fromIndex, int toIndex) - 返回指定范围内的子列表
代码演示:
 public static void main(String[] args) {List<String> strings = new ArrayList<>();strings.add("hello");strings.add("world");strings.add("java");strings.add("javaSE");strings.forEach(System.out::println);strings.remove(1);strings.forEach(System.out::println);strings.get(1);strings.forEach(System.out::println);// 修改 索引位置处的元素,修改成功后返回原来的数据strings.set(1, "javaEE");strings.forEach(System.out::println);}

List集合支持的遍历方式

  • for循环

   public static void main1(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}}
  • 迭代器

    ArrayList<Movie> movies = new ArrayList<>();movies.add(new Movie("《三傻大闹宝莱坞》", 1995, "罗三佑"));movies.add(new Movie("《大傻大闹宝莱坞》", 1996, "罗二佑"));movies.add(new Movie("《二傻大闹宝莱坞》", 1997, "罗大佑"));ListIterator<Movie> listed = movies.listIterator();while (listed.hasNext()){Movie next = listed.next();System.out.println("name:"+next.getName());System.out.println("date:"+next.getDate());System.out.println("actor:"+next.getActor());}}
  • 增强for循环

  public static void main1(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");for (String s : list) {System.out.println(s);}}
  • Lambda表达式

  public static void main1(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");list.forEach((String s)->{System.out.println(s);});list.forEach(s->{System.out.println(s);});list.forEach(s -> System.out.println(s));list.forEach(System.out::println);}
  • 数组概述:数组是在我们内存中的一块连续区域,并且会把这块区域分割成若干个相等的小区域,每块区域都有自己的索引,每个区域都是用来装数据的。

  • 数组特点:查询速度快(注意:是根据索引查询数据快)原因:数组有自己的起始地址,一般都需要一个一个遍历到想要的元素,但数组有索引,它可以根据指定索引来直接加几个单位的长度来获取需要的元素(element)。

  • 增删慢:可能需要把后面很多的数据进行前移或后移。

ArrayList特点

  • 基于动态数组实现

  • 查询速度快(是根据索引查询数据快):查询数据通过地址值和索引定位,查询任意数据耗时相同

  • 删除效率低:可能需要把后面很多的数据进行前移

  • 添加效率极低:可能需要把后面很多的数据后移,再添加元素;或者也可能需要进行数组的扩容。

  • 非同步(线程不安全)

ArrayList的底层原理

  1. 利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组

  2. 添加第一个元素时,底层会创建一个长度为10的数组,将元素填入第0个索引,并将size后移到第一个索引,再添加也是如此

  3. 存满时,扩容1.5倍,再创建一个相对于原数组1.5倍的新数组,再将数据迁移进去

  4. 如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准即10+添加的数组长度

Array List集合使用的应用场景

1.适合场景:根据索引查询数据,比如根据随机索引取数据(高效)!或者数据量不是很大时

2.不适合场景:数据量大的同时,又要频繁的进行增删操作

前置知识点:什么是链表?有啥特点?

  • 链表是由一个一个的结点组成的,结点都是独立的对象,和数组不一样,在内存中是分散存储的,每个结点除了包含的数据内容,还会包含下一个结点的地址信息,通过这个地址信息是可以找到下一个结点的

  • 链表的特点:查询慢,无论查询你那个数据都要从头开始找,根据索引寻找的时候,也要从头开始找,因为结点在内存中是分散存储的

  • 链表的特点:链表增删相对快,原理:链表可以直接让想要删除的元素的前一个元素的地址指向想要删除的元素的后一个元素,元素就删除了

  • 增加的时候,将要插入的地方的两边插入地址即可,

  • 单向链表:只能从前往后遍历,因为结点只记得了下一个结点的地址,单链表只有头结点

  • 双向链表:每个结点除了要包含下一个结点的地址信息,还要包含上一个结点的地址信息,双链表是有头结点和尾结点

  • 双向链表特特点:查询慢,增删相对较快,但对首尾元素进行增删改查的速度是极快的 原因:双向链表中有具体的头结点地址和结节点地址,通过地址可以快速找到第一个数据和最后一个数据,

LinkList的底层原理

  • 基于双链表实现的

  • 查询慢,增删相对较快,但对首尾元素进行增删改查的速度是极快的

LinkedList新增了许多守卫操作的特有方法

void addFirst(E e)- 在该列表开头插入指定的元素void addLast(E e)- 将指定的元素追加到列表的末尾E getFirst()- 返回该列表的第一个元素E getLast() - 返回该列表的最后一个元素E removeFirst() - 从此列表删除并返回第一个元素E removeLast() - 从此列表删除并返回最后一个元素
LinkedList的应用场景之一:可以用来设计队列

队列特点:先进先出,后进后出,大多数的叫号,排队系统,都是在尾部增加数据,首部删除数据,且要保持数据有序,所以用LinkedList来实现很合适

代码示例

 package com.lyc.test;​import java.util.LinkedList;​public class LinkedListTest {public static void main(String[] args) {LinkedList<String> queue = new LinkedList<>();//入队操作queue.addLast("第一号人");queue.addLast("第二号人");queue.addLast("第三号人");queue.addLast("第四号人");System.out.println(queue);System.out.println("出队操作");while (!queue.isEmpty()){System.out.println(queue.removeFirst());}System.out.println(queue);}}
LinkedList的应用场景之一:可以用来设计栈

栈的特点:后进先出,先进后出。一段开口,一段封闭,

数据进入栈的模型的过程称为压/进栈(push)

数据离开栈模型的过程称为弹/出栈(pop)

只是在首部增删元素,用LinkedList来实现很合适

举例:在设计子弹的射出情况时,就可以设计一个栈的模型来描述,先压进去的子弹最后发射,最后压进去的子弹先射击

代码展示:

 LinkedList<String> stack = new LinkedList<>();//压栈(push)stack.push("第一发子弹"); //push和addFisrt功能一样 在源码中stack.push("第二发子弹");stack.push("第三发子弹");System.out.println(stack);//弹栈(pop)while (!stack.isEmpty()){System.out.println(stack.pop());//pop和removeFirst功能一样 在源码中}System.out.println(stack);

相关文章:

  • STL详解 - list
  • 硬件电路设计之51单片机(2)
  • UE5烘培后->为什么C磁盘满了
  • 适配器模式在Java开发中的应用
  • 从信号处理角度理解图像处理的滤波函数
  • Markdown 编辑器的使用
  • 解决WinEdt编辑器出现文字不会适应软件宽度的问题
  • 【LInux网络】socket 编程 - 从ip端口到接口详解
  • 栈的学习笔记
  • Spring Cloud 服务间调用深度解析
  • 数据库之MySQL
  • MySQLQ_数据库约束
  • Android系统通知机制深度解析:Framework至SystemUI全链路剖析
  • 4.15学习总结
  • Java 基本操作快速入门:理解与实践
  • 编程语言到mysql ‘\‘到数量关系
  • c++模版进阶
  • 11.第二阶段x64游戏实战-框架代码细节优化
  • mysql按条件三表并联查询
  • C语言进阶之自定义类型:结构体,枚举,联合
  • 盐城网站开发市场/渠道网官网
  • 网站制作包括哪些/seo域名如何优化
  • 网站结构优化怎么做/快推广app下载
  • 什么网站可以有人做详情页/网络营销方案
  • 做一下网站收购废钢/香蕉和忘忧草对焦虑的影响
  • 三门网站制作/前端培训费用大概多少