数组的基本用法
什么是数组
数组本质上就是让我们能 “批量” 创建相同类型的变量.
数组的创建
// 动态初始化
数据类型[] 数组名称 = new 数据类型 [长度] { 初始化数据 };
// 静态初始化
数据类型[] 数组名称 = { 初始化数据 };
数组的使用:
获取数组和访问元素
public class Solution {
public static void main(String[] args) {
int[] arr = {1,2,3};
//获取数组长度
System.out.println("length = " + arr.length);
//访问数组元素
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
arr[2] = 50;
System.out.println(arr[2]);
}
}
使用 [ ] 按下标取数组元素. 需要注意, 下标从 0 开始计数,既可以读取数据也可以修改数据。
下标访问操作不能超出有效范围 [0, length - 1] , 如果超出有效范围, 会出现下标越界异常。
数组的遍历:
public class Solution {
public static void main(String[] args) {
int[] arr = {9,5,2,7,3,6,8,1};
for(int i = 0;i < arr.length;i++) {
System.out.println(arr[i]);
}
}
}
使用 for-each 遍历数组
public class Solution {
public static void main(String[] args) {
int[] arr = {9,5,2,7,3,6,8,1};
for(int i : arr) {
System.out.println(i);
}
}
}
数组作为方法的参数
public class Solution {
public static void main(String[] args) {
int[] arr = {9,5,2,7,3,6,8,1};
printArray(arr);
}
public static void printArray(int a[]) {
for(int i : arr) {
System.out.println(i);
}
}
}
int[ ] a 是函数的形参, int[ ] arr 是函数实参.
引用类型
- 参数传内置类型
public static void main(String[] args) {
int num = 0;
func(num);
System.out.println("num = " + num);
}
public static void func(int x) {
x = 10;
System.out.println("x = " + x);
}
基本类型数据的参数传递就是传值,对形参的修改是不会影响到实参。
- 参数传数组类型
public class Solution {
public static void func(int[] a) {
a[0] = 10;
System.out.println("a[0] = " + a[0]);
}
public static void main(String[] args) {
int[] arr = {1, 2, 3};
func(arr);
System.out.println("arr[0] = " + arr[0]);
}
}
我们发现:在函数内部修改数组内容, 函数外部也发生改变。
原因是此时数组名 arr 是一个 “引用” . 当传参的时候, 是按照引用传参。
什么是引用:相当于一个低配版指针
创建一个引用只是相当于创建了一个很小的变量, 这个变量保存了一个整数, 这个整数表示内存中的一个地址。
总结: 所谓的 “引用” 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只
是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大).
JVM内存区域划分
- 局部变量和引用保存在栈上, new 出的对象保存在堆上.
- 堆的空间非常大, 栈的空间比较小.
- 堆是整个 JVM 共享一个, 而栈每个线程具有一份(一个 Java 程序中可能存在多个栈).
数组练习
参见以前一篇博客
https://blog.youkuaiyun.com/weixin_44945537/article/details/100999613?utm_source=app