Java集合-List

这篇具有很好参考价值的文章主要介绍了Java集合-List。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、List集合概述

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

List特性:

  • 有序
    • 存取有顺序
  • 有下标
    • 是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引一个道理)
  • 可以重复
    • 添加的元素可以重复

List实现类架构图

java list,JavaSe,java,list,数据结构,算法,开发语言

二、ArrayList

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();


    }
}

运行结果:

java list,JavaSe,java,list,数据结构,算法,开发语言

3、ArrayList遍历

3.1、普通for循环

代码案例:

/**
     * 普通for循环
     */
    public static void forHandler(){

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

    }

3.2、增强for循环

代码案例:

/**
     * 增强for循环
     */
    public static void forEachHandler(){

        for (Object o : arrayList) {
            System.out.println(o);
        }

    }

3.3、Iterator迭代器

代码案例:

/**
     * Iterator迭代器
     */
    public static void iteratorHandler(){

        Iterator iterator = arrayList.iterator();

        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }

4、ArrayList数据结构

ArrayList数据结构:数组结构

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

java list,JavaSe,java,list,数据结构,算法,开发语言

三、LinkedList

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<Integer> 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循环

代码案例:

/**
     * 增强for循环
     */
    public static void forEachHandler(){

        for (Integer integer : linkedList) {
            System.out.println(integer);
        }

    }

2.2、Iterator迭代器

代码案例:

/**
     * Iterator遍历
     */
    public static void iteratorHandler(){

        Iterator<Integer> iterator = linkedList.iterator();

        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

3、LinkedList数据结构

LinkedList数据结构:双向链表

java list,JavaSe,java,list,数据结构,算法,开发语言

四、ArrayList和LinkedList区别

1、ArrayList和LinkedList结构不同

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

ArrayList数据结构

java list,JavaSe,java,list,数据结构,算法,开发语言

LinkedList数据结构

java list,JavaSe,java,list,数据结构,算法,开发语言

2、效率不同

2.1、添加效率

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

ArrayList插入1000万条数据:

public static void addArrayList(){

        long start = System.currentTimeMillis();

        ArrayList<Integer> 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<Integer> 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

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

java list,JavaSe,java,list,数据结构,算法,开发语言文章来源地址https://www.toymoban.com/news/detail-549906.html

到了这里,关于Java集合-List的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 探索Java集合框架—数据结构、ArrayList集合

    Java集合的使用相信大家都已经非常得心应手,但是我们怎么做到知其然,更知其所以然这种出神入化的境界呢?我们揭开集合框架底层神秘面纱来一探究竟 目录 一、背景介绍 二、思路方案 数据结构是什么? 数据结构可以分为线性和非线性两种数据结构 线性数据结构: 非

    2024年02月10日
    浏览(40)
  • 【JavaSE专栏89】Java字符串和XML数据结构的转换,高效灵活转变数据

    作者主页 :Designer 小郑 作者简介 :3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向 :Vue、SpringBoot、微信小程序 本文讲解了 XML 的概念,以及 Java 中 XML 和字符串的转换方法,并给出了样例代码。

    2024年02月09日
    浏览(57)
  • java八股文面试[数据结构]——集合框架

    Java集合类主要由两个根接口Collection和Map派生出来的。 Collection派生出了三个子接口: Map接口派生: Map代表的是存储key-value对的集合,可根据元素的key来访问value。  因此Java集合大致也可分成 List、Set、Queue、Map四种接口体系 。 List代表了有序可重复集合,可直接根据元素的索

    2024年02月11日
    浏览(41)
  • 【数据结构一】初始Java集合框架(前置知识)

           Java语言在设计之初有一个非常重要的理念便是:write once,run anywhere!所以Java中的数据结构是已经被设计者封装好的了,我们只需要实例化出想使用的对象,便可以操作相应的数据结构了,本篇文章中我会向大家简单 介绍一下什么是数据结构 ,以及 对Java中常用的数

    2024年02月04日
    浏览(47)
  • JAVA数据结构篇--13线程安全的Set 集合

    前言:java 中用于存放不重复元素的set 集合,其中无序的HashSet,以及有序的LinkedHashSet和TreeSet 都是非线程安全的,那么多线程环境下,我们要存放不重复的元素,需要使用哪种集合进行数据存取; 1 使用: 2 过程: 2.1 放入获取元素: Collections.synchronizedSet:通过使用synchron

    2024年02月16日
    浏览(41)
  • 数据结构(Java实现)-集合与时间和空间复杂度

    什么是集合框架 Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的 集合。 容器

    2024年02月12日
    浏览(43)
  • JAVA基础学习笔记-day14-数据结构与集合源码2

    博文主要是自己学习JAVA基础中的笔记,供自己以后复习使用,参考的主要教程是B站的 尚硅谷宋红康2023大数据教程 君以此始,亦必以终。—左丘明《左传·宣公十二年》 7.1 List接口特点 List集合所有的元素是以一种 线性方式 进行存储的,例如,存元素的顺序是11、22、33。那

    2024年01月18日
    浏览(60)
  • 【数据结构】搜索树 与 Java集合框架中的Set,Map

    作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。 其他专栏:《

    2024年02月08日
    浏览(37)
  • 【Java集合类面试二十六】、介绍一下ArrayList的数据结构?

    文章底部有个人公众号: 热爱技术的小郑 。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:介绍一下ArrayList的数据结构? 参考答案: ArrayList的底

    2024年02月08日
    浏览(44)
  • java -- 简单的数据结构、List接口和Collections类

    数据结构 : 数据用什么样的方式组合在一起。 数据存储的常用结构有:栈、队列、数组、链表 栈: stack ,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。 采用该结构的集合,对元素

    2023年04月10日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包