实现List接口的常用三类

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

实现List接口的常用三类分别是ArrayList, vector, LinkedList,我们来看一下List接口的体系图:

实现List接口的常用三类,list,windows,java

这里我们可以查看类提供的相关方法,这里我们用代码实例来给大家演示一下常用的方法:

1.ArrayList

该方法在之前的博客中也写过相关实例但是这次我们要分析相关源码。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Array {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        List list = new ArrayList();
        for (int i = 0; i < 12; i++) {
            list.add("hello" + i);
        }
        System.out.println("list=" + list);
        //在 2 号位插入一个元素"西游记"
        System.out.println("====================");
        list.add(1, "西游记");
        System.out.println("list=" + list);
        //获得第 5 个元素
        System.out.println("====================");
        System.out.println("第五个元素=" + list.get(4));
        //删除第 6 个元素
        list.remove(5);
        System.out.println("====================");
        System.out.println("list=" + list);
        //修改第 7 个元素
        list.set(6, "三国演义");
        System.out.println("====================");
        System.out.println("list=" + list);
        //在使用迭代器遍历集合
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object obj = iterator.next();
            System.out.println("obj=" + obj);
        }
    }
}

实现List接口的常用三类,list,windows,java

Vector,LinkedList方法和ArrayList的方法基本相似,这里也就不一一列举了。

接下来我们就要来解释一下集合是如何存储数据的,以及它的扩容机制,首先我们发现集合是不用进行长度的定义的,但是我们却可以存储很多数据,这里我们就来解释一些该原因:

import java.util.ArrayList;
import java.util.List;

public class Array {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("红楼梦");
    }
}

这里我们选用的是ArrayList的无参构造器,ArrayList也有有参构造器但是机理是差不多的,待会分析,我们先来看一下无参构造器的扩容机理。 

实现List接口的常用三类,list,windows,java

实现List接口的常用三类,list,windows,java

当我们调用无参构造器时我们就会调用this.elementData这个方法

实现List接口的常用三类,list,windows,java

给this对象赋值的语句在源码中是一个空列表,而且是private static final修饰的,所以在初始化列表的时候一开始为空,接下来分析add方法的添加机制。

实现List接口的常用三类,list,windows,java

add方法调用的是该方法,我们看到有一个E e这个参数,这里的E类型是后面要提出的泛型知识,这里不进行深入讨论。

实现List接口的常用三类,list,windows,java

当我们进入到ensureCapacityInternal()这个方法中它会进行一系列的判断

if (minCapacity - elementData.length > 0)

最终调用到grow方法来进行扩容。接下来就来分析它的扩容过程:

实现List接口的常用三类,list,windows,java

这里我们会发现进入copyof方法的是newCapacity这个值,copyof才是真正对列表扩容的方法。

实现List接口的常用三类,list,windows,java

实现List接口的常用三类,list,windows,java

当我们进行add方法的时候,如果容量不够就会进入我们的扩容机制

if (minCapacity - elementData.length > 0)

这里就是进行是否扩容的判断条件,而且ArrayList扩容后的容量也和源码中的newCapacity的值一致,但是这里我们是否能添加相同的元素呢,这里我们也来看一下:

实现List接口的常用三类,list,windows,java

这里我们发现是可以添加相同的元素的,如果想限制相同方法的元素可以参考后续讲解的Set接口下的实现类。

这里我们知道一开始扩容到了10,如果添加的数据超过10个,后续是如何扩容的,其实调用的方法是差不多的只是newCapacity该值的更新不一样而已这里我们也查看一下:

实现List接口的常用三类,list,windows,java

这里我们的size变成了11,接下来我们看一下是如何扩容的:

实现List接口的常用三类,list,windows,java

我们发现newCapacity的值是oldCapacity用位运算符向右移动一个单位就相当于10/2然后它还又加上了原来的数值就相当于10/2 + 10,相当于原数值的1.5倍。我们发现初始化的扩容和后期的扩容机制是不相同的,我们来看一下后期的扩容是不是我们预期的一样是15:

实现List接口的常用三类,list,windows,java

跟我们的预期是一样的。Vector的扩容机制跟ArrayList很像,但是Vector的后期扩容是两倍扩容,Vector和ArraryList基本上是相同的,它们最主要的区别就是;

ArraryList:它是高效率,但是线程不安全的;

Vector:它是线程安全,但是效率比较低:

2.接下来我们来介绍LinkedList的相关细节:

该列表的存储对象跟前两个不同,它的底层实现了双向链表和双端队列的特点;

LinkedList底层维护了两个属性一个是frist和last,一个是头节点,一个是尾节点;

每个节点里面又维护了Node对象,对象里存在(prev,next,item)三个属性,对象与对象之间的连接是通过prev指向前一个对象,next指向下一个对象,最终实现双向链表。

LinkedList对元素的添加和删除不是通过数组来添加的,所以相对而言效率要更高一点;

这里我们来写一段实例来看一下如何操作该链表:

public class Array {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        Node jack = new Node("jack");
        Node tom = new Node("tom");
        Node mack = new Node("mack");
        //连接三个结点,形成双向链表
        //jack -> tom -> mack
        jack.next = tom;
        tom.next = mack;
        //mack -> tom -> jack
        mack.pre = tom;
        tom.pre = jack;
        Node first = jack;//让 first 引用指向 jack,就是双向链表的头结点
        Node last = mack; //让 last 引用指向 mack,就是双向链表的尾结点
        //演示,从头到尾进行遍历
        System.out.println("===从头到尾进行遍历===");
        while (true) {
            if(first == null) {
                break;
            }
        //输出 first 信息
            System.out.println(first);
            first = first.next;
        }
        //演示,从尾到头的遍历
        System.out.println("====从尾到头的遍历====");
        while (true) {
            if(last == null) {
                break;
            }
        //输出 last 信息
            System.out.println(last);
            last = last.pre;
        }
        //演示链表的添加对象/数据,是多么的方便
        //要求,是在 tom --------- mack直接,插入一个对象 smith
        //1. 先创建一个 Node 结点,name 就是 smith
        Node smith = new Node("smith");
        //下面就把 smith 加入到双向链表了
        smith.next = mack;
        smith.pre = tom;
        mack.pre = smith;
        tom.next = smith;
        //让 first 再次指向 jack
        first = jack;//让 first 引用指向 jack,就是双向链表的头结点
        System.out.println("===从头到尾进行遍历===");
        while (true) {
            if(first == null) {
                break;
            }
        //输出 first 信息
            System.out.println(first);
            first = first.next;
        }
        last = mack; //让 last 重新指向最后一个结点
        //演示,从尾到头的遍历
        System.out.println("====从尾到头的遍历====");
        while (true) {
            if(last == null) {
                break;
            }
        //输出 last 信息
            System.out.println(last);
            last = last.pre;
        }
    }
}
//定义一个 Node 类,Node 对象 表示双向链表的一个结点
class Node {
    public Object item; //真正存放数据
    public Node next; //指向后一个结点
    public Node pre; //指向前一个结点
    public Node(Object name) {
        this.item = name;
    }
    public String toString() {
        return "Node name=" + item;
    }
}

实现List接口的常用三类,list,windows,java

当我们使用迭代器对LinkedList链表进行遍历的时候要注意一下,当我们二次遍历的时候要将frist头节点重新定位到第一个元素。

ArrayList和LinkedList之间的区别:

ArrayList底层是可变数组,而LinkedList底层是双向链表,二者的性质不同,LinkedList对增删操作的效率比较高,ArrayList对查改的效率比较高,两者都是线程不安全的,但是在以后的编程中对数据的查改操作更多,所以ArrayList是比较实用的,根据不同情况来选择不同的方式。文章来源地址https://www.toymoban.com/news/detail-758535.html

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

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

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

相关文章

  • Java中创建List接口、ArrayList类和LinkedList类的常用方法(一)

    要了解List接口,就不得不说起Java的集合框架。 (该图来自菜鸟教程) Java 集合框架主要包括两种类型的容器,集合Collection和图Map。 Collection接口代表了 单列集合 ,它包含了一组Object元素,每个元素都有一个值。 (这里有个“泛型擦除”的概念,在此不提及有兴趣可自行了

    2024年01月19日
    浏览(38)
  • List 接口及其常用方法

    List 接口是 Collection 接口的子接口,其主要特点如下: List 中元素有序,是按照元素的插入顺序进行排序的。每个元素都有一个与之关联的整数型索引(索引从 0 开始),可以根据索引来访问和操作元素,可以使用普通 for 循环遍历。 List 中可以包含重复的元素。 下面的代码

    2024年02月08日
    浏览(34)
  • 【Java基础教程】(四十八)集合体系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍历方式~【文末送书】

    掌握 Java 设置类集的主要目的以及核心接口的使用; 掌握 Collection 接口的作用及主要操作方法; 掌握 Collection 子接口 List、Set 的区别及常用子类的使用; 掌握 Map 接口的定义及使用; 掌握集合的4种输出操作语法结构; 掌握 Properties类的使用 ; 了解类集工具类 Collections 的作

    2024年02月15日
    浏览(45)
  • <C++> list容器本质|常用接口|自定义排序规则

    ✅作者简介:热爱后端语言的大学生,CSDN内容合伙人 ✨精品专栏:C++面向对象 🔥系列专栏:C++泛型编程 🔥前言 今天把 list 容器的基本操作、常用接口做一个系统的整理,结合具体案例熟悉自定义内部排序方法的使用。 list 与 vector 是STL中最常用的两个容器,如果对vector

    2024年02月01日
    浏览(36)
  • Java 集合 - List 接口

    在 Java 中, java.util.List 接口是 Java 集合框架中的一个接口,它继承自 Collection 接口,是单列集合的一个重要分支。List 接口的常见实现类包括 ArrayList 、 LinkedList 和 Vector 。 List 接口特点如下: 有序性 : List 中的元素是按照插入顺序排序的,因此可以很容易地遍历 List 中的元

    2024年02月07日
    浏览(46)
  • Java集合框架List接口

    目录 List接口概念 List接口常用的方法 示例 Java集合框架中的List接口是一种有序的集合,它可以存储重复的元素。它是Collection接口的子接口,提供了一系列可以对列表进行操作的方法,如添加、插入、删除、获取元素等。List接口还可以通过索引访问元素,类似于数组。 List接

    2023年04月17日
    浏览(36)
  • 【C#学习笔记】数据类中常用委托及接口——以List<T>为例

    ListT为什么是神?在谈论这个问题之前,我想先说说其他数据表结构相较于ListT究竟差在了哪里…… 首先是 HashTable 本身呢就被 DictionaryTKey,TValue 完爆, HashTable 既不是线程安全的,也不是类型安全的,虽然提供了Synchronized()方法可以获取线程安全的类型,以为自己是个哈希表就

    2024年02月11日
    浏览(29)
  • java基础-List常用方法

    Collections.reverse(List) Collections.sort(List) 首先让自定义类实现Comparable自定义类名称,举例: 在需要排序处: 单一删除的话,可以用List自带的remove,然后break。不然如果是删index0,有可能死循环没结果。 推荐使用Iterator删除,因为不需要跳出循环 如果连续几次添加同一个对象,

    2024年02月22日
    浏览(30)
  • 【Java基础】Java中List集合的常用方法

    在Java编程中,List集合是最常用的一种数据结构之一。它具有动态扩容、元素添加、删除和查询等基础操作,可以存储各种类型的对象,并且支持泛型。在本文中,我将介绍Java List集合的常用方法,并通过实例演示这些方法的使用。 一、List集合的创建与初始化 在使用List集合

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

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

    2023年04月10日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包