Java的一维数组、二维数组及数组复制(arraycopy)

本文详细介绍了Java中的一维数组和二维数组的定义、赋值、长度属性以及数组复制的方法,包括arraycopy的使用。强调了数组长度属性length的用途,并通过实例说明了数组变量之间的比较和复制操作。

一维数组

★定义一个数组

☆方法1:

格式:

int(数组格式)[](两个方括号)  test(数组名) = new(表示初始化) int(数组格式) [(数字)例:100](表示数组里可以存放多少数据)

意思是创建新的100个存放int的数组交给test数组变量
例:定义a[10]
注意:此方法数组里的数据仓库编号是从0开始
即 a[0]、a[1]…、a[10]

☆方法2:

格式:

int(数组格式)[](两个方括号)  test(数组名) = {1,2,3,4,5,6,7,8,......(直接给出数字,不需要给出数组大小,编译器自动计算数组大小)}

意思是把这几个数字存放入test数组变量中
我们如何得知数组大小 ? length!

★给数组赋值

格式:

test(数组名)[分别各个数据仓库名]=x(各个数据仓库相对应的数据值)

意思是挨个分配各个数据值给数组里相对应的数据仓库

★调用数组

格式:

test(数组名)[数组中的第几个数据仓库]     ·······(进行运算)

意思是调用数组中的数据仓库进行运算

数组成员:length

★length作用:告诉你数组中元素(数据仓库)的数量

★length用法:

test(数组名).length

“.”点号表示要访问的是test数组中的数组成员length
★判断数组变量是否相同:
看两个数组变量是否管理着同一批数据仓库
即使int[] a={1,2,3,4,5}int[] b={1,2,3,4,5}
看似相同
但是数组变量a和b管理的并不是同一批数据仓库
所以判断a==b的时候会反馈false

★复制数组:

数组并不能简单的给另一个数组赋值
例:

int[] a={1,2,3,4,5};
int[] b=a;

而是要将数组内的内容逐个复制
例:

int[] a={1,2,3,4,5};
int[] b=new int[a.length];
for (int i=0 ; i<b.length ; i++)
{
     b[i]=a[i]
}

二维数组

★定义一个二维数组

☆方法1:

格式:

int(数组格式)[][](四个方括号)  test(数组名) = new(表示初始化) int(数组格式) [(数字)例:3][(数字)例:6](表示数组里可以存放几行几列的数据)

意思是创建新的3行6列的存放int的矩阵交给test数组变量

注意:此方法数组里的数据仓库编号是从0开始的

a[0][0]、a[0][1]、a[0][2]、a[0][3]、a[0][4]
a[1][0]、a[1][1]、a[1][2]、a[1][3]、a[1][4]
a[2][0]、a[2][1]、a[2][2]、a[2][3]、a[2][4]

☆方法2:

格式:

int(数组格式)[][](四个方括号)  test(数组名) = {{1,2,3,4,5,6,7,8,......(直接给出数字,不需要给出数组大小,编译器自动计算数组大小)},(逗号可以有也可以没有){1,2,3,4,5,6,7,8,......(直接给出数字,不需要给出数组大小,编译器自动计算数组大小)},(逗号可以有也可以没有)}

意思是把这个数字矩阵存放入test二维数组变量中

二维数组的遍历

for ( i=0;i<3;i++)
{
	for(j=0;j<5;j++)
	{
		a[i][j]=i*j;
	}
}

a[i][j]是一个int
表示第i行第j列上的单元
a[i.j]并不存在

二维数组的初始化

int [][] a={
	{1,2,3,4},
	{1,2,3},
}

编译器会自动计数
每行一个{},以逗号分隔
若哪个位置省略,则该位置默认补零

数组复制

System类直接提供了一个用于数组复制的方法

System.arraycopy()

例:

 int[] src={1,2,3,4,5};
 int[] dest={6,7,8};
 System.arraycopy(src,1,dest,0,2);

复制功能: 从src数组的1位置复制2个到dest数组的0位置


Java复制二维数组时,需要注意二维数组本质上是“数组数组”,因此直接使用`Arrays.copyOf()`或`System.arraycopy()`仅能完成浅拷贝,即外层数组的元素(即内层数组的引用)被复制,而内层数组的内容未独立复制。如果需要深拷贝,使原数组与新数组完全独立,可以通过遍历每个一维数组逐个复制实现。 以下是一个完整的示例代码,演示如何正确复制一个二维数组: ```java import java.util.Arrays; public class DeepCopy2DArray { public static void main(String[] args) { int[][] original = {{1, 2, 3}, {4, 5, 6}}; // 创建一个新的二维数组,用于存放复制后的数据 int[][] copy = new int[original.length][]; // 遍历每一行,使用 Arrays.copyOf() 复制每一行的一维数组 for (int i = 0; i < original.length; i++) { copy[i] = Arrays.copyOf(original[i], original[i].length); } // 修改原始数组,验证是否为深拷贝 original[0][0] = 99; // 打印结果,确认复制后的新数组未受影响 System.out.println("Original array after modification:"); for (int[] row : original) { System.out.println(Arrays.toString(row)); } System.out.println("Copied array:"); for (int[] row : copy) { System.out.println(Arrays.toString(row)); } } } ``` ### 关键点说明 - **浅拷贝问题**:如果直接使用 `int[][] copy = Arrays.copyOf(original, original.length);`,那么虽然外层数组复制了,但其内部的一维数组仍然是原数组的引用,修改其中一个会影响另一个[^1]。 - **深拷贝方法**:通过遍历每一个内层数组调用 `Arrays.copyOf()`,可以确保每个一维数组都被独立复制,从而实现二维数组的深拷贝[^1]。 - **其他方法**:也可以使用 `System.arraycopy()` 替代 `Arrays.copyOf()` 来完成每行的复制操作,效果相同[^2]。 ### 总结 为了在Java中安全地复制二维数组,推荐采用遍历每一行逐行复制的方式,以确保得到一个完全独立的副本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值