Java基础之Collection的ArrayList

news2024/11/27 14:30:45

Java基础之Collection的ArrayList

  • 一、add()与addAll()
  • 二、remove()
  • 三、trimToSize()
    • 1、案例


一、add()与addAll()

跟C++ 的vector不同,ArrayList没有push_back()方法,对应的方法是add(E e),ArrayList也没有insert()方法,对应的方法是add(int index, E e)。这两个方法都是向容器中添加新元素,这可能会导致capacity不足,因此在添加元素之前,都需要进行剩余空间检查,如果需要则自动扩容。扩容操作最终是通过grow()方法完成的。

add(int index, E e)需要先对元素进行移动,然后完成插入操作,也就意味着该方法有着线性的时间复杂度。

addAll()方法能够一次添加多个元素,根据位置不同也有两个版本,一个是在末尾添加的addAll(Collection<? extends E> c)方法,一个是从指定位置开始插入的addAll(int index, Collection<? extends E> c)方法。跟add()方法类似,在插入之前也需要进行空间检查,如果需要则自动扩容;如果从指定位置插入,也会存在移动元素的情况。 addAll()的时间复杂度不仅跟插入元素的多少有关,也跟插入的位置相关。
在这里插入图片描述

二、remove()

remove()方法也有两个版本,一个是remove(int index)删除指定位置的元素,另一个是remove(Object o)删除第一个满足o.equals(elementData[index])的元素。删除操作是add()操作的逆过程,需要将删除点之后的元素向前移动一个位置。需要注意的是为了让GC起作用,必须显式的为最后一个位置赋null值。

public E remove(int index) {
    rangeCheck(index);
    modCount++;
    E oldValue = elementData(index);
    int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index, numMoved);
    elementData[--size] = null; //清除该位置的引用,让GC起作用
    return oldValue;
}

三、trimToSize()

我们知道ArrayList中默认初始容量是10,当添加的元素个数大于10后,会自动扩容,容量变为原来的1.5倍,也就是说elementData数组的长度是15,但如果在添加10个元素之后,只添加了1个元素,现在ArrayList的size其实是11,但elementData数组的length却是15,那么还有4个数组空间没有利用起来,浪费资源,就可以调用该方法调整elementData数组,将其设置为length等于size的数组,底层是复制了一个长度为size的elementData数组返回。

ArrayList还给我们提供了将底层数组的容量调整为当前列表保存的实际元素的大小的功能。它可以通过trimToSize方法来实现。代码如下:

    /**
     * Trims the capacity of this <tt>ArrayList</tt> instance to be the
     * list's current size.  An application can use this operation to minimize
     * the storage of an <tt>ArrayList</tt> instance.
     */
    public void trimToSize() {
        modCount++;
        if (size < elementData.length) {
            elementData = (size == 0)
              ? EMPTY_ELEMENTDATA
              : Arrays.copyOf(elementData, size);
        }
    }

1、案例

@SpringBootTest
public class ListTests {
    @Test
    void test1() throws Exception {
        ArrayList<String> stringArrayList = new ArrayList<>();
        //初始化时获取
        System.out.println("初始化时获取");
        getArrayListLength(stringArrayList);

        stringArrayList.add("abc");
        stringArrayList.add("bbc");
        stringArrayList.add("cba");
        stringArrayList.add("cac");
        //存入值后获取
        System.out.println("存入值后获取");
        getArrayListLength(stringArrayList);

        //调用trimToSize()后获取
        System.out.println("调用trimToSize()后获取");
        stringArrayList.trimToSize();
        getArrayListLength(stringArrayList);

    }

    //查看ArrayList集合容量方法 -- 反射
    public static void getArrayListLength(List list) throws Exception {
        //获取Class对象
        Class c = Class.forName("java.util.ArrayList");
        //映射Class对象所表示类的属性
        Field field = c.getDeclaredField("elementData");
        //设置访问表示为true
        field.setAccessible(true);
        //返回指定对象上此 Field 表示的字段的值
        Object[] object = (Object[]) field.get(list);

        //获取实际长度与容量
        System.out.println(list.size());
        System.out.println(object.length);
    }
}

在这里插入图片描述

  • 人不需要活太多样子。你认真做一件事,会解释所有的事。
  • 愿所有的有情人,皆成眷属。
  • 露一露笑脸,让烦恼无处藏身,露一露幸福,让忧愁远走他乡,露一露快乐,让郁闷自惭形*,露一露真诚,让祝福传遍千里,寒露节,愿你展露笑颜,开心无限!
  • 愿你路过形形色色,不忘内心纯澈。
  • 愿你有前进一寸的勇气,亦有后退一尺的从容。
  • 每个人都有属于自己的舞台,这个舞台,是那么光灿,美丽,生命从此辉煌无悔!只要坚韧不拔的走下去!
  • 只有靠你自己的双手,才能搬来生命的障碍。
  • 圣诞到了,祝您的身体像圣诞老人一样健康,事业像雪橇车一样没有阻力,钞票像圣诞老人包袱里的礼物一样无穷无尽!
  • 保持前进,丝毫别在乎别人想什么说什么,做你自己必须做的,为自己。
  • 活在这珍贵的人间,太阳强烈,水波温柔。――海子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle---初学篇

Oracle初学篇 Oracle的启动&#xff0c;监听&#xff0c;用户 文章目录Oracle初学篇Oracle的启动Oracle的监听监听服务的主要文件1.listener.ora2.tnsnames.ora3.sqlnet.oraOracle用户Oracle安装成功后默认的三个用户创建用户Oracle的启动 之前写了关于如何在CentOS7上搭建Ora…

2021年全国研究生数学建模竞赛华为杯D题抗乳腺癌候选药物的优化建模求解全过程文档及程序

2021年全国研究生数学建模竞赛华为杯 D题 抗乳腺癌候选药物的优化建模 原题再现&#xff1a; 一、背景介绍   乳腺癌是目前世界上最常见&#xff0c;致死率较高的癌症之一。乳腺癌的发展与雌激素受体密切相关&#xff0c;有研究发现&#xff0c;雌激素受体α亚型&#xff0…

LeetCode 0547. 省份数量:图的连通分量

【LetMeFly】547.省份数量 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-provinces/ 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a …

Windows文件夹开启大小写敏感

Windows 的文件系统的文件名&#xff0c;是大小写不敏感的&#xff0c;也就是你的文件名是 a.txt 或者 A.txt&#xff0c;在 Windows 中都是一视同仁&#xff0c;认为是同一个文件。 自从 Windows 10 引入 Linux 子系统&#xff08;WSL&#xff09;后&#xff0c;有越来越多开…

JAVA毕业设计——基于ssm的汽车租赁管理系统 (源代码+数据库)

代码地址 https://github.com/ynwynw/carRental-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject 基于Springboot的汽车租赁管理系统 (源代码数据库)601 一、系统介绍 汽车租赁系统总共分为两个大的模块&#xff0c;分别是系统模块和业务模块。其中系统模…

基于混沌原子搜索优化的电力系统(HPS)负载频率自动控制(ALFC)(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Spring Security 中的四种权限控制方式

Spring Security 中对于权限控制默认已经提供了很多了&#xff0c;但是&#xff0c;一个优秀的框架必须具备良好的扩展性&#xff0c;恰好&#xff0c;Spring Security 的扩展性就非常棒&#xff0c;我们既可以使用 Spring Security 提供的方式做授权&#xff0c;也可以自定义授…

如何实现外网访问API接口

Application Programming Interface 缩写为API&#xff0c;中文翻译为“应用程序接口”&#xff0c;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&…

TVS管开关电源防护应用及电源防护元件的品类

瞬态抑制二极管简称TVS管。其作用原理是能够在极短的时间内承受反向电压的冲击&#xff0c;使得两极之间的电压钳位在特定电压水平上&#xff0c;有效避免了对后面电路的冲击&#xff0c;从而保护了被保护电子线路中的精密元件不受其损害。 瞬态抑制二极管TVS的钳位响应速度为为…

pytest + yaml 框架 -7.用例分层机制

前言 当我们测试流程类的接口&#xff0c;需反复去调用同一个接口&#xff0c;就会想到复用API&#xff0c;在代码里面可以写成函数去调用。 那么在yaml 文件中&#xff0c;我们可以把单个API写到一个yaml 文件&#xff0c;测试用例去调用导入API。 pip 安装插件 pip instal…

电子产品设计的流程有哪些

电子产品设计过程是指导工业外观设计的具体环节&#xff0c;主要包括产品市场需求分析、产品设计、产品原型设计、生产测试设计、大规模生产等方法和步骤。 一、电子产品设计流程是什么? 1.产品市场需求分析是电子产品设计成功的第一步&#xff0c;也是非常重要的一步。开发者…

JavaSE(数组)

1. 数组 数组创建及初始化 总结&#xff1a; 三种写法包括了动态初始化和静态初始化&#xff0c;其中省略格式不能再省略&#xff08;拆分&#xff09;&#xff1b;没有初始化时&#xff08;默认值为基类类型对应的默认值&#xff09;其中引用类型的默认值为null 三种写法 1…

RK3288-8.1-添加一个人体感应的开关-pir_pin_status

收到一个人体感应的需求,在设置添加一个开关 第一步,确定人体感应接口的GPIO 可知GPIO7_B5为对应GPIO 第二步,注册对应DTS 然后去驱动内注册对应的节点 很基础的东西,就不多说了,省略一万字......................(得到节点) cat sys/devices/platform/attr/pir_pin_status …

CAD尺寸标注不显示数值

在创建一个新的CAD图纸后&#xff0c;使用CAD尺寸标注会看见只有一条直线而没有数字显示&#xff0c;这是为什么呢&#xff1f;实际上是存在数值的&#xff0c;只是默认的数值很小&#xff0c;如果图形尺寸过大就看不清楚需要放大才能看见&#xff0c;就需要调整CAD尺寸标注的格…

RSS Can:借助 V8 让 Golang 应用具备动态化能力(二)

继续聊聊之前做过的一个小东西的踩坑历程&#xff0c;如果你也想高效获取信息&#xff0c;或许这个系列的内容会对你有用。 写在前面 在上一篇文章《RSS Can&#xff1a;使用 Golang 实现更好的 RSS Hub 服务&#xff08;一&#xff09;》里&#xff0c;我们简单介绍了使用 G…

数字孪生技术在智慧园区领域的实践

随着云计算、物联网、大数据、人工智能、5G 等为代表的技术迅速发展和 深入应用&#xff0c;“智慧园区”建设已成为全球园区发展的新趋势。近年来&#xff0c;党中央 和国务院更加注重智慧园区的建设与发展&#xff0c;相继出台了多项政策推动智慧园区的建设&#xff0c;智慧园…

数据镜像软件

什么是数据镜像 数据镜像是复制已传输到 USB 设备或在 USB 设备中修改的文件内容的过程。创建镜像副本后&#xff0c;可以在受密码保护的网络共享中维护这些副本。此共享文件夹最好保存在远程位置&#xff0c;以节省本地计算机上的空间。这样&#xff0c;只有管理员或受信任的…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于疫情防控下社区管理平台my3tu

对于即将毕业或者即将做课设的同学而言&#xff0c;由于经验的欠缺&#xff0c;面临的第一个难题就是选题&#xff0c;确定好题目之后便是开题报告&#xff0c;如果选题首先看自己学习那些技术&#xff0c;不同技术适合做不同的产品&#xff0c;比如自己会些简单的Java语言&…

Flutter自定义MultiChildRenderObjectWidget实现圆环布局效果

一、本文主要是学习巩固一下自定义RenderObject这一块内容&#xff0c;用所了解到的知识实现一个圆环布局效果 本篇文章主要参考了恋猫de小郭Flutter 完整开发实战详解&#xff08;十六、详解自定义布局实战&#xff09;文章&#xff0c;大家可以先看完这篇文章再来阅读本篇这…

生产制造企业用的ERP系统——流程管理

ERP的含义是企业资源计划&#xff0c;主要是对企业所拥有各种资源进行综合规划和优化管理&#xff0c;用以降低成本&#xff0c;提高效率&#xff0c;增加利润。 作为一个低代码开发平台&#xff0c;百数在办公领域已有10年历史&#xff0c;为企业信息化发展提供丰富的功能模块…