List系列集合:

3.1 List集合的常用方法

用代码演示一下这几个方法的效果

复制代码
public class ListTest1 {
    public static void main(String[] args) {
        // 创建一个ArrayList集合对象(有序、有索引、可以重复)
        List<String> list = new ArrayList<>();
        list.add("蜘蛛精");
        list.add("至尊宝");
        list.add("至尊宝");
        list.add("牛夫人");
        System.out.println(list); // [蜘蛛精, 至尊宝, 至尊宝, 牛夫人]
​
        // 在某个索引位置插入元素
        list.add(2, "紫霞仙子");
        System.out.println(list); // [蜘蛛精, 至尊宝, 紫霞仙子, 至尊宝, 牛夫人]
​
        // 根据索引删除元素, 返回被删除的元素
        System.out.println(list.remove(2)); // 紫霞仙子
        System.out.println(list);// [蜘蛛精, 至尊宝, 至尊宝, 牛夫人]
​
        // 返回集合中指定位置的元素
        System.out.println(list.get(3));
​
        // 修改索引位置处的元素,修改后,会返回原数据
        System.out.println(list.set(3, "牛魔王")); // 牛夫人
        System.out.println(list); // [蜘蛛精, 至尊宝, 至尊宝, 牛魔王]
    }
}

3.2 List集合的遍历方式

List集合相比于前面的Collection多了一种可以通过索引遍历的方式,所以List集合遍历方式一共有四种:

  • 普通for循环(只因为List有索引)

  • 迭代器

  • 增强for

  • Lambda表达式

public class ListTest2 {

public static void main(String\[\] args) {

List<String> list = new ArrayList<>();

list.add("蜘蛛精");

list.add("至尊宝");

list.add("糖宝宝");

// 1.普通for循环

for(int i = 0; i< list.size(); i++){

//i = 0, 1, 2

String e = list.get(i);

System.out.println(e);

}

System.out.println("--------------");

// 2.增强for遍历

for(String s : list){

System.out.println(s);

}

System.out.println("--------------");

// 3.迭代器遍历

Iterator<String> it = list.iterator();

while(it.hasNext()){

String s = it.next();

System.out.println(s);

}

System.out.println("--------------");

// 4.lambda表达式遍历

list.forEach(s -> System.out.println(s));

}

}

3.3 ArrayList底层的原理(面试题)

3.4 ArrayList的应用场景

复制代码
应用场景:
    1、ArrayList适合: 根据索引查询数据,比如根据随机索引取数据(高效)! 或者数据量不是很大时!
    2、ArrayList不适合: 数据量大的,同时又要频繁的进行增删操作!

复制代码
总结:
1、List系列集合的特点是什么?
    ArrayList、LinekdList :有序,可重复,有索引。
​
2、ArrayList集合的底层是基于什么实现的, 有什么特点呢?
    数组
    特点:
        查询快, 增删慢
    
3、ArrayList集合适合什么业务场景?不适合什么业务场景?
    ArrayList适合: 根据索引查询数据,比如根据随机索引取数据(高效)! 或者数据量不是很大时!
    ArrayList不适合: 数据量大的,同时又要频繁的进行增删操作!

3.5 LinkedList底层原理

LinkedList底层是链表结构,基于双链表实现的。

链表结构是由一个一个的节点组成,一个节点由数据值、下一个元素的地址组成。如下图所示:

LinkedList集合是基于双向链表实现了,为什么它会对首尾元素进行增删改查的速度是极快的,因为双向链表是有头结点地址和尾结点地址, 通过头结点地址和尾结点地址可以快速的找到第一个元素和最后一个元素,那么在头和尾节点进行增删速度肯定是极快的,比如在尾结点后加一个元素,让尾结点指向新加的元素,那么新加的元素就是尾结点,头结点同理可知,如果删除尾结点,尾结点一旦删除倒数第二个就是尾结点,所以说首尾元素进行增删改查的速度是极快的,但是对中间的数据还是需要找到对应节点位置才可以操作。

所以相对于ArrayList新增了一些可以针对头尾进行操作的方法,如下图示所示:

3.6 LinkedList集合的应用场景

刚才我们学习了LinkedList集合,那么LinkedList集合有什么用呢?可以用它来设计栈结构、队列结构。

  • 队列结构你可以认为是一个上端开口就是入队,下端也开口的管子的形状就是出队。元素从上端入队列,从下端出队列。所以队列的特点就是先进先出,后进后出
  • 用LinkedList集合来模拟一下栈结构的效果。还是先来认识一下栈结构长什么样。栈结构可以看做是一个上端开头,下端闭口的水杯的形状。

    元素永远是上端进,也从上端出,先进入的元素会压在最底下,所以栈结构的特点是先进后出,后进先出

总结:

LinkedList集合的底层原理

基于双链表实现的。

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

相关推荐
CS创新实验室5 小时前
从顺序表到动态数组:数据结构的永恒基石与现代语言的优雅封装
数据结构·算法
阿汤猫6666 小时前
基于OpenCode的Harness架构实战验收指南v3.0 (windows系统)
windows·prompt
8Qi87 小时前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS7 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源
阿汤猫6667 小时前
基于OpenCode的Harness架构实战v2.2(windows系统)
windows·prompt
Boom_Shu9 小时前
长方形的关系
数据结构·c++·算法
xiaoshuaishuai89 小时前
C# AvaloniaUI 资源找不到报错
java·服务器·前端·windows·c#
思麟呀9 小时前
C++11并发编程:call_once一次性执行+atomic原子类型+CAS无锁编程+自旋锁
linux·开发语言·jvm·c++·windows
爱讲故事的10 小时前
操作系统第一讲复习:为什么学习操作系统,以及操作系统到底在做什么?
linux·开发语言·windows·学习·ubuntu·c#
Lsk_Smion10 小时前
力扣实训 _ [543].二叉树的直径 _ [23].合并K个升序列表
数据结构·算法·leetcode