java中SE数组的定义与使用(上)

本文详细讲解了Java中数组的基础概念,包括数组的创建(静态初始化、动态初始化和固定长度数组)、使用技巧(元素修改、遍历与访问控制)、作为方法参数的传递机制,以及引用类型的解释和null概念。此外,还介绍了JVM内存区域和数组作为引用类型的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java中数组的定义与使用

1、数组的基本用法
1.1、什么是数组???
数组本质上就是让我们能 “批量” 创建相同类型的变量.
例如:
如果需要表示两个数据, 那么直接创建两个变量即可 int a; int b
如果需要表示五个数据, 那么可以创建五个变量 int a1; int a2; int a3; int a4; int a5;
但是如果需要表示一万个数据, 那么就不能创建一万个变量了. 这时候就需要使用数组, 帮我们批量创建.
注意事项: 在 Java 中, 数组中包含的变量必须是 相同类型。

1.2、数组的创建
数组创建的三种方式:
1、静态初始化 :数组类型[ ]数组名 = {数据初始化}//虽然没有new,但是也是对象
2、动态初始化:数组类型[ ] 数组名 = new 数据类型 [ ] {数据初始化};
3、数组类型[ ]数组名 = new 数据类型 [n] ;
new 是一个关键字,实例化对象。意味着java中数组是一个对象
定义数组的时候[ ]中不能写具体的数字
在这里插入图片描述
注意事项: 静态初始化的时候, 数组元素个数和初始化数据的格式是一致的

1.2、数组的使用
数组的下标是从0开始的
在这里插入图片描述

1.2.1、改变数组中某一个与元素的内容:
在这里插入图片描述
通过数组的下标可以得到数组中的元素。

1.2.2、打印数组中所有的元素
在这里插入图片描述
通过for循环得到每个元素的下标,就得到了每个元素,将每个元素打印出来
arr.length 中的 .length 可以求数组重元素的个数

在这里插入图片描述
Arrays.toString(数组名)将数组arr一字符串的形式打印出来

1.2.3、访问越界
下标访问操作不能超出有效范围 [0, length - 1] , 如果超出有效范围, 会出现下标越界异常
当超过时就会抛异常 java.lang.ArrayIndexOutOfBoundsException
在这里插入图片描述
1.2.4、遍历数组
所谓 “遍历” 是指将数组中的所有元素都访问一遍, 不重不漏. 通常需要搭配循环语句
for循环:
在这里插入图片描述
for-each循环:for(数据类型 i : 数组名){ }
for(int x : arr) -->
在这里插入图片描述

2、数组作为方法的参数
2.1、基本用法
在这里插入图片描述
代码中prin(arr)中的 arr是实参
void prin (int[ ] arr)中的int[ ] arr是形参

2.2、理解引用类型(这一点是非常重要的)
在这里插入图片描述
可以看到我们修改形参的值,却不影响实参的值
如果我们将数组作为参数传给形参,再看一下结果:
在这里插入图片描述
这里看到, 在函数内部修改数组内容, 函数外部也发生改变.
此时数组名 arr 是一个 “引用” . 当传参的时候, 是按照引用传参,引用存储就是地址,这又该怎么理解呢???

首先要从内存说起。
如何理解内存?
内存就是指我们熟悉的 “内存”. 内存可以直观的理解成一个宿舍楼. 有一个长长的大走廊, 上面有很多房间.
每个房间的大小是 1 Byte (如果计算机有 8G 内存, 则相当于有 80亿 个这样的房间).
每个房间上面又有一个门牌号, 这个门牌号就称为 地址

那么啥又是引用?
什么是引用?
引用相当于一个 “别名”, 也可以理解成一个指针.
创建一个引用只是相当于创建了一个很小的变量, 这个变量保存了一个整数, 这个整数表示内存中的一个地址

我们先看两个代码,看一下在内存是怎么存储的:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

2.3、认识null
null 在 Java 中表示 “空引用” , 也就是一个无效的引用
null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操
作. 一旦尝试读写, 就会抛出 NullPointerException.
注意: Java 中并没有约定 null 和 0 号地址的内存有任何关联

2.4、JVM 内存区域划分
JVM 内存区域划分:
在这里插入图片描述
在这里插入图片描述
1、程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址.
2、虚拟机栈(JVM Stack): 重点是存储局部变量表(当然也有其他信息). 我们刚才创建的 int[] arr 这样
的存储地址的引用就是在这里保存.
3、本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是
Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的.
4、堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new
int[]{1, 2,3} )
5、方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后
的代码等数据. 方法编译出的的字节码就是保存在这个区域.
6、运行时常量池(Runtime Constant Pool): 是方法区的一部分, 存放字面量(字符串常量)与符号引用.
(注意 从 JDK1.7 开始, 运行时常量池在堆上)

Native 方法:
JVM 是一个基于 C++ 实现的程序. 在 Java 程序执行过程中, 本质上也需要调用 C++ 提供的一些函数进行和作系统底层进行一些交互. 因此在 Java 开发中也会调用到一些 C++ 实现的函数.
这里的 Native 方法就是指这些 C++ 实现的, 再由 Java 来调用的函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Später321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值