我们通过源码来聊一下Java中的多种List

本文深入探讨了Java中的List接口及其常见实现:ArrayList、LinkedList、Vector和Stack。分析了它们的底层数据结构、操作性能、线程安全以及在并发修改时的Fail-Fast机制。特别讨论了ArrayList的扩容机制、遍历方式及其与其他数据结构的比较。还提到了线程安全的解决方案,如Vector和线程安全的List实现。
摘要由CSDN通过智能技术生成

【干货预警,强烈建议关注收藏阅读】


【本篇是集合中的List篇,以下涉及源码基于JDK1.8】

在这里插入图片描述

     本篇是Java基础中最重要的知识点集合List篇。Java集合是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*,Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)。

     Colletcion和Map结构如下图所示:
在这里插入图片描述
     大致介绍一下:Collection和Map是两个高度抽象的接口;

  • Collection抽象的是集合,包含了集合的基本操作和属性,Collection主要包含List和Set两大分支。
  • List是有序的链表,允许存储重复的元素,List的主要实现类有LinkedList, ArrayList, Vector, Stack。
  • Set是不允许存在重复元素的集合,Set的主要实现类有HastSet和TreeSet(依赖哈希实现,后面介绍)。
  • Map是一个映射接口,即存储Key-Value键值对的集合(和redis存储类似),AbstractMap是个抽象类,它实现了Map接口中的大部分API,而常见的HashMap,TreeMap都是继承于AbstractMap。HashTable继承于Dictionary,但也实现了Map接口。

     集合是Java中用来存储多个对象的一个容器,我们知道容器数组,数组长度不可变,且只能存储同样类型的元素,数组可以存储基本类型或者引用类型;而集合长度可变,可以存储不同类型元素(但是我们一般不这么干),集合只能存储引用类型(存储的基本类型会变成包装类);

集合的Fail-Fast机制?

     fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生 fail-fast 事件。

例如:当某一个线程A通过 iterator 去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException 异常,产生 fail-fast 事件;当然,不仅是多个线程,单个线程也会出现 fail-fast 机制,比如单线程下的iterator迭代器遍历时调用集合的增删改等操作会抛出java.util.ConcurrentModificationException,从而产生fail-fast机制。

List接口

     List定义如下:

public interface List<E> extends Collection<E> {
    }

     List是一个继承于Collection的接口,即List是集合中的一种。List集合的特点就是:可存储重复元素,有序(存储顺序和取出顺序一致),如下图所示;
在这里插入图片描述
     List集合常用子类:

  • ArrayList:底层数据结构是数组,线程不安全
  • LinkedList:底层数据结构是链表,线程不安全
  • Vector:底层数据结构是数组,线程安全
  • Stack:底层数据结构是数组,继承于Vactor

ArrayList

     ArrayList定义:

   public class ArrayList<E> extends AbstractList<E>
          implements List<E>, RandomAccess, Cloneable, java.io.Serializable  {
    }

     ArrayList简介:

  • ArrayList是实现List接口的可变数组,并允许null在内的重复元素;
  • 底层数组实现,扩容时将老数组元素拷贝到新数组中,每次扩容是其容量的1.5倍,操作代价高;
  • 采用了Fail-Fast机制,面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险;
  • ArrayList是线程不安全的,所以在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。

     ArrayList核心函数:
在这里插入图片描述

  1. 构造函数
    在这里插入图片描述
    在这里插入图片描述
  2. add方法(重点)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值