数据结构之重写ArrayList的底层源码

JAVA——底层源码阅读——集合ArrayList的实现底层源码分析 JAVA——底层源码阅读——集合ArrayList的实现底层源码分析一、提出问题二、查看ArrayList源码步骤1、新建java文件,把代码敲上去如下步骤2、查看源码。1、增add()2、删remove()3、改set()4、查get()步骤3、阅读和分析源码。三、尝试自定义ArrayList 当前 jdk版本:jdk1.8.0_74 一、提出问题 集合ArrayList的底层原理是什么,它的增删改查是怎么实现的,为什么它的长度是可变的? 二、查看ArrayList源码 步骤1、新建java文件,把代 阅读详情

数据结构之重写ArrayList的底层源码

  • 重写的几个主要方法
  • 构造方法
  • 添加(add)方法
  • 清除(clear)方法
  • 添加(get)以及修改(set)方法
  • 删除方法(remove)
  • 查找元素的迭代器的内部类实现(Iterator)
  • 如何合理运用这些代码,它们的时间复杂度又是多少呢?

ArrayList的实现

ArrAyList是一个java里面的一种集合,它与数组最大的区别就是能够自动增大容量并且可以进行相关的删除和添加操作。

代码块


/*
 * 完全纯定义一个List
 */
public class MyArrayList<AnyType> implements Iterable<AnyType>{
    //初始化集合的大小
    private static final int DEFAULT_CAPACITY = 10;

    private int theSize;
    private AnyType[] theItem;

    public MyArrayList(){
        doClear();
    }

    public void clear(){ 
        doClear(); 
    }

    private void doClear(){
        //初始化为0
        theSize = 0;
        ensureCapacity(DEFAULT_CAPACITY);
    }

    /*
     * 返回集合的大小
     */
    private int size(){
        return theSize;
    }

    /*
     * @true    为0
     * @false   不为0
     */
    public boolean isEmpty(){
        return size() == 0;
    }

    public void trimToSize(){
        ensureCapacity(size());
    }

    private AnyType get(int idx){
        if(idx < 0 || idx >= size())
            throw new ArrayIndexOutOfBoundsException();
        return theItem[idx];
    }

    public AnyType set(int idx, AnyType newVal){
        if(idx < 0 || idx >= size())
            throw new ArrayIndexOutOfBoundsException();
        AnyType old = theItem[idx];
        theItem[idx] = newVal;
        return old;
    }

    /*
     * 将新建一个数组,把旧的数组替换成新的数组
     */
    private void ensureCapacity(int newCapacity) {
        if(newCapacity < theSize)
            return;

        AnyType[] old = theItem;
        theItem = (AnyType[]) new Object[newCapacity];
        for(int i=0; i<size(); i++)
            theItem[i] = old[i];
    }

    public boolean add(AnyType x){
        add(size(), x);
        return true;
    }

    public void add(int idx, AnyType x){
        if(theItem.length == size())
            ensureCapacity(size() * 2 -1);
        for(int i=theSize; i>idx; i--)
            theItem[i] = theItem[i-1];
        theItem[idx] = x;

        theSize++;
    }

    public AnyType remove(int idx){
        AnyType removedItem = theItem[idx];
        for(int i = idx; i<size()-1; i++)
            theItem[i] = theItem[i+1];  //删除的那个元素等于后面的元素

        theSize--;
        return removedItem;
    }

    @Override
    public java.util.Iterator<AnyType> iterator() {
        return new ArrayListIterator();
    }

    private class ArrayListIterator implements java.util.Iterator<AnyType>{
        private int current = 0;

        @Override
        public boolean hasNext() {
            return current < size();
        }

        @Override
        public AnyType next() {
            if(!hasNext())
                throw new java.util.NoSuchElementException();
            return theItem[current++];
        }

        public void remove(){
            MyArrayList.this.remove(--current);
        }
    }
}
ERPS协议原理 目录 1、ERPS概述: 2、ERPS名词概念解释: 3、ERPS协议报文: 4、ERPS单环基本原理: 5、单环多实例原理: 6、多环原理: 1、ERPS概述: ERPS(Ethernet Ring Protection Switching),即以太网多环保护技术,是ITU-T定义的一种二层破环协议标准,标准号为ITU-T G.8032/Y1344,因此又称为G.8032。它定义了RAPS(Ring Auto Protection Switching)协议报文和保护倒换机制。 ERPS目前支持v1和v2两 阅读详情

相关推荐

Zabbix安装与部署 系统环境:centos7.0

Zabbix安装与部署 系统环境:centos7.0

weixin_42485027的博客 2600

了解并重写ArrayList,了解底层原理

集合就是一种容器。可以保存多个相同数据类型的元素。集合的长度可以改变,所以比数组更加灵活ArrayList<E> 集合的泛型泛型: 指的是一种广泛的数据类型,在定义类的时候,可以不给出明确的数据类型,在创建集合对象的时候,用来指定想要的数据类型!例如: ArrayList<Student> ArrayList<String>

2301_77165049的博客 1035

LAMMPS实操系列(一): 大量FCC-CoCrCuFeNi高熵合金建模与最稳定结构筛选

高熵合金(High-entropy alloys,HEA),是由五种或五种以上等量或大约等量金属形成的合金。由于高熵合金可能具有许多优秀的物理化学性质,因此在材料科学领域受到广泛关注

Ceshigo_CD的博客 3257

Java集合之ArrayList类的部分重写

前言:前几天在图形界面的时候 想用一个数据灵活的存储数据,基本数据类型不能满足,于是就想起了集合工具,为了熟悉集合类,试着自己写了一部分ArrayList的实用方法 一.MyArrayList类: 介绍:1.无参和两个参的构造方法 2.初始化Size的方法(没把类写死):setSize(int size); 2.获得表长的方法size();返...

qq_41818008的博客 1378

Pixhawk+OpenMV实战:如何用Apriltag实现无人机自动降落(附避坑指南)

本文详细介绍了如何利用Pixhawk飞控和OpenMV摄像头,通过Apriltag视觉标签实现无人机的精准降落系统。从硬件搭建、参数配置到视觉处理代码优化,提供了完整的实战指南和避坑建议,帮助开发者快速实现厘米级精度的自动降落功能。

weixin_27076351的博客 481

ANSYS Fluent中的声学模型:实用指南

文章摘要 本文介绍了ANSYS Fluent中三种气动声学模拟方法:Ffowcs-Williams & Hawkings(FWH)模型、宽带噪声源模型和波动方程模型。FWH模型适用于外部气动声学问题,需要瞬态流场数据来预测远场噪声;宽带模型基于稳态RANS模拟,可快速识别噪声源位置,适合早期设计阶段;波动方程模型直接求解声波方程,提供全域声压分布,但仅适用于低马赫数流动。文章详细说明了各模型的使用场景、设置步骤和关键参数配置,为工程应用提供了实用指南。

weixin_45793544的博客 1318

Arraylist 与 LinkedList 区别

是否保证线程安全 ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全 底层数据结构 Arraylist 底层使用的是 Object 数组; LinkedList 底层使用的是双向链表数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环。注意双向链表和双向循环链表的区别) 插入和删除是否受元素位置的影响 ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行 add(E e) 方法的时候, ArrayList 会默认在将指定的

Kirito的博客 724

提取abaqus中节点集合的应力应变

节点是没有应力应变的,只有积分点才有,所以直接在odb文件里面用FieldOutput是整不出来的(结果是个空列表),只能用session这种让abaqus自己帮你处理。具体的代码需要根据自己操作的时候abaqus.rpy这个文件中代码的变化来更改。

蓝胖子的博客 4553

数据结构-顺序表的代码(重写)

顺序表的实现

chihiro1122的博客 280

Open3D点云算法与点云深度学习案例汇总(长期更新)

Open3D-python算法专栏文章汇总,长期更新算法原理与实战案例。

纵马踏花向自由 7466

YOLOv11改进策略【模型轻量化】| 替换华为的极简主义骨干网络:VanillaNet

本文记录的是基于VanillaNet的YOLOv11轻量化改进方法研究。VanillaNet的极简主义在于无 shortcut 连接,并且在网络的每个阶段仅使用一层卷积,无额外复杂模块,仅通过自身简洁的架构设计和训练策略,实现有效地训练和优化。本文在替换骨干网络中配置了原论文中的、和11种模型,以满足不同的需求。

Limiiiing的博客 1722

ArrayList底层详解

ArrayList底层详解一、ArrayList集合底层数据结构二、ArrayList继承关系1、Serializable标记性接口2、Cloneable 标记性接口浅拷贝深拷贝3、RandomAccess标记接口4、AbstractList抽象类三、ArrayList源码 一、ArrayList集合底层数据结构 ArrayList集合介绍 List 接口的可调整大小的数组实现。 数组:一旦初始化长度就不可以发生改变 数组结构介绍 增删慢:每次删除元素,都需要更改数组长度、拷贝以及移动元素位置。 查询快:

zsxfa的博客 5239

关于红队方面的学习资料

关于红队方面的学习资料

Sumarua的博客 1084

ArrayList底层源码分析

ArrayList底层源码分析 1. ArrayList集合底层数据结构 ArrayList集合介绍 List 接口的可调整大小的数组实现。 数组:一旦初始化长度就不可以发生改变 数组结构介绍 增删慢:每次删除元素,都需要更改数组长度、拷贝以及移动元素位置。 查询快:由于数组在内存中是一块连续空间,因此可以根据地址+索引的方式快速获取对应位置上的元素。 2. ArrayList继承关系 2.1 Serializable标记性接口 介绍: 类的序列化由实现java.io.Seria

qq2835483738的博客 244

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java集合类一:ArrayList(底层源码分析)

针对Java集合类ArrayList的底层源码分析、详解

Esther2020的博客 1904

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ArrayList(JDK1.8)源码解析

既然是看源码,那我们要怎么看一个类的源码呢?这里我推荐的方法是: 1)看继承结构 ​ 看这个类的层次结构,处于一个什么位置,可以在自己心里有个大概的了解。 2)看构造方法 ​ 在构造方法中,看做了哪些事情,跟踪方法中里面的方法。 3)看常用的方法 ​ 跟构造方法一样,这个方法实现功能是如何实现的 注:既然是源码,为什么要这样设计类,有这样的继承关系。这就要说到设计模式的问题了。所以我们要了解常用的...

ThinkWon的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ArrayList底层实现源码讲解与vector区别

一、ArrayList数据结构 ArrayList的底层数据结构是一个类型为Object的数组。 数组的初始长度与创建ArrayList对象时使用的构造方法有关 注:数组“elementData”是用来存储数据、操作数据的数组 “DEFAULTCAPACITY_EMPTY_ELEMENTDATA”是默认的空数组 传入的初始长度 使用无参构造函数,创建长度为0的数组,在加入第一个数据时会将数组扩容到默认值10 使用传相同数据类型的数组的构造函数,长度为传参数组的长度 经测试,如果要存100万数据,需

y75xwr的博客 613

重写ArrayList

qq378332287的专栏 1273

数据结构之ArrayList

ArrayListArrayList详解ArrayList概念ArrayList类Serializable 标记性接口Cloneable 标记性接口RandomAccess 标记性接口AbstractList 抽象类ArrayList源码解析构造函数add(E e)add(int index, E element)addAll(Collection<? extends E> c)addAll(int index, Collection<? extends E> c)E set(int

gitzzp的博客 2344

ArrayList源码解析

一、光说底层是采用数组的形式,怎么实现的? 1)成员属性elementData定义 arrayList底层是采用数组的形式,看源码我们可以看到: ArrayList 的元素存储在其中的数组缓冲区。 ArrayList 的容量就是这个数组缓冲区的长度。 添加第一个元素时,任何带有 elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的空 ArrayList 都将扩展为 DEFAULT_CAPACITY。 transient Object[] elementDa

不管风吹浪打,胜似闲庭信步 1177

ArrayList 底层

扩容的本质是创建新数组 + 复制原数组元素,通过 Arrays.copyOf(elementData, newCapacity) 方法实现,该方法会创建一个长度为新容量的新数组,并将原数组的元素全部复制到新数组中,最后将 elementData 引用指向新数组。在 Java 集合框架中,ArrayList 是 List 接口的动态数组实现类,位于 java.util 包下,兼具数组随机访问高效的特性与动态扩容的灵活性,是日常开发中最常用的集合之一。若触发扩容,需复制数组,时间复杂度 O(n)。

Wang15302191715的博客 424

ArrayList源码理解

ArrayList源码理解导读与LinkedList源码理解放在一起查阅,效果更好

尹凯文的博客 2312

手撕ArrayList底层,透彻分析源码

ArrayList概述Hello大家好,今天就来介绍一下ArrayList,说到ArrayList,很多人都知道它的底层是使用数组实现的,线程不安全的,说到它的特点,都会说查找快,增删慢...

架构师小秘圈 227

ArrayList源码解析-JDK18

ArrayList在JDK1.7和1.8中的差距并不大,主要差距以下几个方面

weixin_52093727的博客 1100

Java集合之ArrayList源码详解

ArrayList源码解析以及相关面试题总结。

个人博客,欢迎收藏。 1066

【Java数据结构-集合】ArrayList源码解析

ArrayList源码解析ArrayList概念标记接口RandomAccessCloneable(Object.clone)浅拷贝深拷贝java.io.Serializable源码解析构造函数:扩容添加元素删除元素迭代器:fast-fail快速失败机制Array.asList什么是fail-fast?Vector ArrayList 概念 数组就是由一块连续的内存组成的数据结构 添加如下: 缺点: 大小固定,不能动态拓展。 插入和删除的效率比较慢,假如我们在数组的非尾部插入或删除一个数据,那么就要移动

weixin_37838913的博客 260
上一篇: jsp中的request内置对象
下一篇: 用栈来实现计算器功能运算
LuFei_java
博客等级 码龄10年 1粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值