List集合

一、特点,特有方法

List集合:有序,可重复,有索引

ArrayList集合:有序,可重复,有索引

LinkedList集合:有序,可重复,有索引

ArrayList集合和LinkedList集合底层采用的数据结构(存储,组织数据的方式)不同,应用场景不同

List集合的特有方法

List集合因为支持索引所以多了很多与索引相关的方法,当然,Collection的功能List也都继承了

|-------------------------------|---------------------|
| 方法名称 | 说明 |
| void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
| E remove (int index) | 删除指定索引处的元素,返回被删除的元素 |
| E set (int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
| E get(int index) | 返回指定索引处的元素 |

import java.util.ArrayList;
import java.util.List;

public class ConList {
    public static void main(String[] args) {
        //1、void add(int index,E element)	在此集合中的指定位置插入指定的元素
        List<String>list=new ArrayList<>();
        list.add("宋钟基");
        list.add("胡歌");
        list.add("杨幂");
        System.out.println(list);
        list.add(3,"张国荣");
        list.add(0,"陈建斌");
        list.add(1,"宋雨琦");
        list.add(2,"董卿");
        System.out.println(list);
        //2、E remove (int index)	删除指定索引处的元素,返回被删除的元素
        list.remove(1);
        System.out.println(list);
        //3、E set (int index,E element)	修改指定索引处的元素,返回被修改的元素
        System.out.println(list.set(3, "董宇辉"));

        //4、E get(int index)	返回指定索引处的元素
        System.out.println(list.get(1));

    }
}

二、遍历方式

List集合支持的遍历方式

① for循环(因为List集合有索引)

②迭代器

③增强for循环

④Lambda表达式

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;

public class ListBianli {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("花千骨");
        list.add("糖宝");
        list.add("风轻水");
        System.out.println(list);
        //① for循环(因为List集合有索引)
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        //②迭代器
        Iterator <String>  iterator=list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        //③增强for循环
        for (String s : list) {
            System.out.println(s);
        }
        //④Lambda表达式
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

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

三、ArrayList集合的底层原理

基于数组实现的

数组的特点:查询快,增删慢

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

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

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

1、ArrayList集合的底层原理

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

②添加一个元素时底层会创建一个新的长度为10的数组

③存满时,会扩容1.5倍

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

特点:查询快,增删慢

ArrayList集合适合的应用场景

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

2、ArrayList不适合:数据量大的同时,又要频繁的进行增删操作。

LinkedList集合的底层原理

*基于双链表实现的

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

1、什么是链表?有啥特点?

链表中的节点是独立的对象,在内存中是不连续的,每个节点包含数据值和下一个节点的地址。

链表的特点:①查询慢,无论查询哪个数据,都要从头开始找②链表增删相对快

单向列表:只能从头节点往后找

双向列表:既可以从头节点往后找,也可以从尾节点往前找。

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

LinkedList新增了:很多首尾操作的特有方法

|---------------------------|------------------|
| 方法名称 | 说明 |
| public void addFirst(E e) | 在该列表开头插入指定的元素 |
| public void addList(E e) | 将指定的元素追加到此列表的首尾 |
| public E getFirst() | 返回此列表中的第一个元素 |
| public E getLast() | 返回此列表中的最后一个元素 |
| public E removeFirst() | 从此列表中删除并返回第一个元素 |
| public E removeLast() | 从此列表中删除并返回最后一个元素 |

LinkedList的应用场景之一:可以用来设计对列

队列的特点:先进先出,后进后出。

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

LinkedList的应用场景之二:可以用来设计栈

栈的特点:后进先出,先进后出

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

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

栈顶元素先出,栈底元素后出

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

import java.util.LinkedList;

public class ListTest {
    public static void main(String[] args) {
        //1、创建一个队列
        LinkedList<String> queue=new LinkedList<>();
        queue.addFirst("第一个");
        queue.addFirst("第二个");
        queue.addFirst("第三个");
        queue.addFirst("第四个");
        System.out.println(queue);
        //出队
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        //创建一个栈对象
        LinkedList<String> stack=new LinkedList<>();
        stack.addFirst("第一个");
        stack.addFirst("第二个");
        stack.addFirst("第三个");
        stack.addFirst("第四个");
        System.out.println(stack);
        System.out.println(stack.removeFirst());
    }
}
相关推荐
代码雕刻家1 分钟前
课设实验-数据结构-线性表-手机销售
c语言·数据结构
秀聚32 分钟前
C++中的类型推导:auto 和 decltype 介绍
数据结构·c++·算法
Inverse1621 小时前
C语言_回调函数和qsort
c语言·数据结构·算法
cool 3212 小时前
数据结构与算法
数据结构
丁丁Tinsley111711 小时前
数据结构——顺序表(基础代码题)
c语言·数据结构·算法
编程版小新11 小时前
C++初阶:STL详解(七)——list的模拟实现
开发语言·c++·学习·迭代器·list·list的模拟实现
Grayson_Zheng13 小时前
【解决方案】关于 UART 接收数据时丢失数据的解决办法——环形缓冲存储区
c语言·数据结构·stm32·单片机
退居二线程序员13 小时前
【完-网络安全】Windows注册表
windows
碧海蓝天202214 小时前
C++ 线性表、内存操作、 迭代器,数据与算法分离。
开发语言·数据结构·c++·算法
single59414 小时前
【优选算法】(第十七篇)
java·数据结构·c++·vscode·算法·leetcode