Java基础_集合类_List

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

Collection、List接口

1、继承结构

Java基础_集合类_List,Java,java,list,开发语言

2、方法

Java基础_集合类_List,Java,java,list,开发语言
Java基础_集合类_List,Java,java,list,开发语言

Java基础_集合类_List,Java,java,list,开发语言

Collection实现类

1、继承结构

Java基础_集合类_List,Java,java,list,开发语言
类图:
Java基础_集合类_List,Java,java,list,开发语言

2、相关类

(1)AbstractCollection

Collection接口的骨架式实现类,最小化实现Collection接口的代价。

(2)AbstractList

List接口的骨架式实现类,最小化实现List接口的代价。**“随机访问”**数据存储。

提供了iterator()、listIterator()方法的实现。

重要属性
protected transient int modCount;【修改次数,迭代器和列表迭代器使用】
如果该字段的值发生意外变化,迭代器(或列表迭代器)将抛出ConcurrentModificationException,以响应next、remove、previous、set、add操作。这提供了快速故障行为,而不是在迭代期间面对并发修改时的不确定性行为。

AbstractSequentialList(子类)

List接口的框架实现,**“顺序访问”**数据存储。

其它接口

RandomAccess【java.util】

Java基础_集合类_List,Java,java,list,开发语言
List实现使用的标记接口,表明它们支持快速随机访问(通常是常量时间)

该接口的主要目的是允许泛型算法改变其行为,以便在应用于随机或顺序访问列表时提供良好的性能。

操作随机访问列表(如ArrayList)的最佳算法在应用于顺序访问列表(如LinkedList)时可以产生二次行为。鼓励泛型列表算法在应用算法之前检查给定列表是否是该接口的实例。

Cloneable【java.lang】

标记接口
一个类实现了Cloneable接口,表明调用Object.clone()方法对该类的实例进行逐个字段的复制是合法的。在没有实现Cloneable接口的实例上调用Object的clone方法将导致抛出CloneNotSupportedException异常。

按照约定,实现这个接口的类应该重写Object.clone()方法,表明是public,而Object.clone()方法是protected

这个接口不包含clone方法。因此,不可能仅仅因为对象实现了这个接口就克隆它。即使以反射方式调用clone方法,也不能保证它一定会成功。

Serializable【java.io】

标记接口。Serializable接口没有方法或字段,仅用于标识可序列化的语义。

具体实现类

1、Vector

Java基础_集合类_List,Java,java,list,开发语言
Java基础_集合类_List,Java,java,list,开发语言

  • 可增长的对象数组,使用索引访问:capacitycapacityIncremnt

Stack

继承自Vector类,扩展Vector类实现LIFO功能:

  • push、pop
  • peek
  • search
  • empty

LIFO功能:
Java基础_集合类_List,Java,java,list,开发语言

2、ArrayList

Java基础_集合类_List,Java,java,list,开发语言
List接口的可调整数组实现。

不同步

  • Collections.synchronizedList(new ArrayList(…));

实现所有可选列表操作,并允许所有元素,包括null。除了实现List接口之外,这个类还提供了一些方法来操作内部用于存储列表的数组的大小。(大致相当于Vector,但不同步。)

  • Cloneable:Object.clone()

  • Iterable:forEach(Consumer<? super E> action)

  • Collection:removeIf(Predicate<? super E> filter)

  • AbstractList:removeRange(int fromIndex, int toIndex)

  • 增加方法:

    • ensureCapacity(int minCapacity)
    • trimToSize()
      时间复杂度:
  • size、isEmpty、get、set、iterator和listIterator操作在常量时间内运行。

  • add在平摊常数时间内运行,即添加n个元素需要O(n)时间。

  • 所有其他操作都在线性时间内运行(粗略地说)。

与LinkedList实现相比,常数因子较低

每个ArrayList实例都有一个capacity,用于存储列表中元素的数组的大小。它总是至少和列表大小一样大。当元素被添加到ArrayList中时,它的容量会自动增长。
在添加大量元素之前使用ensureCapacity操作来增加ArrayList实例的容量。这可能会减少增量再分配的数量。

分析源码
(1)构造函数

//存储数据:Object数组elementData

//构造函数(空参):赋值空数组
public ArrayList() {
	this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

/*构造函数(含参:容器大小):
	判断initialCapacity > 0:创建对应大小的一个Object数组;
	= 0 :赋值一个空数组
*/
public ArrayList(int initialCapacity) {
	if (initialCapacity > 0) {
		this.elementData = new Object[initialCapacity];
	} else if (initialCapacity == 0) {
		// 空数组
		this.elementData = EMPTY_ELEMENTDATA;
	} else {
	throw new IllegalArgumentException("Illegal Capacity: "+                                         initialCapacity);
	}
}

/*构造函数(使用集合Collection的子类对象)
*/
public ArrayList(Collection<? extends E> c) {
	//将参数转换成数组
	Object[] a = c.toArray();
	//数组长度不为0
	//参数类型判断:ArrayList直接赋值;Arrays.copyOf()方法拷贝
	if ((size = a.length) != 0) {
		if (c.getClass() == ArrayList.class) {
			elementData = a;
		} else {
			elementData = Arrays.copyOf(a, size, Object[].class);
		}
	} else {
		//转换的数组长度为0:赋值空数组 
		elementData = EMPTY_ELEMENTDATA;
	}
}

(2)数组大小扩展

	// 减少不必要的空间消耗
	public void trimToSize() {
		//处理数++
		modCount++;
		//容器中元素个数 VS 存储数据数组长度 
		if (size < elementData.length) {
			//容器空 ? 空数组 : Arrays.copyOf()
			elementData = (size == 0)? EMPTY_ELEMENTDATA: Arrays.copyOf(elementData, size);
		}
	}


	
	public void ensureCapacity(int minCapacity) {
		//minCapacity>底层数组长度【需要扩容】
		//!(底层数组不空 && minCapacity<=10)【底层数组空:第一次】
		if (minCapacity > elementData.length&& !(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA && minCapacity <= DEFAULT_CAPACITY)) {
			//操作数++
			modCount++;
			//增加
			grow(minCapacity);
		}
	}

    private Object[] grow(int minCapacity) {
        int oldCapacity = elementData.length;
        if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            int newCapacity = ArraysSupport.newLength(oldCapacity,
                    minCapacity - oldCapacity, /* minimum growth */
                    oldCapacity >> 1           /* preferred growth */);
            return elementData = Arrays.copyOf(elementData, newCapacity);
        } else {
            return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
        }
    }

    private Object[] grow() {
        return grow(size + 1);
    }

(3)代码

ArrayList<String> al = new ArrayList<>();
al.add("hello");

构造函数:创建一个空数组
Java基础_集合类_List,Java,java,list,开发语言
add()方法:【底层:空数组】=>扩容到长度为DEFAULT_CAPACITY(10)的数组
Java基础_集合类_List,Java,java,list,开发语言
假设当前底层数组中已经添加了10个元素,现在继续调用add()添加一个元素:数组扩容1.5倍
Java基础_集合类_List,Java,java,list,开发语言

3、LinkedList

Java基础_集合类_List,Java,java,list,开发语言

Deque接口(子接口)

Java基础_集合类_List,Java,java,list,开发语言
Java基础_集合类_List,Java,java,list,开发语言
Java基础_集合类_List,Java,java,list,开发语言
Java基础_集合类_List,Java,java,list,开发语言

Queue接口(父接口)

Java基础_集合类_List,Java,java,list,开发语言
Java基础_集合类_List,Java,java,list,开发语言

源码分析

(1)双向链表

    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

	transient int size = 0;

    transient Node<E> first;

    transient Node<E> last;

	//构造函数
	public LinkedList() {}

(2)add方法

	public boolean add(E e) {
        linkLast(e);
        return true;
    }
    
    void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }

Java基础_集合类_List,Java,java,list,开发语言

4、CopyOnWriteArrayList【COW并发容器,写时复制容器<读写分离>】

Java基础_集合类_List,Java,java,list,开发语言
Java基础_集合类_List,Java,java,list,开发语言

底层:Object数组
Java基础_集合类_List,Java,java,list,开发语言文章来源地址https://www.toymoban.com/news/detail-860772.html

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

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

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

相关文章

  • 【Java基础】Java8 使用 stream().filter()过滤List对象(查找符合条件的对象集合)

    本篇主要说明在Java8及以上版本中,使用stream().filter()来过滤List对象,查找符合条件的集合。 集合对象以学生类(Student)为例,有学生的基本信息,包括:姓名,性别,年龄,身高,生日几项。 我的学生类代码如下: 下面来添加一些测试用的数据,代码如下: 添加过滤条件

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

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

    2024年02月15日
    浏览(57)
  • Java List对象集合转Json & Json转List对象集合

    使用了阿里巴巴的 fastjson  首先引入依赖 示例如下 输出结果:

    2024年02月15日
    浏览(57)
  • Java集合之List

    ①.add(Object element) 向列表的尾部添加指定的元素。 ②.size() 返回列表中的元素个数。 ③.get(int index) 返回列表中指定位置的元素,index从0开始。  ④.add(int index, Object element) 在列表的指定位置(从0开始)插入指定元素 ⑤.set(int i, Object element) 使用元素element替换索引i位置的元素

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

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

    2024年02月07日
    浏览(61)
  • Java集合-List

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

    2024年02月13日
    浏览(40)
  • Java List集合

    List系列集合:添加的元素是有序,可重复,有索引 ArrayList : 添加的元素是有序,可重复,有索引 LinkedList : 添加的元素是有序,可重复,有索引 Vector :是线程安全的,速度慢,开发中很少使用 6.1 List集合概述和特点 List集合概述 1、有序集合(也称为序列),用户可以精确控制

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

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

    2023年04月17日
    浏览(50)
  • Java 集合List相关面试题

    📕作者简介: 过去日记 ,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。 📗本文收录于java面试题系列,大家有兴趣的可以看一看 📘相关专栏Rust初阶教程、go语言基础系列、spring教程等,大家有兴趣的可以看一看 📙Java并发编程系列,设计模式系列、

    2024年01月25日
    浏览(47)
  • java系列之list集合分组

    在Java编程中,List集合是一种常用的数据结构,用于存储一组元素。有时候,我们需要对List集合中的元素进行分组操作,即将相同属性或特征的元素归类到一组。这种分组操作在数据处理和分析中非常常见,能够帮助我们更好地组织和处理数据。 Java提供了多种实现List接口的

    2024年02月09日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包