当前位置:首页 > 文章列表 > 文章 > java教程 > Java中的动态数组是如何实现的?

Java中的动态数组是如何实现的?

来源:亿速云 2024-03-26 19:39:38 0浏览 收藏

Java 中的数组是一种有序的、固定长度的数据结构,用于存储相同类型的元素。可以通过索引来访问数组中的元素,这使得访问和检索数据非常高效。然而,数组的长度一旦创建后就无法更改,必须通过创建一个新数组并复制现有元素才能实现大小调整,这使得数组在需要动态调整大小的场景下显得不那么实用。

一、数组的基本概念

1、什么是数组?

在平时使用最多的恐怕就是数组了吧,

它是使用最广泛的一种数据结构,它是相同数据类型(可以是基本类型也可以是自定义类型)的元素按一定顺序排列的集合,它们在内存中按照这个先后顺序连续存放在一起。有一维数组,二维数组,多维数组。

通俗的理解就是我们一般把一群羊或者一群牛放在一个圈里面,这个圈就相当于数组容器,每一个羊相当于一个元素。

以上这个概念需要知道这几个词汇:相同数据类型、一定顺序排列、集合、内存先后存放。

2、如何声明一个数组

从标题就可以看到,声明和创建一个数组是两个不同的过程。声明的作用就好像是告诉别人我要去洗澡,创建的作用就好像是我真正的去洗澡了(比喻不当哈哈)。那如何声明数组呢?

int[] students ; int students [];

从上面我们看到这里有两种方式,但一般推荐第一种。毕竟第一种看起来可读性更好一点。

3、如何创建一个数组

在我们知道了如何声明数组之后,接下来就是我们如何创建一个数组。不同的语言创建一个数组的方式还是不一样的,但是大体上一样,这里给出java的几种方式。

//第一种: int [] students = new  int[50]; //第二种: String [] colors =  {"red","blue","black"};

从上面可以发现创建一个数组如此简单,别急,这三种方式里面其实还是有很多知识点需要掌握的。其实数组的创建其中有一个环节叫做数组的初始化。举个例子,我创建了一个数组,但是一开始数组容器里面可能还没有这些值。那什么时候才有了这些值呢?也就是系统什么时候把我声明的那些red、blue等等装到数组容器里面的呢?这个过程就是数组的初始化。数组是如何初始化的呢?

数组的初始化分为静态初始化、动态初始化:

  • 静态初始化:数组在初始化时由程序员显式指定每个数组元素的初始值。而数组长度由系统决定。在上面创建数组的那三种方式中,第三种就是静态初始化。第二种也是,但是属于静态初始化的简化方式。

  • 动态初始化:动态初始化时则必须指定元素个数。动态初始化时数组元素个数未知因此必须指定。上面第一种就是。

4、数组的分类

可能看到这个标题有一个疑问,数组还有分类吗?不就是把相同类型的元素放在一起嘛。其实不然。下面给你好好的分一下类:

**按照是否有序分:**有序数组和无序数组。

按照数组能否扩容分:静态数组和动态数组。

先来看静态数组:在编译期间在栈中分配好内存的数组,在运行期间不能改变存储空间,运行后由系统自动释放。

再来看动态数组:动态数组,是相对于静态数组而言。静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员自己负责释放内存。

java中动态数组的原理

现有一个数组:

int [] data = new int[5];

java中动态数组的原理是什么

该数组已经无法继续添加元素了,所以我们再初始化一个新的数组,其容量为10,即数组arr容量的2倍:int [] newData = new int  [10];

java中动态数组的原理是什么

然后将原数组的所有元素全部都赋值给新的数组。

java中动态数组的原理是什么

再将原数组的引用 arr指向 新的数组。

java中动态数组的原理是什么

静态数组和动态数组的比较:

对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点!对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则严重会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。

二、数组的特点

在上面掌握了其基本概念之后,再来看一下数组有什么特点,数组的特点也是根据其分类来的,比如说有序数组其特点肯定就是有序,我们方便查找数据,无序的我们方面插入删除数据这些。所以这里讲的特点是所有数组共有的特点,也就是一般性特点:又回到了之前发过的文章,特点就是来看时间效率和空间效率的。

1.数组的长度固定的,超过长度时,只能创建一个新的数组,并把旧的数组的值传进去方可;

2.数组的存储类型是单一的,同一数组只能存储同一数据类型的数据。

3.数组只能通过下标来访问数据

三、数组的使用场景

数组较容器,最大的优点就是效率。在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式,数组就是一个简单的线性序列,这使得元素访问非常快速,  数组的优点是效率高,但为此,所付出的代价就是数组对象的大小被固定。这也使得在工作中,数组并不实用。我们应该优选java中的容器,而不是数组。

四、数组的底层实现

这里的底层实现也是相比较于java语言来说的,比如在以后的文章里面,像链表这样的数据结构我也会配合Java中链表实现的容器来配合着说。

Java提供了很棒的集合API和集合类如:ArrayList、HashMap,他们内部都是基于数组。java如果程序尝试访问无效的数组索引的话jvm会抛出ArrayIndexOutOfBoundException。

Java语言中,数组的实现原理是什么?

这个涉及到编译原理的问题,我只能说,这是一个编译规范。在规范中比如:int[]中的int告诉计算机这是一个整型数据,[]告诉计算机这是一个连续存储的内存地址空间,简单点说一个连续数据的存储空间就是数组,数组只是一个名称!!数组在Java里是一种特殊类型,有别于普通的“类的实例”的对象。

以HotSpot  VM为例,答案是在数组对象的对象头里有一个length字段,记录数组长度。arraylength字节码的实现只要去读那个_length字段即可。JVM  中数组对象是一种特殊的对象,它的Object Header 比普通对象多了一个word 来存储数组的长度,length 会编译成对应的字节码读取这个field  就可以了。

到这里,我们也就讲完了《Java中的动态数组是如何实现的?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于java的知识点!

版本声明
本文转载于:亿速云 如有侵犯,请联系study_golang@163.com删除
使用Supplier函数在Java中进行供应商操作使用Supplier函数在Java中进行供应商操作
上一篇
使用Supplier函数在Java中进行供应商操作
用JavaScript编写自动生成缩略图功能
下一篇
用JavaScript编写自动生成缩略图功能
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 茅茅虫AIGC检测:精准识别AI生成内容,保障学术诚信
    茅茅虫AIGC检测
    茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
    92次使用
  • 赛林匹克平台:科技赛事聚合,赋能AI、算力、量子计算创新
    赛林匹克平台(Challympics)
    探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
    100次使用
  • SEO  笔格AIPPT:AI智能PPT制作,免费生成,高效演示
    笔格AIPPT
    SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
    104次使用
  • 稿定PPT:在线AI演示设计,高效PPT制作工具
    稿定PPT
    告别PPT制作难题!稿定PPT提供海量模板、AI智能生成、在线协作,助您轻松制作专业演示文稿。职场办公、教育学习、企业服务全覆盖,降本增效,释放创意!
    99次使用
  • Suno苏诺中文版:AI音乐创作平台,人人都是音乐家
    Suno苏诺中文版
    探索Suno苏诺中文版,一款颠覆传统音乐创作的AI平台。无需专业技能,轻松创作个性化音乐。智能词曲生成、风格迁移、海量音效,释放您的音乐灵感!
    97次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码