【Java】ArrayList与LinkedList详解!!!

【Java】ArrayList与LinkedList详解!!!

目录

一🌞、List

1🍅.什么是List?

2🍅.List中的常用方法

二🌞、ArrayList

1🍍.什么是ArrayList?

2🍍.ArrayList的实例化

3🍍.ArrayList的使用

  4🍍.ArrayList的遍历

5🍍.ArrayList特点

6🍍.ArrayList优缺点

1.🍋ArrayList的优点:

2.🍋ArrayList的缺点:

三🌞、LinkedList

1🍰.什么是LinkedList?

2🍰.LinkedList的实例化

3🍰.LinkedList的使用

4🍰.LinkedList的遍历

5🍰.ListedList的特点

6🍰.LinkedList优缺点

1🍐.LinkedList优点:

2🍐.LinkedList缺点:

四🌞、ArrayList与LinkedList的区别


一🌞、List

1🍅.什么是List?

在集合框架中,List就是一个接口继承Collection接口

数据结构的角度,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删查改以及变量等操作。

什么是线性表? 

线性表是由n个具有相同类型元素组成的有限序列。线性表是一种常见的数据结构。在逻辑上,线性表是一种线性结构,就是连续的一条直线,在物理结构上,不一定是连续的,在物理存储是,通常是以数组和链式的结构形式存储。常见的线性比表有顺序表、链表、栈、队列.......

2🍅.List中的常用方法

boolean add(E e)插入元素e在末尾
void add(int index,E element)插入元素e在index位置
boolean addAll(Collection?extends?E>c)尾插c中的元素
E remove(int index)删除index位置的元素
boolean remove(Object o)删除第一次出现的o元素
void clear()清空
E get(int index)获取index下标位置元素
int indexOf(Object o)获取第一个o元素所在的下标
int lastindexOf(Object o)获取最后一个o元素所在的下标
boolean contains(Object o)查看是否包含o元素
E set(int index,E Element)将index下标的元素改为e
截取
List<E>subList(int formIndex,int toIndex)截取部分list

        List是一个接口,所以不能直接实例化如果想要使用list接口,必须实例化list的实现类

在集合框架中,ArrayListLinkedList都实现了这个接口。 

二🌞、ArrayList

1🍍.什么是ArrayList?

ArrayList是一个普通的类,是顺序表的一种,实现了list接口,是一种可动态调整大小的数组,能够储存不同类型的对象。

什么是顺序表?

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

2🍍.ArrayList的实例化

 //接口的实例化: List<Integer> list1=new ArrayList<>(); //ArrayList的实例化: ArrayList<Integer> list=new ArrayList<>(); 

两者区别:

  • 接口的实例化:只能使用接口中定义类的方法;
  • ArrayList实例化:可以使用ArrayList中独有的方法,更具有灵活性

3🍍.ArrayList的使用

ArrayList常见方法:

增:
void add(int data)在数组最后添加元素
void add(int pos,int data)在数组某下标插入元素
删:
void remove(int toRemove)删除第一次出现的元素
void clear();清空所有元素
查:

boolean contains(int toFind)

查看是否包含该元素
int get(int pos)获取该下标元素
int indexOf(int toFind )获取该元素下标
改:
void set(int pos,int value)将下标元素进行更改

 ArrayList方法的使用:

 public static void main(String[] args) { List<Integer> list1=new ArrayList<>(); //增: //add:尾插 list1.add(1); list1.add(2); list1.add(3); list1.add(4); list1.add(5); System.out.println(list1);//[1, 2, 3, 4, 5] //add:任意位置插入 list1.add(3,100); System.out.println(list1);//[1, 2, 3, 100, 4, 5] //查: //contains:是否包含该元素 System.out.println(list1.contains(11));//false //get:获取下标元素 int ret=list1.get(3); System.out.println(ret);//100 //indexOf:获取元素下标 int ret2=list1.indexOf(4); System.out.println(ret2);//4 //改 //set:将某下标的元素进行更改 list1.set(1,13); System.out.println(list1);//[1, 13, 3, 100, 4, 5] //删: // remove:删除第一次出现的元素 list1.remove(2); list1.remove(3); //list1.remove(6);//超出范围,报错 System.out.println(list1);//[1, 13, 100, 5] //清空 list1.clear(); System.out.println(list1);//无 //大小的获取: System.out.println(list1.size()); }

 

  4🍍.ArrayList的遍历

ArrayList的遍历可以使用三种方法:for循环、foreach、使用迭代器

示例:

 public static void main(String[] args) { List<Integer> list1=new ArrayList<>(); list1.add(1); list1.add(2); list1.add(3); list1.add(4); list1.add(5); }

for循环:

//for循环语句: //list1.size():list1长度 for (int i = 0; i < list1.size(); i++) { //get(i):获取i下标的元素 System.out.print(list1.get(i)+" ");//1 2 3 4 5 } 

foreach语句:

//foreach: //每次循环时,取出list中的一个元素,将该元素赋值给变量num中 for (Integer num:list1) { System.out.print(num+" ");//1 2 3 4 5 }

 迭代器:Iterator和ListIterator

 //迭代器: //从前往后打印 // Iterator System.out.println("=====Iterator====="); Iterator<Integer> a=list1.iterator(); //a.hasNext():用于判断集合a中是否还有下一个元素,如果有返回true,没有返回false while(a.hasNext()){ //a.next:返回迭代器当前所指向的元素,然后指向下一个元素未被遍历的元素并打印 System.out.print(a.next()+" "); } System.out.println(); //listIterator System.out.println("=====listIterator====="); ListIterator<Integer> b=list1.listIterator(); while(b.hasNext()){ System.out.print(b.next()+" ");//1 2 3 4 5 } System.out.println(); System.out.println("=====listIterator====="); //从后往前打印 ListIterator<Integer> c=list1.listIterator(list1.size()); //b.hasPrevious():用于判断集合a中是否有上一个元素,如果有返回true,没有返回false while(b.hasPrevious()){ //b.previous:返回迭代器当前所指向的元素,然后指向上一个元素未被遍历的元素并打印 System.out.print(b.previous()+" ");//5 4 3 2 1 }
  • ArrayList适合使用for循环语句遍历; 
Iterator和Listiterator的区别: Iterator是Java中的一个接口,通过hasNext()和next()方法实现顺序遍历;Listiterator是Iterator的子接口,除了拥有Iterator的方法外,还有其他功能,所以其还有双向遍历的功能,通过hasPrevious()和previous()来实现反向遍历。

5🍍.ArrayList特点

  • 动态数组结构:基于数组实现。可以像普通数组一样快速访问元素;
  • 动态调整大小:与普通数组不同,当添加的元素个数大于ArrayList容量,ArrayList会自动扩容1.5倍;
  • 元素储存有序:元素按照先后添加的顺序在排序中,在插入或者删除元素的时候,会相应改变元素位置;
  • 允许元素重复:可以添加多个重复相同的元素;
  • 通用性好:可以储存各类对象。

6🍍.ArrayList优缺点

1.🍋ArrayList的优点:

  • 快速访问元素:基于数组实现,可以快速访问元素,时间复杂度为O(1);
  • 内存利用相对高效:内存布局相对规整,主要是数组占用空间和少量额外空间用于记录数组大小等信息。在不用频繁的插入和删除中间元素的情况下,内存利用高效;
  • 支持随机访问:可以随机访问任意位置的元素,在很多算法和操作中非常有用,如二分查找。

2.🍋ArrayList的缺点:

  • 扩容开销:当元素数量大于数组容量的时候,会进行扩容。在扩容时会创建一个新的容量更大的数组并复制旧元素,这会消耗较多的时间和资源;
  • 插入和删除的效率较低(中间元素):在频繁的插入和删除中间元素的时候,需要不断地移动元素,时间复杂度为O(n)。

由于ArrayList不适合进行频繁的插入和删除元素,所以在Java集合中引入了LinkedList,即链表结构。

三🌞、LinkedList

1🍰.什么是LinkedList?

LinkedList的底层是双向链表结构,是链表的一种。

什么是链表?

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据域和指针域。链表逻辑顺序连续的,在物理存储结构非连续的。

链表的分类:

有头链表或者无头链表:
有头链表:有一个的头节点,其指针指向第一个数据节点;无头链表:没有专门的头节点,第一个节点直接存储数据;



以下分类都有分为是否是有头链表还是无头链表:单链表:每个节点包含数据和下一个接节点的指针,最后一个节点的指针指向空

双链表:每个节点都有包含数据,以及指向前一个节点的指针和指向后一个节点的指针

循环链表:循环链表分为单循环链表和双循环链表,其就是最后一个节点的下一个节点的指针指向其头结点。

2🍰.LinkedList的实例化

LinkedList<Integer> list1=new LinkedList<>();

3🍰.LinkedList的使用

其常用方法与ArrayList相差不大

 public static void main(String[] args) { LinkedList<Integer> list1=new LinkedList<>(); //增: //add:尾插 list1.add(1); list1.add(2); list1.add(3); list1.add(4); list1.add(5); System.out.println(list1);//[1, 2, 3, 4, 5] //add:任意位置插入 list1.add(3,100); System.out.println(list1);//[1, 2, 3, 100, 4, 5] //查: //contains:是否包含该元素 System.out.println(list1.contains(11));//false //get:获取下标元素 int ret=list1.get(3); System.out.println(ret);//100 //indexOf:获取元素下标 int ret2=list1.indexOf(4); System.out.println(ret2);//4 //改 //set:将某下标的元素进行更改 list1.set(1,13); System.out.println(list1);//[1, 13, 3, 100, 4, 5] //删: // remove:删除第一次出现的元素 list1.remove(2); list1.remove(3); //list1.remove(6);//超出范围,报错 System.out.println(list1);//[1, 13, 100, 5] //清空 list1.clear(); System.out.println(list1);//无 //大小的获取: System.out.println(list1.size());//0 }

4🍰.LinkedList的遍历

 遍历的三种方式:for循环,foreach、迭代器

 public static void main(String[] args) { LinkedList<Integer> list1=new LinkedList<>(); list1.add(1); list1.add(2); list1.add(3); list1.add(4); list1.add(5); //for循环语句: for (int i = 0; i < list1.size(); i++) { int ret=list1.get(i); System.out.print(ret+" ");//1 2 3 4 5 } System.out.println(); //foreach for (Integer x:list1) { System.out.print(x+" ");//1 2 3 4 5 } System.out.println(); //迭代器: Iterator<Integer> a=list1.iterator(); while (a.hasNext()){ System.out.print(a.next()+" ");//1 2 3 4 5 } System.out.println(); ListIterator b=list1.listIterator(); while (b.hasNext()){ System.out.print(b.next()+" ");//1 2 3 4 5 } System.out.println(); ListIterator c=list1.listIterator(list1.size()); while(c.hasPrevious()){ System.out.print(c.previous()+" ");//5 4 3 2 1 } }
  • LinkedList适合使用迭代器遍历; 

5🍰.ListedList的特点

  • 动态性没有固定的大小限制,大小可动态变化;
  • 插入或删除高效:在插入和删除时,只需修改相关节点即可,时间复杂度为O(1)
  • 顺序访问:只能顺序访问节点,效率较低,时间复杂度为O(n)
  • 存储结构:由一系列节点组成,每个节点包含数据域和指针域;
  • 通用性:可以存储不同数据。

6🍰.LinkedList优缺点

1🍐.LinkedList优点:

  • 动态性强:节点分散存储,不受连续空间的限制
  • 插入或删除高效:在插入和删除时,只需修改相关节点即可,时间复杂度为O(1)
  • 可扩性好:可方便的增加和减少节点的数量;

2🍐.LinkedList缺点:

  • 随机访问效率低:只能顺序访问节点,效率较低,时间复杂度为O(n)
  • 额外空间开销大:除了存储数据本身,每个节点还要存储额外的指针信息,内存利用率低
  • 数据存储不连续:不利于有效存储,导致数据访问慢;

四🌞、ArrayList与LinkedList的区别

不同点ArrayListLinkedList
数据结构逻辑上和物理上都是连续的在逻辑上连续,物理上不连续
随机访问

随机访问效率快,

时间复杂度为O(1)

随机访问效率慢,

时间复杂度为O(n)

插入或删除

效率慢,

时间复杂度为O(n)

效率快,

时间复杂度为O(1)

容量空间不够需要扩容没有容量限制
内存占用内存利用相对高效内存利用率低
应用场景元素访问+高效存储插入和删除频繁

Read more

【大模型科普】AIGC技术发展与应用实践(一文读懂AIGC)

【大模型科普】AIGC技术发展与应用实践(一文读懂AIGC)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能(AI)通过算法模拟人类智能,利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络(如ChatGPT),经海量数据训练后能完成文本生成、图像创作等复杂任务,显著提升效率,但面临算力消耗、数据偏见等挑战。当前正加速与教育、科研融合,未来需平衡技术创新与伦理风险,推动可持续发展。 文章目录 * 一、AIGC概述 * (一)什么是AIGC * (二)AIGC与大模型的关系 * (三)常见的AIGC应用场景 * (四)AIGC技术对行业发展的影响 * (五)AIGC技术对职业发展的影响 * (六)常见的AIGC大模型工具 * (七)AIGC大模型的提示词 * 二、文本类AIGC应用实践 * (一)案例1:与DeepSeek进行对话 * (二)案例2:与百度文心一言进行对话 * (三)案例3:使用讯飞智文生成PPT

GitHub Copilot的最新更新:从代码补全到需求理解

Copilot需求理解演进 ⚡ 核心摘要 * 核心演进: Copilot已从代码补全工具,演进为能深度把握开发者意图的AI开发助手。 * 关键技术: 其能力飞跃依赖于模型升级、多Agent系统和代码库索引三项核心技术突破。 * 实际影响: 显著提升开发效率(增益26%-35%)和代码质量(正确率提升至46.3%)。 GitHub Copilot自2021年推出以来,经历了从简单的代码补全工具到全面的AI开发助手的质变。这一演进不仅体现在技术能力的提升上,更反映了AI在软件开发领域应用的深刻变革。当前GitHub Copilot已成功从"代码补全"阶段跨越至"需求理解"阶段,通过融合多Agent系统、代码库索引和多模态能力,实现了对开发者意图的深度把握和对复杂开发任务的自主执行。本文将深入分析GitHub Copilot的功能演进路径,剖析其需求理解的核心技术突破,并评估这些创新对开发者工作效率和代码质量的实际影响,同时展望其在AI开发助手领域的创新定位与未来发展趋势。 关键结论 (Key Takeaway) 当前GitHub Copilot已成功从"代码补全"阶段跨越至

win10升级后总会弹出365 Copilot窗口如何禁用和关闭

win10升级后总会弹出365 Copilot窗口如何禁用和关闭

win10升级后总会弹出365 Copilot窗口如何禁用和关闭 在Windows 10中,可以通过以下几种方法禁用或关闭Microsoft 365 Copilot: 方法一:任务栏上直接禁用 1. 右键点击任务栏。 2. 在弹出的菜单中,找到并取消勾选“显示 Copilot(预览版)按钮”选项。 这种方法只是让Copilot不再显示在任务栏上,但并未彻底禁用该功能。用户仍然可以通过“Windows 键 + C”键盘快捷键来打开和关闭Copilot界面。 方法二:利用组策略彻底禁用 1. 打开开始菜单,搜索“组策略”并打开组策略编辑器。 2. 按照“用户配置 > 管理模板 > Windows 组件 > Windows Copilot”的路径依次展开。 3. 双击“关闭 Windows Copilot”

AIGC浪潮下,图文内容社区数据指标体系如何构建?

AIGC浪潮下,图文内容社区数据指标体系如何构建?

文章目录 * 01 案例:以图文内容社区为例实践数据指标体构建 * 02 4个步骤实现数据指标体系构建 * 1. 明确业务目标,梳理北极星指标 * 2. 梳理业务流程,明确过程指标 * 3. 指标下钻分级,构建多层级数据指标体系 * 4. 添加分析维度,构建完整的数据指标体系 * 03 构建数据指标体系的过程总结 * 作者简介 * 目 录 数据指标体系构建是数据分析师的日常工作之一,常见的指标体系方法论包括根据业务发展进程选取由合成略旦易于拆解的指标作为北极星指标。但在实际业务场景中如何运用方法论构建数据指标体系,以监控业务发展呢? 互联网产品按照用户需求进行分类,可以分为工具类、内容类、社交类、交易类以及游戏类。当然,每一个互联网产品并不一定属于单一的某一类别,其类别可能是交叉的。 那各种不同类型的互联网产品都有什么特点?它们对应的北极星指标又分别是什么呢?各类型互联网产品的特点以及北极星指标总结如表1所示。 表 1 各类型互联网产品的特点以及北极星指标 表1 各类型互联网产品的特点以及北极星指标 表1各类型互联网产品的特点以及