【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拥有类、继承、接口等传统的面向对象特性ÿ…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...









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