![博主头像](https://i-blog.csdnimg.cn/blog_migrate/a8799c302a9cb2bd852e638c616ab034.png)
🌠个人主页 : @赶路人- -
🌌个人格言 :要努力成为梧桐,让喜鹊在这里栖息。
要努力成为大海,让百川在这里聚积。
1.数组的基本用法
1.1 什么是数组
在 Java 中,数组是一种用于存储相同类型数据元素的数据结构。数组是固定大小的,一旦创建,其大小就无法更改。
1.2 创建数组
// 动态初始化
数据类型[] 数组名称 = new 数据类型 [申请元素个数];
数据类型[] 数组名称 = new 数据类型 [] { 初始化数据 };
// 静态初始化
数据类型[] 数组名称 = { 初始化数据 };
//示例
int[] a = new int[10];
//最后元素下标为9
char[] a = new char[]{'a', 'b', 'c'};
double[] a = {1.1, 1.2, 1.3};
注意事项:
静态初始化的时候, 数组元素个数和初始化数据的格式是一致的.
1.3数组的使用
获取数组长度&访问元素
int[] arr = {1, 2, 3};
// 获取数组长度
System.out.println("length: " + arr.length); // 执行结果: 3
// 访问数组中的元素
System.out.println(arr[1]); // 执行结果: 2
System.out.println(arr[0]); // 执行结果: 1
arr[2] = 100;
System.out.println(arr[2]); // 执行结果: 100
- 使用 arr.length 能够获取到数组的长度. . 这个操作为成员访问操作符. 后面在面向对象中会经常用到
- 使用 [ ] 按下标取数组元素. 需要注意, 下标从 0 开始计数
- 使用 [ ] 操作既能读取数据, 也能修改数据
- 下标访问操作不能超出有效范围 [0, length - 1] , 如果超出有效范围, 会出现下标越界异常
2.数组作为方法的参数
2.1基本用法
打印数组内容
public static void main(String[] args){
int[] arr = {1,2,3};
printArray(arr);
}
public static void printArray(int[] a){
for(int x: a){
System.out.println(x);
}
}
//执行结果
1
2
3
在上面的代码中,int[ ] a 是函数的形参 ,int[ ] arr 是函数的实参。
如果需要获取数组的长度可以使用 数组名.length 。
2.2理解引用类型(重点/难点)
参数传内置类型
public static void main(String[] args){
int num = 0;
fun(num);
System.out.println("num = " + num);
}
public static void func(int x){
x = 10;
System.out.println("x =" + x);
}
//执行结果
x = 10
num = 0
可以发现,改变形参x的值,不会改变实参num的值。
因为形参是在内存中新申请的一个空间,和实参不在一个空间。
参数传数组类型
public static void main(String[] args){
int[] arr = {1,2,3};
fun(arr);
System.out.println("arr[0]" + arr[0]);
}
public static void fun(int[] a){
a[0] = 100;
System.out.println("a[0]" + a[0]);
}
//执行结果
a[0] = 100
arr[0] =100
我们发现, 在函数内部修改数组内容, 函数外部也发生改变.
此时数组名 arr 是一个 “引用” . 当传参的时候, 是按照引用传参.
2.3java栈与堆
虚拟机栈 和 堆
- 局部变量和引用保存在栈上, new 出的对象保存在堆上.
- 堆的空间非常大, 栈的空间比较小.
- 堆是整个 JVM 共享一个, 而栈每个线程具有一份(一个 Java 程序中可能存在多个栈).
3.数组作为方法的返回值
写一个方法, 将数组中的每个元素都 * 2
public static void main(String[] args){
int[] arr = {1,2,3};
transform(arr);
}
public static void transform(int[] arr){
for(int i = 0; i < arr.length;i++){
arr[i] = arr[i] * 2 //arr[i] *= 2;
}
}
上述代码固然可行,但是修改了原来的数组,有时候我们不想改动原来数组,可以在方法内部创建一个新的数组,并由方法返回出来。
public static void main(String[] args){
int[] arr = {1,2,3};
int[] output = transform(arr);
}
public static int[] transform(int[] arr){
int[] ret = new int[arr.length];
for(int i = 0; i < arr.length;i++){
ret[i] = arr[i] * 2;
}
return ret;
}
这样就不会修改到原来的数组。
此外数组是引用类型, 返回的时候只是将这个数组的首地址返回给函数调用者, 没有拷贝数组内容, 从而比较高效。