广告
返回顶部
首页 > 资讯 > 后端开发 > Python >深度解析Java中ArrayList的使用
  • 706
分享到

深度解析Java中ArrayList的使用

2024-04-02 19:04:59 706人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、ArrayList是什么二、ArrayList的构造方法三、ArrayList的常见方法常见方法遍历ArrayList使用迭代器删除元素四、ArrayList的扩容机制一、A

一、ArrayList是什么

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口。

我们发现ArrayList类位于java.util包中,使用之前需要去引入它.

import java.util.ArrayList;

ArrayList如何定义:

ArrayList<E> arrayList = new ArrayList<E>();

此数E为泛型实参类型,只能为引用数据类型,ArrayList想存储什么类型的数据,我们就传什么就可以。

List<E> list = new ArrayList<E>();

因我们的ArrayList是继承于List的,所以我们可以用父类去接受子类对象,向上转型。

二、ArrayList的构造方法

我们发现ArrayList一共提供了三种构造方法。

构造方法1:

构造一个空的顺序表

List<Integer> list = new ArrayList<>();

构造方法2:

构造一个指定大小为5的顺序表

List<Integer> list = new ArrayList<>(5);

构造方法3:

此处传入的要么是自己本身类型,或者是子类类型。

此处构造一个和list2元素一致的顺序表

List<Integer> list2 = new ArrayList<>(5);        List<Integer> list = new ArrayList<>(list2);

初始时的坑

List list = new ArrayList();

这样对顺序表进行初始化的话,没有指定任何类型,这样的话可以存放任意类型的元素,这样会存在很大的安全隐患。

三、ArrayList的常见方法

常见方法

在我的上一篇实现顺序表中,已经把大多数方法手动实现了一遍,此处我在说明几个重点的。

remove方法

ArrayList提供给我们两个remove方法

一个是传入要删除的下标,一个是要删除的引用。

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(8);
        list.remove(1);
        System.out.println(list);
    }

如果我们传入的是int类型那么我们删除的是该下标的数据。

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(8);
        list.remove(new Integer(10));
        System.out.println(list);
    }

如果我们传入的是引用数据类型,那么将删除该顺序表中的该引用数据。

subList方法

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        System.out.println("截取之前的list:"+list);
        List<Integer> list1 = list.subList(1,3);
        list1.set(0,5);
        System.out.println("截取之后的list:"+list);
    }

为啥改了list1之后,list的数据也发生了变化。

因为在截取之后并没有复制一份内容给list1,而是指向同一块内容。

遍历ArrayList

方法1:

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");
        }
        System.out.println();
    }

方法2:

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        for (Integer x:list) {
            System.out.print(x+" ");
        }
        System.out.println();
    }

方法3:

使用迭代器

方法作用
.next()返回迭代器写一个元素,更新迭代器状态
.hasNext()检测集合中是否还有元素
.remove()将迭代器返回的元素删除
public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        Iterator<Integer> it = list.listIterator();
        while (it.hasNext()) {
            System.out.print(it.next()+" ");
        }
        System.out.println();
    }

使用迭代器删除元素

我们删除集合小于3的元素

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        Iterator<Integer> it = list.listIterator();
        while (it.hasNext()) {
            if(it.next() < 3) {
                it.remove();
            }
        }
        System.out.println(list);
    }

迭代器的remove方法只能删除当前指向的元素。

四、ArrayList的扩容机制

List<Integer> list = new ArrayList<>();

很多资料都在说这样初始化一个集合,说默认大小为10,那事实到底是不是如此呢?我们一步步查看源码一探究竟。

我们发现当前引用指向后面那个引用

我们发现这里的引用是一个空引用,初始集合时,是一个空集合

那如何扩容呢?

既然我们的顺序表是空的,那如何add呢?

如果是无参构造的话,就传一个默认大小和传入大小的最大值。

我们可以发现如果大于数组大小时,就会grow。

我们可以发现计算一个新容量,和我们传入的大小做比较,如果新容量小于传入的大小时,指定当前集合大小为传入的大小。否则,对集合大小进行1.5倍扩容。

但如果我们1.5倍扩容的大小超过了这个指定的范围2147483639时

系统会报一个内存溢出异常。

1. 检测是否真正需要扩容,如果是调用grow准备扩容

2. 预估需要库容的大小

初步预估按照1.5倍大小扩容

如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容

真正扩容之前检测是否能扩容成功,防止太大导致扩容失败

3. 使用copyOf进行扩容

到此这篇关于深度解析Java中ArrayList的使用的文章就介绍到这了,更多相关Java ArrayList内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 深度解析Java中ArrayList的使用

本文链接: https://www.lsjlt.com/news/167884.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 深度解析Java中ArrayList的使用
    目录一、ArrayList是什么二、ArrayList的构造方法三、ArrayList的常见方法常见方法遍历ArrayList使用迭代器删除元素四、ArrayList的扩容机制一、A...
    99+
    2022-11-13
  • 深入浅析ArrayList类在Java中的作用
    这期内容当中小编将会给大家带来有关深入浅析ArrayList类在Java中的作用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java中ArrayList类详细介绍ArrayList是一个可变长度数组,它...
    99+
    2023-05-31
    java arraylist类
  • 关于RestTemplate的使用深度解析
    目录一、概述选择一个优秀的HTTPClient的重要性优秀的HTTPClient需要具备的特性连接池超时时间设置(连接超时、读取超时等)是否支持异步请求和响应的编解码可扩展性答案二、...
    99+
    2022-11-12
  • MySQL中的 Binlog 深度解析及使用详情
    目录配置文件参数说明常用的Binlog操作命令写Binlog的时机Binlog文件以及扩展Binlog与Redo log区别Binlog写入过程二阶段提交redo 与 binlog ...
    99+
    2022-11-13
  • Java线程池源码的深度解析
    目录概述核心机制线程池工作原理线程池状态源码解析关键成员变量线程提交原理Woker运行原理总结概述 线程池的好处和使用本篇文章就不赘叙了,不了解的可以参考下面两篇文章: 一文全貌了解...
    99+
    2022-11-13
    Java线程池源码解析 Java线程池源码 Java线程池
  • 深度解析Java中的国际化底层类ResourceBundle
    目录1. 准备资源文件2. 加载资源文件3. 获取本地化字符串4. ResourceBundle 使用技巧4.1 选择合适的资源文件格式4.2 处理本地化字符串中的特殊字符4.3 处...
    99+
    2023-03-10
    Java ResourceBundle国际化底层类 Java ResourceBundle国际化 Java ResourceBundle
  • Java中关于String StringBuffer StringBuilder特性深度解析
    1.String String类:字符串是常量,使用一对""引起来表示。他们的值在创建之后不能修改。 1.String声明为final的,不可被继承 2.String实现了Seria...
    99+
    2022-11-12
  • Java中的ArrayList怎么使用
    这篇文章主要讲解了“Java中的ArrayList怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的ArrayList怎么使用”吧!1.ArrayList类1.1ArrayL...
    99+
    2023-06-29
  • 深入源码解析ArrayList:探秘Java动态数组的机制与性能
    文章目录 一、 简介ArrayList1.1 介绍ArrayList的基本概念和作用1.2 与数组的区别和优势 二、 内部实现2.1 数据结构:动态数组2.2 添加元素:add()方法的实现原理2.3 扩容机制:ensure...
    99+
    2023-12-22
    java 源代码管理
  • 深入解析Java中的Semaphore
    系列文章目录 文章目录 系列文章目录前言一、Semaphore的概念:二、Semaphore的用法:1.创建Semaphore对象:2.获取许可证:3.释放许可证: 三、Semaphor...
    99+
    2023-10-04
    java 开发语言 数据库
  • 如何理解Java容器中ArrayList的源码分析
    这篇文章给大家介绍如何理解Java容器中List的源码分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如果没有特别说明,以下源码分析基于 JDK 1.8。一、ArrayList1. 概览实现了 RandomAcces...
    99+
    2023-06-05
  • 深度解析HashMap:探秘Java中的键值存储魔法
    文章目录 一、 **前言**1.1 介绍HashMap在Java中的重要性1.2 引出本文将深入挖掘HashMap的内部机制 二、 **HashMap的基本概念**2.1 什么是HashMap?2.2 为什么HashMap在...
    99+
    2023-12-22
    java 源代码管理
  • Java集合框架之List ArrayList LinkedList使用详解刨析
    目录1. List1.1 List 的常见方法1.2 代码示例2. ArrayList2.1 介绍2.2 ArrayList 的构造方法2.3 ArrayList 底层数组的大小3....
    99+
    2022-11-12
  • C++中的类与对象深度解析
    目录初始化列表引论初始化列表explicit关键字引论explicit关键字使用static成员 友元引论友元内部类基础概念内部类的使用补充析构顺序例题总结初始化列表 引论...
    99+
    2022-11-13
  • Java面向对象的封装特征深度解析
    目录面向对象三大特征封装private关键字——实现类封装访问器方法和更改器方法包——类的集合导入包从人的角度理解包不加访问权限——实现包封装总结在上一篇文章中,我们了解了面向对象的...
    99+
    2022-11-12
  • Java中深度优先与广度优先的示例分析
    这篇文章给大家分享的是有关Java中深度优先与广度优先的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发...
    99+
    2023-05-30
    java
  • Java中对HashMap的深度分析与比较(转)
    Java中对HashMap的深度分析与比较(转)[@more@]在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能的关键。由于本人接触了一个有关性能与逻辑同时并存的问题,于是就开始研究这方面的问题。找遍了大大小小的...
    99+
    2023-06-03
  • 深度源码解析Java 线程池的实现原理
    目录线程池的优点线程池的实现原理ThreadPoolExecutor阻塞队列线程池工厂拒绝策略提交任务到线程池execute 方法submit 方法关闭线程池合理的参数7、本文小结j...
    99+
    2022-11-12
  • Java中ArrayList的使用详细介绍
    目录1.ArrayList类1.1ArrayList类概述1.2ArrayList类常用方法1.2.1构造方法1.2.2成员方法1.2.3示例代码1.3ArrayList存储字符串并...
    99+
    2022-11-13
  • C#中ArrayList 类的使用详解
    目录一:ArrayList 类简单说明二:ArrayList 类的构造函数三:ArrayList 类的属性1:使用举例说明四:ArrayList 类的常用方法1: AddRange(...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作