Java数组的定义和应用

这篇博客详细介绍了Java中的数组,包括数组的基本用法、创建方式、作为方法参数的传递、作为返回值以及二维数组的定义和遍历。内容涵盖了动态和静态初始化数组、数组长度的获取、数组元素的访问、遍历数组的方法以及数组在方法调用中的引用传递特性。此外,还讨论了null在Java中的含义以及如何处理数组的空引用问题。
摘要由CSDN通过智能技术生成

1. 数组基本用法

   1.1 什么是数组

   1.2 创建数组

   1.3 数组的使用

2. 数组作为方法的参数

    2.1 基本用法

   2.2 理解引用类型

   2.3 认识null

3. 数组作为方法的返回值

4. 二维数组


1. 数组的基本用法

1.1 什么是数组

如果需要表示两个数据, 那么直接创建两个变量即可 int a; int b;
如果需要表示五个数据, 那么可以创建五个变量 int a1,a2,a3,a4,a5;
但是如果需要表示一万个数据, 那么就不能创建一万个变量了. 这时候就需要使用数组, 帮我们批量创建.

数组是存储一组相同数据类型的数据的集合,或者说,数组能帮我们“批量”创建相同的变量。

1.2 创建数组

Java中数组共有3种创建方式:

//动态初始化
数据类型[] 数组名称 = new 数据类型 [] { 初始化数据 };
int[] arr = new int[]{1, 2, 3};
//静态初始化
数据类型[] 数组名称 = { 初始化数据 };
int[] arr = {1,2,3};
//或:
数据类型[] 数组名称 = new 数据类型[数组长度];
int[] arr = new int[3];

1.3 数组的使用

使用.length来确定数组长度:

int[] arr = new int[]{1,2,3,4,5};
System.out.println(arr.length);
//结果:
5

结果表明arr数组的长度为5.

访问数组中的元素:

int[] arr = new int[]{1,2,3,4,5};
System.out.println(arr[4]);
//结果:
5

注意:Java中数组下标从0开始,数组长度为length,即访问下标的范围[0,length-1],当访问的下标超过该范围时,会出现下标越界异常,如:

int[] arr = new int[]{1,2,3,4,5};
System.out.println(arr[-1]);

结果:
请添加图片描述
该结果表明arr数组的-1下标越界。

数组的遍历:
所谓 “遍历” 是指将数组中的所有元素都访问一遍, 不重不漏. 通常需要搭配循环语句.

使用for循环遍历数组:

int[] arr = {1, 2, 3, 4, 5};
for (int i = 0; i < arr.length; i++) {
	System.out.print(arr[i]+" ");
}
//结果:
1 2 3 4 5 

使用for each循环遍历数组:

int[] arr = {1, 2, 34,5};
for (int x : arr) {
	System.out.print(x+" ");
}
//结果:
1 2 3 4 5 

for each循环是for循环的另一种使用方式,能够更方便地完成对数组的遍历,可以避免循环条件和更新语句写错,但for each循环无法获得数组的下标。

2. 数组作为方法的参数

2.1 基本用法

将main方法中的数组传到print方法并进行输出:

public static void main(String[] args) {
	int[] arr = {1, 2, 3, 4, 5};
	print(arr);
}
public static void print(int[] a) {
	for (int x : a) {
		System.out.print(x+" ");
	}
}
//结果:
1 2 3 4 5

int[] a 是函数的形参, int[] arr 是函数的实参.
如果需要获取到数组长度, 同样可以使用 a.length

2.2 理解引用类型

我们都知道,当我们将实参赋值给形参,交换形参的值时,实参的值不会发生变化,而对于数组而言:

public static void main(String[] args) {
int[] arr = {1, 2, 3};
func(arr);
System.out.println("arr[0] = " + arr[0]);
}
public static void func(int[] a) {
a[0] = 10;
System.out.println("a[0] = " + a[0]);
}
// 执行结果
a[0] = 10
arr[0] = 10

很显然,当数组名作为参数时,改变形参的值,实参的值也发生了改变,此时数组名 arr 是一个 “引用” . 当传参的时候, 是按照引用传参.

那么要如何理解呢?首先我们要从内存说起。

如何理解内存?
内存可以直观的理解成一个宿舍楼. 有一个长长的大走廊, 上面有很多房间。每个房间的大小是 1 Byte.每个房间上面又有一个门牌号, 这个门牌号就称为 地址。
什么是引用?
我们提到了上述例子中数组名arr是一个引用,创建arr这个引用时只是在栈上创建了一个很小的变量,它存放的是一个数组在堆上的一个地址。
请添加图片描述
如图,我们在栈上定义了一个引用类型的变量arr,它存放了一个堆上的数组的地址,即它指向了这个地址为0x999的数组。所谓的 “引用” 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中,如上述例子中将 arr 指向的数组的地址传给 a ,即 arr 和 a 都指向这个数组,这样,当我们在func方法中通过 a 来对数组的值进行修改后,main方法中的 arr 所指向的数组的值自然也会改变。

2.3 认识null

null在Java中表示空引用,也就是一个无效的引用。

int[] arr = null;
System.out.println(arr[0]);
// 编译会产生错误
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:6)

null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作. 一旦尝试读写, 就会产生错误。

3. 数组作为方法的返回值

: 写一个方法, 将数组中的每个元素都 * 2:

class Test {
	public static void main(String[] args) {
		int[] arr = {1, 2, 3};
		int[] output = transform(arr);
		printArray(output);
	}
	public static void printArray(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
		System.out.println(arr[i]);
	}
}
	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;
	}
}

在定义方法时,方法类型为int[ ]类型,这样即可返回一个数组。

4. 二维数组

定义二维数组(3种定义方法):

int[][] array1 = {{1,2,3},{4,5,6}};
int[][] array2 = new int[][] {{1,2,3},{4,5,6}};
int[][] array3 = new int[2][3];	

二维数组是由多个一位数组组成的,在Java中,用一个一位数组来表示数组的行数,该数组的每一行存放的是这一行数组的地址,每行又用一个数组来存放这一行的所有元素,如:
请添加图片描述
在上述二维数组中,该数组共2行3列,array数组用来存放数组的行数,0下标用来存放第0行数组的首地址,1下标用来存放第1行数组的首地址,每行又分别用一个数组来存放这一行的元素。

打印二维数组:
第一种:

int[][] array = {{1,2,3},{4,5,6}};
for(int i=0;i<array.length;i++)
{
	for(int j=0;j<array[i].length;j++)
	{
		System.out.print(array[i][j]+" ");
	}
	System.out.println();
}
//结果:
1 2 3
4 5 6

或将for循环更换为for each循环:

int[][] array = {{1,2,3},{4,5,6}};
for(int ret[]:array){
	for(int X:ret){
		System.out.print(X+" ");
	}
	System.out.println();
}
//结果:
1 2 3
4 5 6

第二种打印:

int[][] array = {{1,2,3},{4,5,6}};
System.out.println(Arrays.deepToString(array));
//结果:
[[1,2,3],[4,5,6]]

定义不规则二维数组
第一种:

int[][] array = new int[2][];
array[0] = new int[ ]{1,2};
array[1] = new int[]{4,5,6};
System.out.println(Arrays.deepToString(array));
//结果:
[[1, 2], [4, 5, 6]]

第二种:

int[][] array = {{1,2},{4,5,6}};
System.out.println(Arrays.deepToString(array));
//结果:
[[1, 2], [4, 5, 6]]

The end

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zhanglf6699

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

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

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

打赏作者

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

抵扣说明:

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

余额充值