广告
返回顶部
首页 > 资讯 > 后端开发 > Python >你真的理解Java中的ArrayList吗
  • 668
分享到

你真的理解Java中的ArrayList吗

2024-04-02 19:04:59 668人浏览 安东尼

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

摘要

目录1. 为什么需要ArrayList?2. ArrayList底层是如何实现的?3. 结合源码分析主要成员变量4. 个人的一点总结1. 为什么需要ArrayList? 图1

1. 为什么需要ArrayList?

图1 图2

记得在刚刚学习Java的时候,我们首先是学习了数组,这是我们学到的第一个可以存储多个对象的实例或者基本类型的具体值,数组存储的特点如下:

  1. 只能存储同种类型的数据。
  2. 在定义数组时,必须指定该数组的大小,并且在不改变数组的前提下,不可修改其长度。

以上特性就会导致很多弊端。比如:我们往往不希望数组只能存储一种数据,而是希望存储我们想要存储的数据,最好是在想要存储的时候根据数据的类型指定存储的类型。其次,我们也不想一开始就指定好数据的长度,而是希望这个数组的容量可以随着我的数据的多少的改变而改变。

基于以上的弊端,Java中出现了集合。这是一种新的容器可以用来存储数据,而集合的存储方式有多种,常见的有链式存储(LinkedList)和顺序存储(ArrayList)。

链式存储底层是用一个个节点(node)链接而成的,每个节点都存储着一个对象值和下一个节点的位置(或上一个节点的位置)。

顺序存储底层是用一个数组存储数据的,对于数组的弊端,顺序存储集合底层使用了ensureCapacity这个方法不断扩容,ensureCapacity这个单词字面翻译是 保证能力。顾名思义,由于底层是一个数组,当我们存入一个对象时,我们需要保证数组是有空余位置的,因此在添加元素的时候,Java源码会先经过这个方法进行判断底层数组是否满了,若满了则会扩容数组(上面提到数组是不能直接扩容的,这里实际上是重新创建了一个更大空间的数组并把元素“搬运”过去)。这样就解决了数组的一个弊端。而对于另一个弊端,Java则是巧妙的运用了泛型。泛型的内容非常繁多,这里结合实例希望大家可以更好的理解。

想象一下现在有一个需求,需要你实现一个的多值加法,但传入的参数的类型是不确定的,可以有Integer,String,Double等等。这时候如果你用的是数组作为参数,那么那你肯定会想,最粗糙的方法是分别写多个加法方法,对应不同的类型,但很明显,代码可读性极差,那如果使用Object数组,然后再根据数据类型,转换为对应的类型再计算?这样也存在弊端!你根本不知道需要转换为什么类型才合适。因此,针对这种情况,使用泛型集合是最合适的,我们只需要在传入参数的时候使用泛型类型,而因为不同类型计算的过程是一致的,因此结果并没有差别,也不会导致报错。

2. ArrayList底层是如何实现的?

简单介绍了ArrayList的用途以及和数组的区别,那么根据上面的讲解,你应该大致了解它的实现原理了吧!

先不看源码,如果你有一些数据结构与算法的基础的话,你应该可以马上得出下面结论:先在ArrayList类定义一个数组,接着定义一个添加,一个删除,一个查询,一个修改方法。实际上是对数组的操作,那么,删除和添加可能需要移动大量的元素,这些都是在源码中实现,但对应到效率也会很低,其次还需要一个扩容数组的方法。

如果你能想到上面这些,恭喜你,你已经掌握的很不错。事实上,ArrayList的源码确实包含以上方法,只不过还需要加上迭代器以及构造方法等。迭代器的出现是为了适应增强for语句(后面会细说),构造方法是为了初始化集合。

3. 结合源码分析主要成员变量

ArrayList继承AbstractList这个抽象类和List接口

List

接口继承Collection接口(实际上集合还有map集合等)

而Collection则是继承了Iterable(可迭代的),Collection中包含了集合中通用的方法,包括增删改查,只不过都未实现。而Iterable则是只有一个forEach方法,提供迭代。

接着我们回到ArrayList类,这是底层维护的数组,实际上对象存储的地方

,

记录集合的长度

返回集合的长度

判断集合是否为空

根据索引获取元素

添加元素

添加元素到指定位置

删除元素

内部类的next方法实现迭代功能(我们平时使用增强for语句的判断条件就是根据判断是否有next值来实现的)

4. 个人的一点总结

Java的设计者很巧妙的设计了Java中的每个功能,很多时候,我们会觉得说我手动实现简单的集合不需要这么复杂的代码呀?甚至有些功能都不需要单独作为一个方法。但这就是Java的魅力啊!

以前刚学代码的我们,把代码全都丢到main方法里面,我们会觉得提取出来是多么复杂,但当我们知道功能是有区别的,我们才知道这样子做的用处。
曾经有个老师这么对我说,他说你知道为什么我们要费尽心思去设计各种类之间的关系,接口,抽象类,泛型等等吗?那时候的我一脸茫然,他对我说,打个比方,你见过卖水果的店里还卖手机的吗?我听完后恍然大悟,对于一个小城镇,确实可能存在一个小店卖着各种杂七杂八的东西,但一个千万人口的大城市,是做不到的,这是格局啊!各种功能,各种设施都应该井井有条,关系明确。面向对象也好,设计模式也好,一切的功能都是为了大型程序做准备,这也是为什么Java一直可以大型应用的后端程序语言之一。

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

--结束END--

本文标题: 你真的理解Java中的ArrayList吗

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

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

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

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

下载Word文档
猜你喜欢
  • 你真的理解Java中的ArrayList吗
    目录1. 为什么需要ArrayList?2. ArrayList底层是如何实现的?3. 结合源码分析主要成员变量4. 个人的一点总结1. 为什么需要ArrayList? 图1...
    99+
    2022-11-12
  • Java的代理模式你真的了解吗
    目录代理模式原理解析动态代理的原理解析代理模式的应用场景代理模式原理解析 代理模式(Proxy Design Pattern),它在不改变原始类(或者叫被代理类)代码的情况下,通过引...
    99+
    2022-11-13
  • java的泛型你真的了解吗
    目录泛型的概述和优势自定义泛型类自定义泛型方法自定义泛型接口泛型通配符、上下限总结泛型的概述和优势 泛型概述 泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检...
    99+
    2022-11-13
  • Java 缓存:你真的了解它吗?
    在 Java 开发中,缓存是一个非常重要的概念。它可以大大提升应用程序的性能,减少对底层资源的占用,提高用户体验。但是,你真的了解 Java 缓存吗?本文将为大家介绍 Java 缓存的基本概念、分类、应用场景以及常见的缓存框架。 一、缓存...
    99+
    2023-10-06
    缓存 学习笔记 面试
  • C++中的函数你真的理解了吗
    目录1 概述2 函数的定义及调用3 值传递4 函数的常见形式5 函数的声明6 函数的分文件编写作用:让代码结构更加清晰1.2.3.4.总结1 概述 作用:将一段经常使用的代码进行封装...
    99+
    2022-11-13
  • C++中的数组你真的理解了吗
    目录1 概述2 一维数组2.1 一维数组定义方式2.2 一维数组组名2.3 冒泡排序3 二维数组3.1 二维数组定义方式3.2 二维数组数组名3.3二维数组应用举例总结1 概述 所谓...
    99+
    2022-11-13
  • Java递归寻路实现,你真的理解了吗
    目录引使用递归计算阶乘地图创建核心完整代码总结引 看懂这张图,方法调用方法,栈开新栈,递归尾结束要回到main栈,必须一级一级返回,每一次返回都是调用整个方法,调用完成栈被释放,直至回到栈底main递归结束并能够自己画出来,理解递归的运行...
    99+
    2017-05-23
    Java递归 java实现
  • 关于Java Object你真的了解了吗
    导读: 在平时的coding中hashCode()和equals()的使用的场景有哪些?clone深复制怎么实现?wait()和notify()有什么作用?finalize()方法干嘛的?看似coding中使用的不多,不重要,但是有没有跟我...
    99+
    2023-05-31
    java object ava
  • 你真的了解Java中NumPy的索引机制吗?
    Java中的NumPy是一种非常强大的数组处理工具,它可以帮助我们高效地处理大量的数据。在Java中,NumPy的索引机制是非常重要的一个概念,它可以帮助我们快速地定位和获取数组中的数据。本文将深入探讨Java中NumPy的索引机制,帮助读...
    99+
    2023-05-26
    numy numpy 索引
  • Java和JavaScript的异同,你真的了解吗?
    Java和JavaScript是两种非常常见的编程语言,它们在很多方面有着相似的特性,但它们也有着很多不同之处。在本文中,我们将探讨Java和JavaScript的异同,并且演示一些代码示例来帮助你更好地理解它们。 Java和JavaS...
    99+
    2023-10-24
    javascript http 重定向
  • JavaScript 和 PHP 中的重定向:你真的理解吗?
    重定向是 Web 开发中经常用到的一个概念,它指的是把用户请求从一个 URL 跳转到另一个 URL。在 JavaScript 和 PHP 中,我们都可以使用重定向来实现这个功能。但是,你真的理解重定向吗?在本文中,我们将深入探讨 Java...
    99+
    2023-08-14
    javascript 重定向 leetcode
  • Go编程中的数组:你真的理解了吗?
    数组是编程语言中最基础的数据结构之一,Go语言中也不例外。它是一种固定长度、存储相同类型元素的数据结构。虽然在Go中也有切片(slice)这样的动态数组类型,但是对于一些固定长度的数据存储需求,数组仍然是很有用的。 本文将深入探讨Go编程...
    99+
    2023-08-15
    编程算法 关键字 数组
  • Java API 中的 HTTP 重定向:你真的了解它吗?
    HTTP 重定向是 Web 开发中常见的一种技术手段,通过它可以将用户请求重定向到其他 URL 上。Java API 中提供了多种方式来实现 HTTP 重定向,本文将深入探讨这些方式的实现原理和使用方法。 一、HTTP 重定向的基本原理 ...
    99+
    2023-06-16
    api http 重定向
  • 你真的了解Java的多线程方法吗
    目录Java 多线程方法详解startrunyieldjoinsleepInterruptdeamonPriority总结Java 多线程方法详解 start start方法&nbs...
    99+
    2022-11-13
  • Golang中的泛型你真的了解吗
    目录什么是泛型为什么需要泛型泛型语法类型参数类型集类型推断总结Golang 在 1.18 版本更新后引入了泛型,这是一个重要的更新,Gopher 万众瞩目,为 Golang 带来了更...
    99+
    2023-05-20
    Golang泛型用法 Golang泛型学习 Golang泛型 Go 泛型
  • Java中的基本容器知识你真的了解过吗?
    前言:尽量使用简单易懂的通俗语言让大家初步了解各个重要的知识点。博学之,审问之,慎思之,明辨之,笃行之。   一、容器(Collection)   Collection容器其实是用来存储独立元素的各种数据结构,如图所示。主要是S...
    99+
    2023-09-01
    数据结构 java 容器 链表
  • ASP 框架教程:你真的理解了吗?
    ASP框架教程:你真的理解了吗? ASP框架是一个非常流行的Web应用程序开发框架,使用了Microsoft ASP.NET技术。这个框架的目的是为了让开发人员更快速、更容易地创建Web应用程序。但是,ASP框架的概念并不容易理解,因此在这...
    99+
    2023-08-05
    框架 教程 学习笔记
  • Vue的diff算法原理你真的了解吗
    目录思维导图0. 从常见问题引入1. 生成虚拟dom1. h方法实现2. render方法实现3. 再次渲染2. diff算法1. 对常见的dom做优化情况1:末尾追加一个元素(头和...
    99+
    2022-11-13
  • Java同步框架API:你真的了解它吗?
    Java是一个非常流行的编程语言,它的强大之处在于它提供了许多非常有用的API,其中包括同步框架API。同步是指多个线程在共享相同资源时需要互相协调和同步,以避免出现竞争条件和数据不一致等问题。在Java中,同步框架API提供了一些有用的...
    99+
    2023-09-05
    同步 框架 api
  • python3中的类继承你真的了解吗
    目录(1)首先使用直接继承的方式(2)在子类中定义属性(3)如果想要继承父类中的属性,一般使用super方法:(4)如果需要在子类的__init__中传入参数则可以这样使用:&nbs...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作