美文网首页
Java中的集合List - 入门篇

Java中的集合List - 入门篇

作者: 汤圆学Java | 来源:发表于2021-03-31 09:48 被阅读0次

    前言

    大家好啊,我是汤圆,今天给大家带来的是《Java中的集合List - 入门篇》,希望对大家有帮助,谢谢

    简介

    说实话,Java中的集合有很多种,但是这里作为入门级别,先简单介绍第一种集合List,如下图所示

    集合

    正文

    List是一种有序集合,和数组的行为非常相似,但是比数组灵活;

    因为数组是长度固定的,而List的长度是动态分配的。

    数组的概览

    既然LIst是基于数组实现的,那么在介绍List之前,我们先来熟悉一下Java的数组吧(简单过一下,毕竟用的不多了)

    数组对象有一个length属性来获取数组的长度,和一个"[]"方法来访问元素

    数组也是一个对象,通过直接打印数组可以看出来,比如[Ljava.lang.String;@1b6d3586

    如下所示,我们先初始化一个数组,并通过length访问了数组的长度,[]语法访问数组内的元素

    // 初始化数组
    String[] arr = {"1", "2", "3"};
    // 数组长度
    int length = arr.length;
    // 数组第一个元素
    String a1 = arr[0];
    // 数组转为字符串,需借助Arrays工具类
    String res = Arrays.toString(arr);
    
    System.out.println(length);
    System.out.println(a1);
    System.out.println(res);
    

    其中我们用到了Arrays这个工具类,因为数组的toString方法不能直接拼接内部的元素,而是打印数组对象的地址

    List可以,直接调用List.toString()即可输出所有元素拼接后的字符串

    数组的优点:

    随机访问快,也是仅存的一个优点(其他地方都没ArrayList好)

    数组的缺点

    长度固定,插入慢

    好了,数组先说到这里,下面开始说List

    List的接口方法

    下面是几个常用的List接口方法:

    • boolean add(E e):在列表末尾插入元素E

    • void add(int index, E element):在指定位置 index 插入元素 E

    • E get(int index):查询指定位置 index 的元素

    • boolean contains(Object o):查询列表是否包含指定的对象

    • boolean remove(Object o):删除指定的对象

    • int size():查询列表的元素个数

    ArrayList和LinkedList的区别

    用表格对比结果如下:

    ArrayList LinkedList
    内部结构 数组,有序 双向链表,无序
    随机访问
    插入、修改 慢(如果是末尾插入,则很快)

    可以看到,ArrayList适合随机访问,LinkedList适合插入和修改(如果是尾插,则区别不大)

    为什么ArrayList随机访问很快呢?

    ArrayList是基于数组实现的,而数组又是基于整数索引(下标)来查询数据的,所以ArrayList的查询效率很高

    为什么ArrayList插入又很慢?

    插入很慢,是因为ArrayList内部基于数组实现,内存都是连续的,因此插入时要移动后面的数据;

    如果是直接在末尾插入,则不需要移动任何数据,也就快了(默认添加元素时,就是在尾部插入)

    但是如果我要在中间位置插入,那么后面的数据都需要移动

    比如下图,我想把 "Cat 005" 插入到 "Cat 001" 后面,那么后面的 "Cat 002"、"Cat 003"、 "Cat 004"都要移动,这就导致效率很低

    ArrayList中间插入图

    为什么LinkedList随机访问慢?

    因为LinkedList内部是双向链表结构,即每个元素都包含一个前引用和后引用,如下图所示

    LinkedList内部结构

    这就导致了一个问题,每次不管我访问哪个元素,都需要从头开始一个个索引;

    结果就是访问速度很慢。

    那么为什么LinkedList随机插入很快呢?

    正所谓"成也萧何败萧何",虽然随机访问慢,但是正因为有了这些链表结构,使得插入的时候很方便了

    因为现在不需要移动任何元素,只需要修改前后元素的引用就可以了

    比如下图,我想把 "Dog 005" 插入到 "Dog 001" 后面,那么只需要修改 "Dog 001"的后引用和"Dog 002"的前引用,其他元素都不用动的

    LinkedList中间插入图

    细心的你们可能发现了,ArrayList图中的元素都是顺序排列的,而LinkedList图中的元素都是随机排列的;

    这个其实就是为了说明他们俩的内部结构特征,ArrayList内存空间有序,LinkedList内存空间无序

    那么LinkedList这样设计,除了插入快,还有其他好处吗?

    当然有啊,因为LinkedList内部的数据都是通过引用来连接到一起的,所以就可以很好的利用零散的内存空间,从而提高内存利用率

    代码

    下面我们用代码来实践下

    // 初始化
    List<String> list = new ArrayList<>();
    // 插入数据
    list.add("hello world 1");
    // 在指定位置插入数据
    list.add(0, "hello world 2");
    // 查询数据
    String s1 = list.get(0);
    // 查询List是否包含指定对象
    boolean isContain = list.contains(s1);
    // 查询列表的元素个数
    int size = list.size();
    // 打印list内部元素:
    String res = list.toString();</pre>
    

    结果如下所示,可以看到,List.toString()会自动拼接内部元素

    List代码输出

    总结

    List是一种有序集合,和数组的行为非常相似,但是比数组灵活;

    最常用的是ArrayList,它适用于大部分场景;

    但是在插多查少的情况下,建议用LinkedList,可以提高插入的效率;

    后记

    最后,感谢大家的观看,谢谢

    相关文章

      网友评论

          本文标题:Java中的集合List - 入门篇

          本文链接:https://www.haomeiwen.com/subject/ifrohltx.html