文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java集合-List

2023-09-07 22:12

关注

java.util.List接口继承自Collection接口,是单列集合的一个重要分支,习惯性地会将实现了List接口的对象称为List集合,在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素,另外List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致

List特性:

List实现类架构图

在这里插入图片描述

1、什么是ArrayList类

java.util.ArrayList是大小可变的数组的实现,是单列集合List的实现类,存储在内的数据称为元素,此类提供一些方法来操作内部存储的元素,ArrayList中可不断添加元素,其大小也自动增长
java.util.ArrayList集合数据存储的结构是数组结构,元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是常用的集合。

2、ArrayList常用方法

方法说明
add(E e)把指定的元素添加到集合中
set(int index , E e)根据下标替换对象
subList(int fromIndex , int toIndex)截取
toArray()
toArray(T[])
集合转换数组
contains(E e)判断集合中是否包含指定的元素
get(int index)根据下标获取对应的元素
indexOf(E e)获取指定的元素在集合中第一次出现的索引 -1【未找到】
isEmpty()判断集合是否为空
size()获取集合的长度
clear()清空集合
remove(int index)根本下标删除元素

代码案例:

package cn.com.example11;import java.util.ArrayList;import java.util.List;public class ArrayListClass {    static ArrayList arrayList;    static {        arrayList = new ArrayList();        arrayList.add(1);        arrayList.add(2);        arrayList.add(3);        arrayList.add(4);    }        public static void addHandler(){        arrayList.add(1);        arrayList.add(2);        System.out.println(arrayList);    }        public static void setHandler(){        arrayList.set(1,"admin");        System.out.println(arrayList);    }        public static void subListHandler(){        List list = arrayList.subList(1,3);        System.out.println(list);        System.out.println(arrayList);    }        public static void toArrayHandler(){        Object[] arr = arrayList.toArray();        System.out.println(arr[0]);        System.out.println(arrayList);    }        public static void containersHandler(){        boolean b = arrayList.contains("admin");        System.out.println(b);        System.out.println(arrayList);    }        public static void getHandler(){        String value = (String)arrayList.get(1);        System.out.println(value);        System.out.println(arrayList);    }        public static void indexOfHandler(){        int index = arrayList.indexOf("admin");        System.out.println(index);        System.out.println(arrayList);    }        public static void isEmptyHandler(){        boolean b = arrayList.isEmpty();        System.out.println(b);        System.out.println(arrayList);    }        public static void sizeHandler(){        int count = arrayList.size();        System.out.println(count);        System.out.println(arrayList);    }        public static void removeHandler(){        String value = (String) arrayList.remove(1);        System.out.println(value);        System.out.println(arrayList);    }        public static void clearHandler(){        arrayList.clear();        System.out.println(arrayList);    }    public static void main(String[] args) {        addHandler();        setHandler();        subListHandler();        toArrayHandler();        containersHandler();        getHandler();        indexOfHandler();        isEmptyHandler();        sizeHandler();        removeHandler();        clearHandler();    }}

运行结果:

在这里插入图片描述

3、ArrayList遍历

3.1、普通for循环

代码案例:

    public static void forHandler(){        for (int i = 0; i < arrayList.size(); i++) {            System.out.println(arrayList.get(i));        }    }

3.2、增强for循环

代码案例:

    public static void forEachHandler(){        for (Object o : arrayList) {            System.out.println(o);        }    }

3.3、Iterator迭代器

代码案例:

    public static void iteratorHandler(){        Iterator iterator = arrayList.iterator();        while (iterator.hasNext()){            System.out.println(iterator.next());        }    }

4、ArrayList数据结构

ArrayList数据结构:数组结构

ArrayList查询数据快,可根据下标查询,但是增删速度慢,一旦在某个位置插入数据,后面所有数据都必须往后移动

在这里插入图片描述

java.util.LinkedList集合数据存储的结构是链表结构,方便元素添加、删除的集合。

LinkedList是一个双向链表

1、LinkedList常用方法

方法说明
public void addFirst(E e)将指定元素插入集合的开头
public void addLast(E e)将指定元素插入集合的结尾
public E getFirst()返回集合第一个元素
public E getLast()返回集合最后一个元素
public E removeFirst()移除并返回集合的第一个元素
public E removeLast()移除并返回最后一个元素
public E pop()从集合所表示的堆栈中弹出一个元素
public void push(E e)将元素推入集合所表示的堆栈中
public boolean isEmpty()判断集合是否为空

代码案例:

package cn.com.example11;import java.util.LinkedList;public class LinkedListClass {    public static LinkedList linkedList;    static {        linkedList = new LinkedList<>();        linkedList.add(1);        linkedList.add(2);        linkedList.add(3);        linkedList.add(4);    }        public static void addFirstHandler(){        linkedList.addFirst(0);        System.out.println(linkedList); // [0, 1, 2, 3, 4]    }        public static void addLastHandler(){        linkedList.addLast(5);        System.out.println(linkedList); // [0, 1, 2, 3, 4, 5]    }        public static void getFirstHandler(){        Integer value = linkedList.getFirst();        System.out.println(value); // 0    }        public static void getLastHandler(){        Integer value = linkedList.getLast();        System.out.println(value); // 5    }        public static void removeFirstHandler(){        Integer value = linkedList.removeFirst();        System.out.println(linkedList); // [1, 2, 3, 4, 5]        System.out.println(value); // 0    }        public static void removeLastHandler(){        Integer value = linkedList.removeLast();        System.out.println(linkedList); // [1, 2, 3, 4]        System.out.println(value); // 5    }        public static void popHandler(){        Integer value = linkedList.pop();        System.out.println(linkedList); // [2, 3, 4]        System.out.println(value); // 2    }        public static void pushHandler(){        linkedList.push(6);        System.out.println(linkedList); // [6, 2, 3, 4]    }        public static void isEmptyHandler(){        boolean b = linkedList.isEmpty();        System.out.println(b); // false    }    public static void main(String[] args) {        addFirstHandler();        addLastHandler();        getFirstHandler();        getLastHandler();        removeFirstHandler();        removeLastHandler();        popHandler();        pushHandler();        isEmptyHandler();    }}

2、LinkedList遍历

2.1、增强for循环

代码案例:

    public static void forEachHandler(){        for (Integer integer : linkedList) {            System.out.println(integer);        }    }

2.2、Iterator迭代器

代码案例:

    public static void iteratorHandler(){        Iterator iterator = linkedList.iterator();        while (iterator.hasNext()){            System.out.println(iterator.next());        }    }

3、LinkedList数据结构

LinkedList数据结构:双向链表

在这里插入图片描述

1、ArrayList和LinkedList结构不同

ArrayList和LinkedList都是集合类,但是他们有两种不同的实现方式,ArrayList底层维护的是一个动态数组,LinkedList底层维护的是一个双向链表

ArrayList数据结构

在这里插入图片描述

LinkedList数据结构

在这里插入图片描述

效率不同

2.1、添加效率

ArrayList和LinkedList分别插入1000万条数据测试
ArrayList插入1000万条数据耗时420毫秒
LinkedList插入1000万条数据耗时8900毫秒

ArrayList插入1000万条数据:

public static void addArrayList(){        long start = System.currentTimeMillis();        ArrayList arrayList = new ArrayList<>();        for (int i = 1; i <= 10000000 ; i++) {            arrayList.add(i);        }        long end = System.currentTimeMillis();        System.out.println("耗时:" + (end - start));    }

LinkedList插入1000万条数据:

public static void addLinkedList(){        long start = System.currentTimeMillis();        LinkedList linkedList = new LinkedList<>();        for (int i = 1; i <= 10000000 ; i++) {            linkedList.add(i);        }        long end = System.currentTimeMillis();        System.out.println("耗时:" + (end - start));    }

很明显普通的插入数据,ArrayList比LinkedList要快很多,可为什么普遍说法都是LinkedList添加删除快,这里是有前提条件,LinkedList在两种情况下插入数据比ArrayList快

a、往集合中间插入数据时ArrayList比LinkedList慢

ArrayList往集合中间插入数据要做两个事:把之前的数据挪开赋值到新的数组位置,然后把需要插入的数据插入到数组对应的位置。

LinkedList只要修改对应位置数据prev和next对象的指向就可以了。

b、ArrayList正好扩容的时候添加数据要比LinkedList慢

因为ArrayList维护的是一个数组,所以当容量到达阀值时就会进行扩容,然后会重新分配数据的位置,当数组扩容的时候速度也要比LinkedList慢。

2.2、删除数据

ArrayList要比LinkedList慢,原理和往集合中间插入数据是一样的,ArrayList每次删除数据都要对数组重组。

2.3、查询数据

ArrayList比LinkedList快。
原理是ArrayList是数组有下标标记数据位置,查询时直接返回对应数组下标数据即可。

LinkedList是链表,没有对数据进行位置标记,每次获取固定位置的数据都需要循环遍历链表和linkedList.get(10),就需要循环10次找到对应的节点返回。

Vector类可以实现可增长的对象数组,和ArrayList差不多
VectorJDK1.0出现的,从JDK1.2开始对该类进行改进,可以实现List接口,但是Vector是同步的,单线程,那么速度比较慢,所以被ArrayList替代

在这里插入图片描述

来源地址:https://blog.csdn.net/weixin_43200566/article/details/128118293

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯