Java 笔记 13:Java 数组内容,数组的声明、创建、初始化、赋值等,以及内存分析

一、前言

记录时间 [2024-05-03]

系列文章简摘:
Java 笔记 01:Java 概述,MarkDown 常用语法整理
Java 笔记 02:Java 开发环境的搭建,IDEA / Notepad++ / JDK 安装及环境配置,编写第一个 Java 程序
Java 笔记 11:Java 方法相关内容,方法的设计原则,以及方法的定义和调用
Java 笔记 12:Java 方法的相关使用,方法重载、参数传递,以及递归等内容

更多 Java 相关文章,请参考上面专栏哦。

本文讲述 Java 数组相关知识,包括数组的声明和创建、以及数组的简单使用。此外,文章对 Java 内存进行分析,从内存的角度分析了数组创建的过程。


二、数组概述

Java 中的数组是一种数据结构,用于存储同一类型的多个元素。

数组在 Java 中被定义为一个对象,具有固定的长度,并且可以容纳各种数据类型,包括原始数据类型和引用数据类型。

  • 数组是相同类型数据的有序集合;
  • 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成;
  • 每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问
  • 数组的下标从 0 开始

使用数组可以避免定义多个重复的同种类型变量。


三、数组声明和创建

在 Java 中,声明数组创建数组可以一起完成,也可以分开进行。

1. 数组声明

必须先声明数组变量,然后才能在程序中使用数组。声明数组变量的语法是指定数组类型和数组名称。下面是声明数组变量的语法:

// 首选方法
dataType[] arrayRefVar;// 另一种方法,效果相同
dataType arrayRefVar[];// 例如,声明一个整型数组变量
int[] myArray;

这两种形式都可以用来声明数组变量,它们是等价的,没有功能上的区别。

但通常建议使用 dataType[] arrayRefVar; 的形式,因为它更符合 Java 编程的传统风格,并且更容易让人理解。


2. 数组创建

在 Java 中,使用 new 操作符来创建数组是一种常见的做法。new 操作符用于在堆内存中动态创建对象或数组实例。

创建数组语法如下:

// 声明和创建同时完成
// arraySize 指定数组长度
dataType[] arrayRefVar = new dataType[arraySize];// 先声明,后创建
dataType[] arrayRefVar;
arrayRefVar = new dataType[arraySize];// 例如,创建一个长度为 5 的整型数组
// 可以存放 5 个 int 类型的数字
int[] myArray = new int[5];

在这个例子中,new 操作符创建了一个长度为 5 的整型数组,并将其引用赋值给了 myArray 变量。这个数组会在堆内存中被动态分配空间。

创建数组时需要指定数组的长度


四、数组简单使用

1. 数组索引

在 Java 中,数组索引用于访问数组中的元素。数组索引从 0 开始,因此第一个元素的索引是 0,第二个元素的索引是 1,以此类推。

可以使用方括号 [] 来指定数组中的索引位置。

示例代码如下:

int[] myArray = {10, 20, 30, 40, 50};// 访问数组中的第一个元素(索引为 0)
int firstElement = myArray[0]; // firstElement 的值为 10// 访问数组中的第三个元素(索引为 2)
int thirdElement = myArray[2]; // thirdElement 的值为 30

在这个例子中,myArray[0] 表示访问数组 myArray 中的第一个元素,而 myArray[2] 表示访问数组中的第三个元素。

需要注意的是,如果尝试访问超出数组范围的索引位置,将会导致 ArrayIndexOutOfBoundsException 异常。因此,在使用数组时应当确保索引值在合法的范围内。


2. 数组长度

在 Java 中,可以使用数组的 length 属性来获取数组的长度。这个属性返回数组中元素的数量,即数组的大小。

示例代码如下:

// 创建并初始化数组
int[] myArray = {10, 20, 30, 40, 50};// 获取数组的长度,即 5
int arrayLength = myArray.length; 

在这个例子中,myArray.length 返回数组 myArray 中元素的数量,即 5。

  • length 是数组的属性,而不是方法,因此不需要使用括号。
  • 这个属性对于确定数组的大小,以及遍历数组非常有用。
  • 数组的长度是固定的,一旦创建了数组并分配了空间,就不能再改变它的长度。

3. 数组初始化

数组的初始化可以分为静态初始化动态初始化两种方式。

其中,动态初始化包含默认初始化。

静态初始化

在静态初始化中,可以在声明数组的同时为其赋初值。它的语法简洁,适用于已经知道数组初始值的情况。

静态初始化时,不需要指定数组的大小,编译器会根据提供的初始值自动确定数组的长度。

普通类型的静态初始化,示例代码如下:

// 声明并静态初始化一个整型数组
int[] myArray = {10, 20, 30, 40, 50};

在这个例子中,myArray 是一个整型数组,它包含了 5 个元素,并且每个元素的值分别为10、20、30、40 和 50。


引用类型的静态初始化

静态初始化对于引用类型的数组也同样适用,不需要显式指定数组的大小,编译器会根据提供的初始值自动确定数组的长度。

对于引用类型的数组,静态初始化方式与基本类型数组类似。可以在声明数组时直接为其赋予初始值,示例代码如下:

// 声明并静态初始化一个字符串数组
String[] myArray = {"apple", "banana", "orange"};

在这个示例中,myArray 是一个字符串数组,包含了3个元素,分别是 “apple”、“banana” 和 “orange”。


引用其他类的对象

如果想要在静态初始化数组时引用其他类的对象,可以像下面这样做:

// 假设有一个名为 Person 的类
class Person {String name;int age;// 构造函数Person(String name, int age) {this.name = name;this.age = age;}
}// 在静态初始化中引用 Person 类的对象
Person[] people = {new Person("Alice", 25),new Person("Bob", 30),new Person("Charlie", 35)
};

在这个例子中:

  • people 是一个 Person 类型的数组,包含了三个 Person 对象;
  • 每个对象都通过 new Person(...) 创建并初始化;
  • 每个 Person 对象都有一个名字 name 和年龄 age 属性。

这样就可以在静态初始化数组时引用其他类的对象了。


动态初始化

动态初始化数组是在声明数组后,使用 new 关键字为数组分配内存空间,并为数组元素赋初始值的一种方式。

相比于静态初始化,动态初始化更加灵活,可以在运行时确定数组的大小以及元素的值。

需要注意的是,动态初始化的数组长度必须是一个非负的整数值。

示例代码如下:

// 声明一个整型数组
int[] myArray;// 使用 new 关键字动态初始化数组,并指定数组的长度为 5
myArray = new int[5];// 为数组元素赋值
myArray[0] = 10;
myArray[1] = 20;
myArray[2] = 30;
myArray[3] = 40;
myArray[4] = 50;

在这个例子中:

  • 首先声明了一个整型数组变量 myArray
  • 然后使用 new 关键字为其分配了一个长度为 5 的内存空间;
  • 之后,通过索引为数组元素赋值。

这种方式下,可以在运行时确定数组的大小,也可以根据具体需求为数组元素赋值。


默认初始化

在 Java 中,如果声明了一个数组但没有对其进行显式初始化,那么 Java 会对数组进行默认初始化。

默认初始化,也叫隐式初始化,是指给数组的元素赋予初始值,这个初始值取决于数组元素的类型。

需要注意的是,在使用数组之前,最好对其进行显式初始化,以避免出现意外的错误。

对于基本数据类型的数组,如果没有进行显式初始化,Java 会将数组的每个元素初始化为该基本数据类型的默认值

例如:

  • 整型数组的默认值为 0
  • 浮点型数组的默认值为 0.0
  • 布尔型数组的默认值为 false
  • 字符型数组的默认值为 ‘\u0000’(空字符)

示例代码如下:

// 整型数组的默认值为 0
int[] intArray = new int[3];
System.out.println(Arrays.toString(intArray)); // 输出:[0, 0, 0]// 浮点型数组的默认值为 0.0
double[] doubleArray = new double[3];
System.out.println(Arrays.toString(doubleArray)); // 输出:[0.0, 0.0, 0.0]// 布尔型数组的默认值为 false
boolean[] booleanArray = new boolean[3];
System.out.println(Arrays.toString(booleanArray)); // 输出:[false, false, false]// 字符型数组的默认值为 '\u0000'(空字符)
char[] charArray = new char[3];
System.out.println(Arrays.toString(charArray)); // 输出:空字符

对于引用数据类型的数组,默认值为 null

示例代码如下:

// 引用数据类型的数组,默认值为 null
String[] stringArray = new String[3];
System.out.println(Arrays.toString(stringArray)); // 输出:[null, null, null]

4. 数组元素赋值

在 Java 中,数组元素赋值的方式有两种:索引或初始化。

如果数组中的元素没有被赋初值,那么它的默认值为 0。

通过索引为数组元素赋值:

可以通过索引来为数组元素赋值。可以使用方括号 [] 加上索引来指定要赋值的元素位置,然后将新值赋给该位置。

示例代码如下:

int[] myArray = new int[5]; // 创建一个长度为5的整型数组// 为数组元素赋值
myArray[0] = 10;	// 下标从 0 开始,给第一个元素赋值为 10
myArray[1] = 20;
myArray[2] = 30;
myArray[3] = 40;
myArray[4] = 50;

在这个例子中,通过 myArray[索引] 的形式,为数组 myArray 中的每个元素赋了一个值。

索引从 0 开始,因此 myArray[0] 表示数组中的第一个元素,myArray[1] 表示第二个元素,以此类推。


初始化赋值:

如果已经在声明数组时进行了初始化,也可以在初始化的同时为数组元素赋值,例如:

// 创建并初始化数组
int[] myArray = {10, 20, 30, 40, 50}; 

这样的话,数组的每个元素都被赋了初始值。


五、案例分析

1. 计算数组所有元素和

要计算数组中所有元素的和,可以使用一个循环来遍历数组,并将每个元素的值加起来。

下面是一个计算数组所有元素和的示例代码:

int[] myArray = {10, 20, 30, 40, 50};
int sum = 0;// 遍历数组并计算所有元素的和
for (int i = 0; i < myArray.length; i++) {sum += myArray[i];
}System.out.println("数组所有元素的和为:" + sum);

在这个例子中:

  • 首先创建了一个整型数组 myArray,然后初始化了它。
  • 接下来,定义一个变量 sum 用来存储所有元素的和,并初始化为 0。
  • 然后,使用一个 for 循环遍历数组 myArray,将每个元素的值加到 sum 中。
  • 最后,输出数组所有元素的和。

六、内存分析

进行内存分析时,可以通过各种工具和技术来监视和分析程序的内存使用情况,包括但不限于 JVM 内置的工具(如 jvisualvm、jconsole)、第三方工具(如 VisualVM、YourKit Java Profiler)以及分析内存转储文件(Heap Dump)等。

1. Java 内存分析

在 Java 中进行内存分析通常涉及以下几个方面:

  • 堆内存(Heap Memory): 堆内存是用于存储对象实例的地方。
    • 所有通过 new 关键字创建的对象都存储在堆内存中,比如数组;
    • 可以被所有的线程共享,不会存放别的对象引用;
    • 堆内存的大小可以通过 JVM 启动参数进行设置;
    • 垃圾回收器负责在堆内存中回收不再使用的对象以释放内存空间。
  • 栈内存(Stack Memory): 栈内存用于存储方法调用和局部变量
    • 存放基本变量类型:包含这个基本类型的具体数值;
    • 引用对象的变量:存放这个引用在堆里面的具体地址;
    • 每个线程都有自己的栈内存,用于存储线程的方法调用栈和局部变量;
    • 方法调用时,方法的参数和局部变量会被分配到栈内存中;
    • 当方法执行完毕时,栈帧会被弹出栈,释放内存空间。
  • 方法区(Method Area): 方法区是存储类信息、常量、静态变量等数据的地方。
    • 可以被所有的线程共享;
    • 包含了所有的 class 和 static 变量;
    • 在方法区中存储的内容包括类的字节码、方法和字段信息、运行时常量池等;
    • 方法区在 JVM 启动时被分配,一般大小固定。

2. 数组创建过程

接下来绘图分析数组创建时,在内存中完成了哪些步骤。

代码中的流程

在代码中,我们完成了 3 个步骤:声明、创建、赋值。

// 1. 声明一个整型数组变量
int[] myArray;// 2. 创建一个长度为 5 的整型数组
int[] myArray = new int[5];// 3. 为数组元素赋值
myArray[0] = 10;	// 下标从 0 开始,给第一个元素赋值为 10
myArray[1] = 20;
myArray[2] = 30;
myArray[3] = 40;
myArray[4] = 50;

内存中体现

如图所示,在内存中,这 3 个步骤一一对应。

步骤 1:

声明一个整型数组变量 myArray,变量 myArray 被压入栈中。

// 1. 声明一个整型数组变量
int[] myArray;

在内存中的体现:

在这里插入图片描述


步骤 2:

创建一个长度为 5 的整型数组,在堆中开辟一片空间给它。空间中可以存放 5 个 int 型数据,索引下标从 [0] 开始。数组元素默认赋值为 0。

// 2. 创建一个长度为 5 的整型数组
int[] myArray = new int[5];

在内存中的体现:

在这里插入图片描述


步骤 3:

为数组元素赋值,给第一个元素赋值为 10,第二个为 20,依此类推。

// 3. 为数组元素赋值
myArray[0] = 10;	// 下标从 0 开始,给第一个元素赋值为 10
myArray[1] = 20;
myArray[2] = 30;
myArray[3] = 40;
myArray[4] = 50;

在内存中的体现:

在这里插入图片描述


七、总结

本文讲述 Java 数组相关知识,包括数组的声明和创建、以及数组的简单使用。此外,文章对 Java 内存进行分析,从内存的角度分析了数组创建的过程。

一些参考资料

狂神说 Java 零基础:https://www.bilibili.com/video/BV12J41137hu/
TIOBE 编程语言走势: https://www.tiobe.com/tiobe-index/
Typora 官网:https://www.typoraio.cn/
Oracle 官网:https://www.oracle.com/
Notepad++ 下载地址:https://notepad-plus.en.softonic.com/
IDEA 官网:https://www.jetbrains.com.cn/idea/
Java 开发手册:https://developer.aliyun.com/ebook/394
Java 8 帮助文档:https://docs.oracle.com/javase/8/docs/api/

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

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

相关文章

【Python文字识别】基于HyperLPR3实现车牌检测和识别(Python版本快速部署)

闲来无事&#xff0c;想复现一下网上的基于YOLO v5的单目测距算法。然后就突然想在这个场景下搞一下车牌识别&#xff0c;于是就有了这篇文章。今天就给大家分享基于HyperLPR3实现车牌检测和识别。 原创作者&#xff1a;RS迷途小书童 博客地址&#xff1a;https://blog.csdn.ne…

数据挖掘实战-基于CNN深度学习算法构建英文文本分类模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

阿里云API网关 产品的使用笔记

阿里云的产品虽多&#xff0c;还是一如既往的一用一个看不懂&#xff0c;该模块的文档依旧保持“稳定”发挥&#xff0c;磕了半天才全部跑通。 用阿里云API网关的原因是&#xff0c;在Agent中写插件调用API的时候&#xff0c;需要使用Https协议&#xff0c;又嫌搞备案、证书等事…

2024五一数学建模A题思路代码与论文分析

2024五一数学建模A题完整代码和成品论文获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/gyoz9ou5upvkv6nx?singleDoc# 2024五一数学建模A题钢板最优切割路径问题需要建立的模型和算法: 图论 最短路径算法(Dijkstra算法、Floyd算法等) 动态规划 网格化离散建模 …

链表的带环问题 链表的深度拷贝

1.1. 链表是否带环 代码很简单&#xff0c;最主要就是如何证明 首先判断链表是否带环&#xff0c;可以定义两个指针&#xff0c;一个快指针一个慢指针。快指针走两步&#xff0c;慢指针走一步一定会相遇吗&#xff1f;有没有可能会超过&#xff1f;假设进环的时候fast和slow的…

【翻译】REST API

自动伸缩 API 创建或更新自动伸缩策略 API 此特性设计用于 Elasticsearch Service、Elastic Cloud Enterprise 和 Kubernetes 上的 Elastic Cloud 的间接使用。不支持直接用户使用。 创建或更新一个自动伸缩策略。 请求 PUT /_autoscaling/policy/<name> {"rol…

【大模型学习】私有大模型部署(基础知识)

私有大模型 优点 保护内部隐私 缺点 成本昂贵 难以共享 难以更新 大模型底座 基础知识点 知识库 知识库是什么&#xff1f; 知识库的作用是什么&#xff1f; 微调 增强大模型的推理能力 AI Agent 代理&#xff0c;与内部大模型进行交互 开源 and 闭源 是否可以查…

40 生产者消费者模型

生产者消费者模型 概念 为何要使用生产者消费者模型&#xff0c;这个是用过一个容器解决生产者和消费的强耦合问题。生产者和消费者之间不需要通讯&#xff0c;通过阻塞队列通讯&#xff0c;所以生产者生产完数据之后不用等待消费者处理&#xff0c;直接扔给阻塞队列&#xf…

ue引擎游戏开发笔记(28)——实现第三人称越肩视角

1.需求分析 实现一个第三人称越肩视角 2.操作实现 1.思路&#xff1a;建立一个弹簧臂和摄像机&#xff0c;调整两者位置达到越肩效果。 2.直接在蓝图操作&#xff1a;添加摄像机和弹簧臂&#xff1a; 3.对弹簧臂勾选使用pawn控制旋转&#xff0c;并适当调整摄像机和弹簧臂位置…

Flask表单详解

Flask表单详解 概述跨站请求伪造保护表单类把表单渲染成HTML在视图函数中处理表单重定向和用户会话Flash消息 概述 尽管 Flask 的请求对象提供的信息足够用于处理 Web 表单&#xff0c;但有些任务很单调&#xff0c;而且要重复操作。比如&#xff0c;生成表单的 HTML 代码和验…

在智慧城市的建设中智能车载监控录像机发挥什么作用

引言 随着科技的快速发展&#xff0c;智慧城市的概念逐渐深入人心。在智慧城市的建设中&#xff0c;智能车载监控录像机作为一种重要的技术工具&#xff0c;发挥着越来越重要的作用。本文将从多个方面探讨智能车载监控录像机在智慧城市建设中的作用。 一、智能车载监控录像机概…

计算机视觉大项目(1)-水果分级系统

项目来源&#xff1a;河北大学计算机视觉课程-杨老师. 一共有四个标题&#xff0c;本篇博客只完成前两问。 目录 实验目的: 实验内容&#xff1a; 实验步骤&#xff1a; 1.水果图像的分割 >掩膜图像Mask 是什么&#xff1f; >改进:去除反光部分的影响 2&#xf…

npm install digital envelope routines::unsupported解决方法

目录 一、问题描述二、问题原因三、解决方法 一、问题描述 执行命令 npm install 报错&#xff1a;digital envelope routines::unsupported 二、问题原因 Node.js 17 版本引入了 OpenSSL 3.0&#xff0c;它在算法和密钥大小方面实施了更为严格的限制。这一变化导致 npm 的升…

excel怎么删除条件格式规则但保留格式?

这个问题的意思就是要将设置的条件格式&#xff0c;转换成单元格格式。除了使用VBA代码将格式转换外&#xff0c;还可以用excel自己的功能来完成这个任务。 一、将条件格式“留下来” 1.设置条件格式 选中数据&#xff0c;点击开始选项卡&#xff0c;设置条件格式&#xff0…

Qt绘图与图形视图之移动鼠标手动绘制任意多边形的简单介绍

往期回顾 【QT进阶】Qt线程与并发之QtConcurrent返回值与run方法的参数说明-CSDN博客 Qt绘图与图形视图之绘图技术知识点的简单介绍-CSDN博客 Qt绘图与图形视图之常见图形、路径、文字、图片的绘制介绍-CSDN博客 Qt绘图与图形视图之移动鼠标手动绘制任意多边形的简单介绍 一、…

【深度学习】第一门课 神经网络和深度学习 Week 4 深层神经网络

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;深度学习 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对…

临期食品店会员配送商城小程序的作用是什么

临期商品以量大价格低/即时性吸引市场大量客户&#xff0c;很多地区都有门店&#xff0c;行业也不乏连锁/加盟品牌&#xff0c;食品受众广且区域拓展性强&#xff0c;商家可线上销售提升营收和解决线下难题。 商家运用【雨科】平台搭建临期食品店商城小程序&#xff0c;对生意…

PyTorch如何修改模型(魔改)

文章目录 PyTorch如何修改模型&#xff08;魔改&#xff09;1.修改模型层(模型框架⭐)1.1通过继承修改模型1.2通过组合修改模型(重点学&#x1f440;)1.3通过猴子补丁修改模型 2.添加外部输入3.添加额外输出参考 PyTorch如何修改模型&#xff08;魔改&#xff09; 对模型缝缝补…

【算法刷题 | 动态规划02】5.02(不同路径、不同路径||、整数拆分、不同的二叉搜索树)

文章目录 5.不同路径5.1题目5.2解法一&#xff1a;深度搜索5.2.1深度搜索思路5.2.2代码实现 5.3解法二&#xff1a;动规5.3.1动规思路5.3.2代码实现 6.不同路径||6.1题目6.2解法&#xff1a;动规6.2.1动规思路&#xff08;1&#xff09;dp数组以及下标含义&#xff08;2&#x…

基于Springboot的交流互动系统

基于SpringbootVue的交流互动系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 帖子信息 聚会信息 后台登录 后台管理首页 用户管理 帖子分类管理 帖子信息…