【JavaSE篇】——数组的定义与使用
目录
本章的目标:
🎈数组的基本概念
🍭创建数组
🍭数组的初始化
🍭数组的使用
👉数组中元素访问
👉遍历数组
🎈数组是引用类型
🍭初始JVM的内存分布
🍭基本类型变量与引用类型变量的区别
👉基本数据类型变量
👉引用数据类型变量
🚩再谈引用变量
🍭认识null
🎈数组的应用场景
🍭保存数据
🍭作为函数的参数
🍭作为函数的返回值
🎈二维数组
🍭创建二维数组
🍭数组转为字符串
🍭二维数组的解析
🍭遍历
🎓不规则的二维数组
本章的目标:

🎈数组的基本概念

- 1. 数组中存放的元素其类型相同
- 2. 数组的空间是连在一起的
- 3. 每个空间有自己的编号,其实位置的编号为0,即数组的下标。
🍭创建数组
T[] 数组名 = new T[N];T:表示数组中存放元素的类型
T[]:表示数组的类型
N:表示数组的长度 public static void main(String[] args) {int[] array1=new int[5]; //创建一个可以容纳5个int类型元素的数组double[] array2=new double[5];// 创建一个可以容纳5个double类型元素的数组float[] array3=new float[5];// 创建一个可以容纳5个float类型元素的数组} 我们可以对比c语言的创建数组,int arr[N]={0,1,2};
java创建数组是 int[] arr=new int[N];
其实我们更可以看到java 更能理解,因为arr是数组名,它是Int[]类型是数组arr的类型,而c语言中arr是数组名,int是数组里面的值的类型,并不是数组的类型,数组的类型是int[]。
该种定义方式不太友好,容易造成数组的类型就是 int 的误解[] 如果在类型之后,就表示数组类型,因此 int[] 结合在一块写意思更清晰。
🍭数组的初始化
静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定
语法格式: T[] 数组名称 = {data1, data2, data3, ..., datan};
int[] array1 = new int[]{0,1,2,3,4,5,6,7,8,9};//静态 double[] array2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};//静态 String[] array3 = new String[]{"hell", "Java", "!!!"};//静态
int [] array = new int [ 10 ];int[] array1 = new int[10];//动态 double[] array2 = new double[10];//动态 String[] array3 = new String[10];//动态
【注意事项】
- 静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
- 注意:在数组中可以通过 数组对象.length 来获取数组的长度
- 静态初始化时, {}中数据类型必须与[]前数据类型一致。
- 静态初始化可以简写,省去后面的new T[]。
int[] array={1,2,3,4};//静态初始化可以省略new T[];
- 静态和动态初始化也可以分为两步,但是省略格式不可以
int[] array; array=new int[10];//静态初始化的拆分 int[] array1; array1=new int[]{1,2,3,4};//动态初始化的拆分
这里就不能省略new.
- 如果没有对数组进行初始化,数组中元素有其默认值
- 如果数组中存储元素类型为基类类型,默认值为基类类型对应的默认值
- 如果数组中存储元素类型为引用类型,默认值为null
在一般实际的做题目中,我们用到的最多的是int[] arr=new int[N],因为这样会给默认值,然后开辟了N个长度的数组,然后我们依次赋值。
🍭数组的使用
👉数组中元素访问

【注意事项】1.数组是一段连续的内存空间,因此 支持随机访问,即通过下标访问快速访问数组中任意位置的元素2. 下标从 0 开始,介于 [0, N )之间不包含 N , N 为元素个数,不能越界,否则会报出下标越界异常。
所以访问数组的下标不能到array[array.length],不能取到长度。
👉遍历数组
所谓 "遍历" 是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作,比如:打印。

- for-i遍历数组
- 使用 for-each 遍历数组
俩者的不同之处是
- for-i 可以访问到下标,如果对数组中的第二位置的值+1,那么就可以用for-i,则不可以使用for-each。
- for-each不可以访问到下标,不需要取到特定的值即可用。
- 借用Java本身提供的一些方法来实现数组的打印
这里首先需要介绍一个 工具类(可以理解为C语言里面的头文件):Arrays
其主要作用是:帮助对数组进行一个操作(详情可查找帮助手册)
我们可以再成长手册或者这里可以看到有很多类型的数组,这里就表示重载,后面我会详细说。现在可以理解为哪种数组类型就调用哪个哪个。这里是int类型那么我们就toString(int[] a).
这里用数组转换成字符串形式,我们可以看到加了[],为啥会加[]我们可以再toString中ctrl+鼠标左键,进入源码中查看
现在我们并不能完整的看懂这段底层实现的代码,我们可以根据现象直接实现,[1,2,3]这种形式,我们自己实现一下。
public static void myString(int[] array){System.out.print("[");for(int i=0;i<array.length;i++){if(i!=array.length-1) {System.out.print(array[i]+",");}else System.out.print(array[i]);}System.out.print("]");}public static void main(String[] args) {int[] array={1,2,3,4};myString(array);}
🎈数组是引用类型

🍭初始JVM的内存分布

而现在我们只简单关心堆 和 虚拟机栈这两块空间,后序JVM中还会更详细介绍。
- 虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含 有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一 些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。
- 堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2, 3} ),堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁。
🍭基本类型变量与引用类型变量的区别
- 基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
- 引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址
👉基本数据类型变量


👉引用数据类型变量
我们大标题是数组是引用数据类型 ,我们就根据数据来阐述。

我们可以通过ox77的地址找到对象。这里的array是变量(引用变量,存储的是对象的地址),引用(指向)一个数组对象。这个数组对象在堆区,我们需要存储这个对象的地址,所以array这个变量存储了,叫做引用变量。

🚩再谈引用变量
我们现在给引用变量修改值或者一个数组给另一个数组是如何运行的。
场景1

这个底层是如何实现的呢?

array引用变量存储的是数组对象的首元素的地址,都初始化成默认值0,然后我们对下标为0和下标为1的位置对应的值进行改变,还是对堆上的空间进行改变,array并没有新开一个空间。所以最终array前后打印的值是不一样的。
场景2

这个场景可能有些迷了,array1和array2该输出什么呢?我们一步一步的分析。
场景3



由于array1的空间给了array2,那么对array1的改变,array2也改变了。
场景四

🍭认识null
null 在 Java 中表示 "空引用" , 即:一个不指向对象的引用。


🎈数组的应用场景

🍭保存数据
public static void main(String[] args) {int[] array = {1, 2, 3};for(int i = 0; i < array.length; ++i){System.out.println(array[i] + " ");}
} 🍭作为函数的参数

我们调用func1,首先a引用变量存放ox13的地址,再调用这个函数是arr也指向a的空间,然后arr开辟一个空间,地址是0x99,然后arr指向了地址为0x99的空间,但是a指向的空间并没有改变。所以打印的结果还是1,2,3,4。
调用func2呢?

a引用变量存的是0x13的地址,指向了一块空间,调用func2,也指向了这块空间,然后arr对0位置进行改变,就是相当于对这片空间的下标为0的位置改变。
上面俩种调用
- 第一种修改了自己的指向(因为自己开了一块空间),自己是形参,所以对自己的修改并不会影响实参的修改。
- 第二种修改指向的对象里的值,所以改变指向的对象里面的值,就会改变实参的值。
这下面很明显是修改指向的对象里的值,自己没有开空间,所以改变了实参的值。

总结: 所谓的 "引用" 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实 只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大).
🍭作为函数的返回值

🎈二维数组
🍭创建二维数组
public static void main(String[] args) {int[][] arr1=new int[2][3];int[][] arr2=new int[][]{{1,2,3},{4,5,6}};int[][] arr3={{1,2,3},{4,5,6}};}
java中默认值依旧是0;
🍭数组转为字符串
依旧是Arrays类里的方法


🍭二维数组的解析
相当于俩行三列的数组。
🍭遍历
for-i

for-each
for (int[] array:arr1) {for(int x:array){System.out.print(x+" ");}System.out.println();} 
🎓不规则的二维数组
int[][] arr=new int[2][]; 没有列的不规则的二维数组。


它的好处是可以随机设置每一行的长度。

今天很讨厌张老师
相关文章:
【JavaSE篇】——数组的定义与使用
目录 本章的目标: 🎈数组的基本概念 🍭创建数组 🍭数组的初始化 🍭数组的使用 👉数组中元素访问 👉遍历数组 🎈数组是引用类型 🍭初始JVM的内存分布 …...
HCS 华为云Stack产品组件
HCS 华为云Stack产品组件 Cloud Provisioning Service(CPS) 负责laas的云平台层的部署和升级是laas层中真正面向硬件设备,并将其池化软件化的部件。 Service OM 资源池(计算/存储/网络)以及基础云服务(ECS/EVS/PC)的管理工具。 ManageOne ManageOne包括服务中心…...
四、MySQL之增删改
一、插入数据 1.1、VALUES的方式添加 使用这种语法一次只能向表中插入一条数据。 1.1.1、为表的所有字段按默认顺序插入数据 INSERT INTO 表名 VALUES (value1,value2,....);// 值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相…...
MQ面试题之Kafka
前言 前文介绍了消息队列相关知识,并未针对某个具体的产品,所以略显抽象。本人毕业到现在使用的都是公司内部产品,对于通用产品无实际经验,但是各种消息中间件大差不差,故而本次选择一个相对较熟悉的Kafka进行详细介绍…...
2023年CSDN年底总结-独立开源创作者第一年
2023年最大的变化,就是出来创业,当独立开源创作者,这一年发起SolidUI开源项目,把知乎重新开始运营起来。CSDN粉丝破万,CSDN博客专家和AI领域创作者。 2023年年度关键词:创业 https://github.com/CloudOrc…...
hardware simulation——编译框架优化
目录 介绍 修改前的最新代码和框架 学习和修改 最终版本 介绍 -------------------------------------------------------------------------------------------------------------------------- https://www.cnblogs.com/wittxie/p/9836097.html 上次那个虽然能完成基本…...
Leetcode刷题笔记题解(C++):1971. 寻找图中是否存在路径
思路: 1.建立图集,二维数组,path[0]里面存放的就是与0相连的节点集合 2.用布尔数组来记录当前节点是否被访问过,深度优先会使用到 3.遍历从起点开始能直接到达的点(即与起点相邻的点),判断那…...
ARM常用汇编指令
文章目录 前言一、处理器内部数据传输指令MOV: 将数据从一个寄存器复制到另一个寄存器。MRS: 将特殊寄存器(CPSR,SPSR)中的数据传给通用寄存器。MSR: 将通用寄存器中的数据传给特殊寄存器(CPSR,SPSR)。 二、存储器访问指令LDR:用于从内存中加…...
kali系统入侵电脑windows(win11系统)渗透测试,骇入电脑教学
本次渗透测试将使用kali虚拟机(攻击机)对本机(靶机)进行入侵并监控屏幕 声明:本篇仅仅是将本机作为靶机的一次简易渗透测试,实际情况中基本不可能出现如此简单的木马骇入(往往在上传木马时就被防…...
力扣hot100 矩阵置零 标识位
Problem: 73. 矩阵置零 文章目录 思路复杂度Code 思路 👨🏫 参考 复杂度 时间复杂度: O ( n m ) O(nm) O(nm) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public static void setZeroes(int[][] matrix) {int n matrix.length;i…...
Android App开发-简单控件(3)——常用布局
3.3 常用布局 本节介绍常见的几种布局用法,包括在某个方向上顺序排列的线性布局,参照其他视图的位置相对排列的相对布局,像表格那样分行分列显示的网格布局,CommonLayouts以及支持通过滑动操作拉出更多内容的滚动视图。 3.3.1 线…...
Linux使用二进制包安装MySQL
目录 一、软件包下载 二、上传软件包到Linux根目录 1、使用xftp将软件包上传到根目录 2、解压缩 三、准备工作 四、初始化软件 五、设置MySQL的配置文件 六、配置启动脚本 一、软件包下载 官网下载:MySQL :: Download MySQL Community Server 二、上传软件…...
【vue3-pbstar-admin】一款基于vue3和nodejs的简洁后台管理系统
Vue3-pbstar-admin 是一个简洁的后台解决方案,提供了基础的用户体系和页面接口权限配置,方便用户进行自定义开发,避免不必要的代码冗余。该方案结合了 Vue3、Element-Plus、Pinia 和 Vite 等先进技术,实现高效的页面布局、状态管理…...
顺序表和链表【数据结构】【基于C语言实现】【一站式速通】
目录 顺序表 顺序表的优点 顺序表的实现 1.结构体的定义 2.初始化数组 3.插入数据 4.其余接口函数的实现 5.释放内存 顺序表的缺陷 单向链表 单向链表的优点 单向链表的实现 1.链表的定义 2.链表的初始化 3.其余接口函数的实现 5.释放内存 单向链表的缺陷 双…...
SpringBoot 有什么优点?
Spring Boot 是一个用于简化和加速 Spring 框架应用程序开发的项目。它构建在 Spring 框架之上,提供了一种快速开发、简化配置和集成的方式。以下是 Spring Boot 的一些优点: 1、简化配置: Spring Boot 使用约定大于配置的理念,通…...
扫地机器人(二分算法+贪心算法)
1. if(robot[i]-len<sweep)这个代码的意思是——如果机器人向左移动len个长度后,比现在sweep的位置(现在已经覆盖的范围)还要靠左,就是覆盖连续不起来,呢么这个len就是有问题的,退出函数,再…...
Unity中创建Ultraleap 3Di交互项目
首先,创建新的场景 1、创建一个空物体,重命名为【XP Leap Provider Manager】,并在这个空物体上添加【XR Leap Provider Manager】 在物体XP Leap Provider Manager下,创建两个子物体Service Provider(XR)和Service Provider(…...
【Matlab】音频信号分析及FIR滤波处理——凯泽(Kaiser)窗
一、前言 1.1 课题内容: 利用麦克风采集语音信号(人的声音、或乐器声乐),人为加上环境噪声(窄带)分析上述声音信号的频谱,比较两种情况下的差异根据信号的频谱分布,选取合适的滤波器指标(频率指标、衰减指标),设计对应的 FIR 滤波器实现数字滤波,将滤波前、后的声音…...
C数据类型
目录 1. 数据类型分类 2. 整数类型 3. 浮点类型 4. void 类型 5. 类型转换 1. 数据类型分类 在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。 C 中…...
JAVA和Go的不解之缘
JAVA和Go的不解之缘 Java和Go是两种不同的编程语言,它们在语法、特性和设计理念上存在一些明显的异同之处。 1. 语法和特性: Java是一种面向对象的语言,而Go则是一种面向过程的语言。Java拥有类、继承、接口等传统的面向对象特性ÿ…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
FTXUI::Dom 模块
DOM 模块定义了分层的 FTXUI::Element 树,可用于构建复杂的终端界面,支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...
Ray框架:分布式AI训练与调参实践
Ray框架:分布式AI训练与调参实践 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 Ray框架:分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...









我们可以再成长手册或者这里可以看到有很多类型的数组,这里就表示重载,后面我会详细说。现在可以理解为哪种数组类型就调用哪个哪个。这里是int类型那么我们就toString(int[] a).
现在我们并不能完整的看懂这段底层实现的代码,我们可以根据现象直接实现,[1,2,3]这种形式,我们自己实现一下。