JavaSe—List集合系列

目录

1、List集合的特有方法

2、List系列集合

[1.1 ArrayLiat集合](#1.1 ArrayLiat集合)

3、ArrayList和LinkeList的区别及底层原理

[3.1 LinkedList的应用场景之一:可以用来设计队列](#3.1 LinkedList的应用场景之一:可以用来设计队列)

[3.2 LinkedList的应用场景之二:可以用来设计栈](#3.2 LinkedList的应用场景之二:可以用来设计栈)


1、List集合的特有方法

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

2、List系列集合

1.1 ArrayLiat集合

分类 方法名 / 属性 语法格式 功能说明 示例代码 注意事项
创建对象 构造方法 new ArrayList<>() new ArrayList<>(初始容量``) new ArrayList<>(Collection<? extends E> c) 创建一个空的 ArrayList 指定初始容量创建 用已有集合初始化 ArrayList<String> list = new ArrayList<>(); ArrayList<Integer> list2 = new ArrayList<>(10); List<String> other = Arrays.asList("a", "b"); ArrayList<String> list3 = new ArrayList<>(other); 推荐使用泛型 <E> 明确存储类型,避免类型错误
添加元素 add(E e) list.add(element) 在末尾添加一个元素 list.add("Hello"); 返回 true
add(int index, E element) list.add(index, element) 在指定索引位置插入元素,后续元素后移 list.add(0, "World"); 索引越界会抛出 IndexOutOfBoundsException
获取元素 get(int index) list.get(index) 获取指定索引位置的元素 String s = list.get(0); 索引必须在 [0, size-1] 范围内
修改元素 set(int index, E element) list.set(index, newElement) 替换指定索引位置的元素 list.set(0, "Hi"); 返回被替换的旧元素
删除元素 remove(int index) list.remove(index) 删除指定索引位置的元素 String removed = list.remove(0); 返回被删除的元素
remove(Object obj) list.remove(obj) 删除第一个匹配该对象的元素 list.remove("Hi"); 成功返回 true,否则 false;注意包装类型(如 Integer)比较
查询信息 size() list.size() 返回当前元素个数 int count = list.size(); 不是容量,而是实际元素数量
isEmpty() list.isEmpty() 判断是否为空 if (list.isEmpty()) {...} size() == 0 更推荐
contains(Object obj) list.contains(obj) 判断是否包含某个元素 boolean hasA = list.contains("a"); 依赖 equals() 方法比较
indexOf(Object obj) list.indexOf(obj) 返回第一次出现的位置,找不到返回 -1 int pos = list.indexOf("a"); 从前往后找
lastIndexOf(Object obj) list.lastIndexOf(obj) 返回最后一次出现的位置 int lastPos = list.lastIndexOf("a"); 从后往前找
清空集合 clear() list.clear() 移除所有元素 list.clear(); 集合变为空,但对象仍存在
转换为数组 toArray() list.toArray() T[] arr = list.toArray(new T[0]); 将 List 转为数组 String[] arr = list.toArray(new String[0]); 推荐传入目标类型的空数组
遍历方式 for 循环 for(int i=0; i<list.size(); i++) 通过索引遍历 for(int i=0; i<list.size(); i++) System.out.println(list.get(i)); 效率高,适合随机访问
增强 for 循环 for(E e : list) 简洁遍历 for(String s : list) System.out.println(s); 不能修改结构(如边遍历边删)
迭代器 Iterator Iterator<E> it = list.iterator(); 安全地遍历并删除 Iterator<String> it = list.iterator();<br>while(it.hasNext()) {<br> String s = it.next();<br> if(s.equals("bad")) it.remove();<br>} 遍历时删除必须用 it.remove()
其他重要方法 ensureCapacity(int minCapacity) list.ensureCapacity(50); 预设最小容量,减少扩容开销 (性能优化用) 提前设置可提升性能
trimToSize() list.trimToSize(); 将容量调整为当前大小,节省内存 (内存优化用) 减少内存占用
⚠️ 线程安全 ------ ------ ArrayList 不是线程安全的 多线程环境下可能出错 可使用 Collections.synchronizedList(new ArrayList<>());CopyOnWriteArrayList

代码1:代码演示了ArrayList中的方法,几乎包括了上表中的所有方法

CollectionDemo1类

java 复制代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;  //
import java.util.List;

public class CollectionDemo1 {
    public static void main(String[] args) {
        System.out.println("------------------------创建ArrayList------------------------");
        //创建ArrayList集合对象
        //方法1 默认容量为10
        ArrayList<Character> list = new ArrayList<>();
        //方法2
        //创建集合对象时,可以指定初始容量,如果添加的元素个数超过指定的初始容量,集合会自动扩容
        ArrayList<Integer> list2 = new ArrayList<>(2);
        list2.add(1);
        list2.add(2);
        list2.add(3);
        System.out.println(list2);
        //方法3
        ArrayList<Integer> list3 = new ArrayList<>(Arrays.asList(1,2,3));
        List<String> other = Arrays.asList("a", "b");  //不可变的列表(固定大小)
        //other.add("c");  //添加元素运行时候会报错
        System.out.println("asList->: " + other);
        Integer[] a = {1,2,3};
        List<String> list4 = new ArrayList<>(other); //用它来创建一个新的、可变的 ArrayList
        list4.add("c");
        System.out.println("asList 变为ArrayList->: " + list4);
        //new ArrayList<>(Collection<? extends E> c)
        List<String> list5 = new ArrayList<>(Arrays.asList("a", "b", "c"));

        System.out.println("------------------------添加元素------------------------");
        //使用list列表当前为空
        list.add('a');
        list.add('b');
        list.add(1, 'c');  //在指定位置添加元素
        list.add('e');
        list.add('f');
        list.add('e');
        list.add('c');
        list.add('c');
        System.out.println(list);

        System.out.println("------------------------获取元素------------------------");
        System.out.println(list.get(0));
        System.out.println(list.get(1));

        System.out.println("------------------------修改元素------------------------");
        list.set(0, 'd');
        System.out.println(list);

        System.out.println("------------------------删除元素------------------------");
        list.remove(0);  //删除指定索引的元素
        list.remove((Character) 'e'); //删除指定元素,出现第一次的 要确定数组中有这个元素,要给一个对象。
        System.out.println(list);

        System.out.println("------------------------返回当前数组长度------------------------");
        System.out.println(list.size());

        System.out.println("------------------------判断集合是否为空------------------------");
        System.out.println(list.isEmpty());

        System.out.println("------------------------判断集合中是否包含某个元素------------------------");
        System.out.println(list.contains('a'));

        System.out.println("------------------------返回集合的索引(第一个)------------------------");
        System.out.println(list.indexOf('c'));  //返回指定元素在集合中的索引(第一次),如果没有,返回-1

        System.out.println("------------------------返回集合的索引(最后一个)------------------------");
        System.out.println(list.lastIndexOf('c'));  //返回指定元素在集合中的索引(最后一次),如果没有,返回-1

        //迭代器
        System.out.println("------------------------迭代器------------------------");
        list.removeAll(list);
        list.add('a');
        //迭代安全删除
        Iterator<Character> it = list.iterator();
//        System.out.println(it.hasNext()); //
//        while(it.hasNext()) {  //判断集合中是否有下一个元素
//            Character s = it.next();
//            if(s.equals('c')) {  //判断当前元素是否为c
//                it.remove(); // ✅ 使用迭代器的remove方法
//                System.out.println("删除了: " + s);
//            }
//        }
//        System.out.println(list);
        //如果这样删除可能会漏删元素 因为迭代器删除元素后,索引会改变
//        for(int i = 0;i < list.size();i++){
//            if(list.get(i).equals('c')){
//                Character c = list.get(i);
//                list.remove(i);
//                System.out.println("删除了: " + c);
//            }
//        }System.out.println( list);

        //加强   循环  程序崩溃
//        for(Character c : list){
//            if(c.equals('c')){
//                list.remove(c);
//            }
//        }

        //removeIf
        list.removeIf(c -> c.equals('c'));  //删除集合中所有满足条件的元素 JDK 8 才出现的方法
        ArrayList list6 = new ArrayList<>();
        list6.add('a');
        list6.add('b');
        System.out.println(list);
        list.removeAll( list6); //删除list6集合中所有元素
        System.out.println( list);
        System.out.println("------------------------清空集合------------------------");
        list.clear();
        System.out.println(list);
    }
}

3、ArrayList和LinkeList的区别及底层原理

  • ArrayList底层是基于数组存储数据的。

  • LinkeLsit底层是基于链表存储数据的。
    数组的特点

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

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

链表以及链表的特点

  • 链表中的数据是一个一个独立的结点组成,结点在内存是不连续的,每个结点包含数据和下一个结点的地址

特点

  • 查询慢,无论查询哪个数据都要从头开始找
  • 链表增删相对快
  • LinkedList集合基于双链表实现的。
  • 双向链表的特点:对首位元素进行删除改查的速度是极快的。

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

java 复制代码
import java.util.LinkedList;

public class LinkedListDemo {
    public static void main(String[] args) {
        //使用LinkedList设计一个队列
        LinkedList<String> queue = new LinkedList();
        //入队在队尾
        queue.addLast("赵敏");
        queue.addLast("小昭");
        queue.addLast("武大郎");
        queue.addLast("西门庆");
        System.out.println(queue);
        //出队在队首
        System.out.println(queue.removeFirst());  //赵敏
        System.out.println(queue.removeFirst());  //小昭
        System.out.println(queue.removeFirst());  //武大郎
        System.out.println(queue.removeFirst());  //西门庆
    }
}
/*
[赵敏, 小昭, 武大郎, 西门庆]
赵敏
小昭
武大郎
西门庆

 */

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

java 复制代码
import java.util.LinkedList;
public class LinkedListDemo1 {
    //用linkedlist实现栈
    public static void main(String[] args) {
        //使用linkedlist实现栈
        LinkedList<String> stack = new LinkedList<>();
        //压栈
        stack.addFirst("张无忌");
        stack.addFirst("周芷若");
        stack.addFirst("赵敏");
        stack.addFirst("小昭");
        System.out.println( stack);
        //弹栈import java.util.LinkedList;
public class LinkedListDemo1 {
    //用linkedlist实现栈
    public static void main(String[] args) {
        //使用linkedlist实现栈
        LinkedList<String> stack = new LinkedList<>();
        //压栈
        stack.addFirst("张无忌");
        stack.addFirst("周芷若");
        stack.addFirst("赵敏");
        stack.addFirst("小昭");
        System.out.println( stack);
        //弹栈
        System.out.println(stack.removeFirst());
        System.out.println(stack.removeFirst());
        System.out.println(stack.removeFirst());
        System.out.println(stack.removeFirst());

        LinkedList<String> stack1 = new LinkedList<>();
        //压栈 Java中提供了push和pop方法
        stack1.push("张无忌");
        stack1.push("周芷若");
        stack1.push("赵敏");
        stack1.push("小昭");
        System.out.println( stack1);
        //弹栈
        System.out.println(stack1.pop());
        System.out.println(stack1.pop());
        System.out.println(stack1.pop());
        System.out.println(stack1.pop());

    }
}
/*
[小昭, 赵敏, 周芷若, 张无忌]
小昭
赵敏
周芷若
张无忌
[小昭, 赵敏, 周芷若, 张无忌]
小昭
赵敏
周芷若
张无忌
 */
        System.out.println(stack.removeFirst());
        System.out.println(stack.removeFirst());
        System.out.println(stack.removeFirst());
        System.out.println(stack.removeFirst());

        LinkedList<String> stack1 = new LinkedList<>();
        //压栈
        stack1.push("张无忌");
        stack1.push("周芷若");
        stack1.push("赵敏");
        stack1.push("小昭");
        System.out.println( stack1);
        //弹栈
        System.out.println(stack1.pop());
        System.out.println(stack1.pop());
        System.out.println(stack1.pop());
        System.out.println(stack1.pop());

    }
}
相关推荐
鼾声鼾语9 分钟前
matlab的ros2发布的消息,局域网内其他设备收不到情况吗?但是matlab可以订阅其他局域网的ros2发布的消息(问题总结)
开发语言·人工智能·深度学习·算法·matlab·isaaclab
其美杰布-富贵-李17 分钟前
HDF5文件学习笔记
数据结构·笔记·学习
Dingdangcat8619 分钟前
中药材图像识别与分类 RetinaNet-R101-FPN模型详解
人工智能·数据挖掘
老蒋新思维21 分钟前
创客匠人视角:智能体重构创始人 IP,知识变现从 “内容售卖” 到 “能力复制” 的革命
大数据·网络·人工智能·tcp/ip·创始人ip·创客匠人·知识变现
麦麦鸡腿堡37 分钟前
Java_类的加载
java·开发语言
我命由我1234537 分钟前
VSCode - Prettier 配置格式化的单行长度
开发语言·前端·ide·vscode·前端框架·编辑器·学习方法
JIngJaneIL1 小时前
基于java + vue校园快递物流管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js
超级大只老咪1 小时前
数组的正向存储VS反向存储(Java)
java·开发语言·python
柏木乃一1 小时前
进程(2)进程概念与基本操作
linux·服务器·开发语言·性能优化·shell·进程