java集合: ArrayList的底层机制和使用方法

news2024/11/17 21:21:04

文章目录

  • 引言
  • 一、Arraylist是什么?
  • 二、Arraylist的底层扩容机制(面向面试)
    • 1.扩容机制
    • 2.扩容过程:3步骤
    • 3.注意事项
  • 三、使用步骤
    • 1.ArrayList类引入
    • 2.添加元素
    • 3.删除元素
    • 4.计算大小
    • 5.其他的引用类型
    • 6.ArrayList 排序
    • 7.ArrayList的遍历方法
    • 8.Java ArrayList 方法表格

引言

ArrayList是继承自List的类,是集合中的可变长度数组型存储容器,在开发中具有重要的作用

一、Arraylist是什么?

ArrayList 类是一个可以动态修改的数组,简单理解为与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口。
以下为ArrayList继承的接口和类(此处不对这些接口和类做过多解释)
在这里插入图片描述

二、Arraylist的底层扩容机制(面向面试)

1.扩容机制

  • ArrayList中维护了一个Object类型的数组elementDate[] (可去idea看源码) object类型可以自定义其他包装类如Integer或自定义类TreeNode.
  • 当创建ArrayList对象时,如果使用的是无参构造器,则初始化elementData[] 的容量为0,第一次添加数据,则扩容为10,如过添加到第11个元素,数组elementData扩容为1.5倍。依次类推,需要则扩1.5倍
  • 如果使用指定大小的构造器,则初始elementData容器为指定大小,如需要扩容则直接按目前指定的大小进行1.5倍扩容

2.扩容过程:3步骤

  • 先创建一个新的数组,数组大小为原来数组的1.5倍
  • 将原来数组通过底层的Arrays.copy()方法复制到新数组
  • 将新数组的地址给到指向原来数组的引用(也就是elementData,让elementDate指向新数组)

(源码过程如下,可通过在idea中 Ctrl+左键追踪方法 或 debug 追踪)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.注意事项

  • 垃圾回收机制自动处理旧数组
  • ArrayList没有Synchronized关键字,不是线程安全的(就是能够同时被多个线程操作同一个元素,就会出现一个元素被同时修改了三次,该取哪个的值呢),但效率也高
  • ArrayList适用于单线程(只被一个线程操作),就不会出现线程问题
  • ArrayList适用于查找较多的,不适合经常增删,因为底层是数组

三、使用步骤

1.ArrayList类引入

ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下:

代码如下(示例):

import java.util.ArrayList; // 引入 ArrayList 类
 
ArrayList<E> objectName =new ArrayList<>();  // 初始化

E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
objectName: 对象名

2.添加元素

ArrayList 类提供了很多有用的方法,添加元素到 ArrayList 可以使用 add() 方法 。 添加并遍历元素如下

package Demo;
 
import java.util.ArrayList;
 
public class DemoArraylistEach {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("老六");
        list.add("老六六");
        list.add("老六六六");
        System.out.println(list);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

输出结果为如下

[老六,老六六, 老六六六]
老六
老六六
老六六六

3.删除元素

如果要删除 ArrayList 中的元素可以使用 remove() 方法:

 import java.util.ArrayList;
     
    public class RunoobTest {
        public static void main(String[] args) {
            ArrayList<String> sites = new ArrayList<String>();
            sites.add("Google");
            sites.add("Runoob");
            sites.add("Taobao");
            sites.add("Weibo");
            sites.remove(3); // 删除第四个元素
            System.out.println(sites);
        }
    }

以上实例,执行输出结果为:

[Google, Runoob, Taobao]

4.计算大小

import java.util.ArrayList;
 
public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        System.out.println(sites.size());
    }
}

以上实例,执行输出结果为:

4

5.其他的引用类型

ArrayList 中的元素实际上是对象,在以上实例中,数组列表元素都是字符串 String 类型。

如果我们要存储其他类型,而 只能为引用数据类型,这时我们就需要使用到基本类型的包装类。

基本类型对应的包装类表如下:

此外,BigInteger、BigDecimal 用于高精度的运算,BigInteger 支持任意精度的整数,也是引用类型,但它们没有相对应的基本类型。

rrayList<Integer> li=new Arraylist<>();     // 存放整数元素
ArrayList<Character> li=new Arraylist<>();   // 存放字符元素

以下实例使用 ArrayList 存储数字(使用 Integer 类型):

import java.util.ArrayList;
 
public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<Integer> myNumbers = new ArrayList<Integer>();
        myNumbers.add(10);
        myNumbers.add(15);
        myNumbers.add(20);
        myNumbers.add(25);
        for (int i : myNumbers) {
            System.out.println(i);
        }
    }
}

以下是输出结果

10
15
20
25

6.ArrayList 排序

Collections 类也是一个非常有用的类,位于 java.util 包中,提供的 sort() 方法可以对字符或数字列表进行排序。

以下实例对字母进行排序:

import java.util.ArrayList;
import java.util.Collections;  // 引入 Collections 类
 
public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Taobao");
        sites.add("Wiki");
        sites.add("Runoob");
        sites.add("Weibo");
        sites.add("Google");
        Collections.sort(sites);  // 字母排序
        for (String i : sites) {
            System.out.println(i);
        }
    }
}

执行结果

Google
Runoob
Taobao
Weibo
Wiki

以下实例对数字进行排序:

 import java.util.ArrayList;
    import java.util.Collections;  // 引入 Collections 类
     
    public class RunoobTest {
        public static void main(String[] args) {
            ArrayList<Integer> myNumbers = new ArrayList<Integer>();
            myNumbers.add(33);
            myNumbers.add(15);
            myNumbers.add(20);
            myNumbers.add(34);
            myNumbers.add(8);
            myNumbers.add(12);
     
            Collections.sort(myNumbers);  // 数字排序
     
            for (int i : myNumbers) {
                System.out.println(i);
            }
        }
    }

执行结果

8
12
15
20
33
34

7.ArrayList的遍历方法

在这里插入图片描述
注意:

  • 底层是有序的(即按添加的顺序取值)
 ArrayList<Integer> myNumbers = new ArrayList<Integer>();
            myNumbers.add(33);
            myNumbers.add(15);
            myNumbers.add(20);
            myNumbers.add(34);
            myNumbers.add(8);
            myNumbers.add(12);
       
        //如果有下一个hasNext()就继续
        while(iterator.hasNext()){
            Integer i = iterator.next();//next()就是返回值
        }
        //方法二:增强for
        for(Integer l1 : myNumbers){
            Integer i = l1;
        }
        //方法三:普通for
        for (int i = 0; i < myNumbers.size(); i++) {
            Integer integer = myNumbers.get(i);
        }


结果:

33
15
20
34
8
12

8.Java ArrayList 方法表格

Java ArrayList 常用方法列表如下:

在这里插入图片描述在这里插入图片描述

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

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

相关文章

HTML5+CSS3(六)-全面详解(学习总结---从入门到深化)

目录 CSS简介 CSS概念 为什么需要CSS CSS和HTML之间的关系 语法 学习效果反馈 CSS的引入方式 内联样式&#xff08;行内样式&#xff09; 内部样式 外部样式&#xff08;推荐&#xff09; 导入式&#xff08;了解&#xff09; import和link的区别 学习效果反馈 CSS样式…

代码随想录day53 动态规划

代码随想录day53 动态规划 题392 判断是否子序列 1&#xff0c;与最长公共子序列类似&#xff0c;最后公共子序列的长度要等于s的长度。区别在于当遍历元素不想等的时候&#xff0c;对于字符串s&#xff08;子序列&#xff09;不需要删除&#xff0c;对于字符串t&#xff0c;…

Android---CoordinatorLayout原理

目录 CoordinatorLayout 的作用 CoordinatorLayout 的功能 1 处理子控件之间依赖下的交互 2 处理子控件之间的嵌套滑动 3 处理子控件的测量与布局 4 处理子控件的事件拦截与响应 CoordinatorLayout 下的事件传递机制 CoordinatorLayout 协调者布局。 CoordinatorLayout…

Java基础之序列化与反序列化

序列化&#xff1a;将java对象转化为字节序列的过程。 反序列化&#xff1a;将字节序列转化为java对象的过程。 在进行远程通信时&#xff0c;如果需要传输java对象&#xff1a;发送方需要把java对象转换为字节序列(也就是序列化)&#xff0c;接收方需要将字节序列转换为java对…

PHP设计模式总括篇

系列文章目录 第一章 工厂模式 第二章 抽象工厂模式 第三章 单列模式 第五章 责任链模式 第六章 策略模式 一&#xff0c;定义 “每一个模式描述了一个在我们周围不断重复发生的**问题&#xff0c;以及该问题的解决方案的核心。**这样&#xff0c;你就能一次又一次地使用该方…

都React V18了,还不会正确使用React Hooks吗,万字长文解析Hooks的常见问题

前言 今天主要想说一下react hooks&#xff0c;react hooks是react v16.8 之后引入的API&#xff0c;现在react都已经到V18了&#xff0c;hooks怎么还能不会用呢&#xff1f; 首先hooks引入的目的是给函数式组件增加数据状态管理的能力&#xff0c;同时增加代码的可复用能力。…

C++的类型转换详解

目录前言一、C语言中的类型转换二、为什么C需要四种类型转换三、C强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast向上转型向下转型四、RTTI(了解)总结前言 在C语言就已经存在了类型转化&#xff0c;但是其中的一些类型转换存在一些问题&…

4.7--贪心--多机调度问题

贪心选择--最长处理时间作业优先&#xff08;n个作业&#xff0c;m台相同机器&#xff09; 当n<m时&#xff0c;只要将机器i的[0, ti]时间区间分配给作业i即可&#xff0c;算法只需要O(1)时间。 当n>m时&#xff0c;首先将n个作业依其所需的处理时间从大到小排…

开发者开年变富,如何迈出第一步?| 「钞能力养成指北」前传

写在前面 &#xff1a; 面对全面放开后多样的消费机会&#xff0c;开发者们如何在保障品质生活的同时&#xff0c;借助开源工具&#xff0c;全面、科学地规划和管理个人财务&#xff0c;把握资金动向&#xff0c;避开消费陷阱&#xff1f; LigaAI 特邀我司 Nerd4me 大佬分享其个…

Apollo planning之交规决策技术

Apollo studio 官网&#xff1a;Apollo开发者社区 (baidu.com) 目录 1 双层状态机 2 决策模块的解析 2.1 参考路径 2.2 交规决策 2.3 路径决策 2.4 速度决策 2.5 场景的调度与管理 3 交规决策实现代码解读 3.1 遍历交规配置文件&#xff0c;存储信息 3.2 交规决…

分布式(三)

三、API 网关详解 1. 网关及作用 主要功能&#xff1a;请求过滤 网关可以为我们提供请求转发、安全认证&#xff08;身份/权限认证&#xff09;、流量控制、负载均衡、降级熔断、日志、监控等功能。 2. 常见的网关系统 2.1 Netflix Zuul &#xff08;1&#xff09;Zuul 是…

进军存储赛道—BNB Greenfield:Web3 数据所有权和效用新标准

最近BNB Chain 自豪地宣布发布BNB Greenfield 白皮书。BNB Greenfield为Web3时代的数据引入了一个全新的结构和经济模式。现在&#xff0c;数据的所有权、使用权和货币化&#xff0c;首先对用户以及BNB Chain生态系统中的所有参与者来说是可能的。BNB Greenfield 使用 BNB 作为…

OSCP_VULHUB_symfonos-2(失败)

文章目录 前言实验攻击尝试hydra爆破ftpmetasploit工具进行SSH登录端口转发1命令注入getshell 1端口转发2提权失败总结前言 这个是练习的第5个机子。 目标地址 https://www.vulnhub.com/entry/symfonos-2,331/ 实验 1.信息收集 1.1 目标ip 1.2 开放端口 nmap -sS -sV -A …

QT入门Buttons之QCommandLinkButton、QDialogButtonBox

目录 一、QCommandLinkButton界面布局介绍 二、QCommandLinkButton基本属性介绍 三、QDialogButtonBox界面布局介绍 1、布局器中的位置及使用 此文为作者原创&#xff0c;转载请标明出处&#xff01; 一、QCommandLinkButton界面布局介绍 一般这两个控件使用较少&#xf…

HarmonyOS/OpenHarmony应用开发-DevEco Studio 3.0与DevEco Studio 3.1版本差异

工程模板和开发语言介绍 DevEco Studio支持包括手机、平板、车机、智慧屏、智能穿戴、轻量级智能穿戴和智慧视觉设备的HarmonyOS应用/服务开发&#xff0c;预置了工程模板&#xff0c;可以根据工程向导轻松创建适应于各类设备的工程&#xff0c;并自动生成对应的代码和资源模板…

C生万物 | 揭开【整型提升】神秘面纱

&#x1f451;作者主页&#xff1a;Fire_Cloud_1 &#x1f3e0;学习社区&#xff1a;烈火神盾 &#x1f517;专栏链接&#xff1a;C生万物 文章目录一、前言二、整型提升的意义所在三、如何进行整型提升❓四、实战演练&#x1f5e1;1、深剖两数求和的内部运算2、三种不同数据类…

机器学习:线性回归分析女性身高与体重之间的关系

机器学习&#xff1a;线性回归分析女性身高与体重之间的关系 创作不易&#xff0c;觉得文章不错或能帮到你学习&#xff0c;记得点赞 收藏哦 文章目录机器学习&#xff1a;线性回归分析女性身高与体重之间的关系一、实验目的二、实验原理三、实验内容四、实验环境五、实验步骤…

C++ 入门基础

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 The longest way must have its close,the gloomiest night will wear on a morning. 最长的路也有尽头&#xff0c;最黑暗的夜晚也会迎来清晨。 文…

擅长做财务分析的BI软件有哪些?

财务分析是企业数据分析中的一个重要板块&#xff0c;所以基本上BI软件都能做基础的财务数据分析&#xff0c;比如说帆软、永洪、思迈特等&#xff0c;但要说到系统化地、高效地做企业财务分析&#xff0c;还是要看奥威BI软件。 之所以说BI财务分析软件看奥威BI&#xff0c;是…

【万文全解】Java集合源码解析【HashMap】【ArrayList】【JDK源码集合部分】

Java集合源码解析 本文主体部分是作者跟着B站韩顺平老师的课程总结而来&#xff0c;中间穿插自己的理解还有网上各类优质解答 第一节&#xff1a;集合介绍与集合体系图 集合与数组对比&#xff08;引入集合的目的&#xff09; 数组&#xff1a; 长度必须指定&#xff0c;一…