【JavaSE】十、ArrayList && LinkedList

文章目录

  • [Ⅰ. ArrayList](#Ⅰ. ArrayList)
  • [Ⅱ. LinkedList](#Ⅱ. LinkedList)
  • [ArrayList 与 LinkedList 的区别](#ArrayList 与 LinkedList 的区别)

Ⅰ. ArrayList

官方文档

构造函数有以下泛型参数:(其它有该构造函数的集合类均可这样子处理)

注意事项:

  1. 长度方法的区别:
    1. 数组用 .length 获取元素长度
    2. String.length() 获取元素长度
    3. 集合类用 .size() 获取元素长度
  2. ArrayList 不是线程安全的 ,在单线程下可以使用,在多线程中可以选择 CopyOnWriteArrayList
  3. ArrayList 底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

注意事项:

  1. subList() 中拿到的 List 对象是原来 List 对象中的一部分,对这部分进行修改,是会影响到原对象的!
  2. 要使用迭代器,必须要实现 Iterator 接口,并且重写 iterator 方法!
  3. 注意 List<Integer> tmp = null 表示 tmp 是没有引用任何对象 ,而 List<Integer> tmp = new ArrayList<>() 表示有引用对象,但只是一个空盒子
  4. List.copyOf() 方法返回的 List 是不可变的!
  5. 下图是两个拷贝函数的区别:

遍历

java 复制代码
public static void main(String[] args) {
    List<Integer> list = new ArrayList<Integer>();
    list.add(10);
    list.add(20);
    list.add(30);
    list.add(40);
    list.add(50);

    // 1. 下标遍历(推荐⭐)
    for(int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i));
    }

    // 2. for-each遍历(推荐⭐)
    for(Integer e: list) {
        System.out.println(e);
    }

    // 3. 迭代器遍历:使用Iterator的hasNext()和next()方法
    Iterator<Integer> iter = list.iterator();
    while(iter.hasNext()) {
        System.out.println(iter.next());
    }
}

Ⅱ. LinkedList

LinkedList 的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。

LinkedList 没有实现 RandomAccess 接口,因此 LinkedList 不支持随机访问

对于 LinkedList 来说,它的接口和 ArrayList 的接口基本是一样的,只是逻辑和物理存储上面的区别,所以具体接口可以参考 ArrayList 的笔记或者直接翻看官方文档!

遍历方式

go 复制代码
public static void main(String[] args) {
    List<Integer> list = new LinkedList<>();
    list.add(1);
    list.add(2);
    list.add(3);

    // 遍历方式一:使用自带的重写的toString()方法
    System.out.println(list);

    // 遍历方式二:for-each循环
    for (int e : list) {
        System.out.print(e + " ");
    }
    System.out.println();

    // 遍历方式三:普适的迭代器
    Iterator<Integer> it1 = list.iterator();
    while(it1.hasNext()) {
        System.out.print(it1.next() + " ");
    }
    System.out.println();

    // 遍历方式四:使用LinkedList专用的迭代器
    ListIterator<Integer> it2 = list.listIterator();
    while(it2.hasNext()) {
        System.out.print(it2.next() + " ");
    }
    System.out.println();

    // 遍历方式五:反向迭代器
    ListIterator<Integer> rit = list.listIterator(list.size());
    while(rit.hasPrevious()) {
        System.out.print(rit.previous() + " ");
    }
    System.out.println();
}

ArrayList 与 LinkedList 的区别

相关推荐
qfljg16 分钟前
OpenRewrite 实战指南
java
Sylvia33.21 分钟前
LOL实时数据接入深度解析:从WebSocket到完整数据模型
java·网络·python·websocket·网络协议
2601_962071576 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491116 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
zww89491119 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
kiracrimson9 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
黑马程序员毕设10 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳10 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
白山编程大哥10 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
devpotato11 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis