java编程中拷贝数组的方式及相关问题分析

 更新时间:2017年11月17日 15:05:26   作者:h2内存数据库  
这篇文章主要介绍了java编程中拷贝数组的方式及相关问题分析,分享了Java中数组复制的四种方式,其次对二维数组的简单使用有一段代码示例,具有一定参考价值,需要的朋友可以了解下。

JAVA数组的复制是引用传递,而并不是其他语言的值传递。

这里介绍java数组复制的4种方式极其问题:

第一种方式利用for循环:

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

第二种方式直接赋值:

int[] array1={1,2,4,6};
int[] array2=a;

这里把array1数组的值复制给array2,如果你这样去运行,就会发现此时两个数组的值是一样的。这是传递的是引用(也就是地址),之后改变其中一个数组另一个也会跟着变化。

第三种方式:

利用Arrays自带的copyof

int copy[] = Arrays.copyOf(a, a.length);

第四种方式:

这里再介绍一下System.arraycopy这个函数,从JAVAAPI中找了一段。大家看一下。

publicstaticvoidarraycopy(Objectsrc,intsrcPos,Objectdest,intdestPos,intlength)从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。从src引用的源数组到dest引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的编号等于length参数。源数组中位置在srcPos到srcPos+length-1之间的组件被分别复制到目标数组中的destPos到destPos+length-1位置。

如果参数src和dest引用相同的数组对象,则复制的执行过程就好像首先将srcPos到srcPos+length-1位置

的组件复制到一个带有length组件的临时数组,然后再将此临时数组的内容复制到目标数组的destPos到

destPos+length-1位置一样。

If如果dest为null,则抛出NullPointerException异常。

如果src为null,则抛出NullPointerException异常,并且不会修改目标数组。

否则,只要下列任何情况为真,则抛出ArrayStoreException异常并且不会修改目标数组:

src参数指的是非数组对象。

dest参数指的是非数组对象。

src参数和dest参数指的是那些其组件类型为不同基本类型的数组。

src参数指的是具有基本组件类型的数组且dest参数指的是具有引用组件类型的数组。

src参数指的是具有引用组件类型的数组且dest参数指的是具有基本组件类型的数组。

否则,只要下列任何情况为真,则抛出IndexOutOfBoundsException异常,并且不会修改目标数组:

srcPos参数为负。

destPos参数为负。

length参数为负。

srcPos+length大于src.length,即源数组的长度。

destPos+length大于dest.length,即目标数组的长度。

否则,如果源数组中srcPos到srcPos+length-1位置上的实际组件通过分配转换并不能转换成目标数组的组

件类型,则抛出ArrayStoreException异常。在这种情况下,将k设置为比长度小的最小非负整数,这样就

无法将src[srcPos+k]转换为目标数组的组件类型;当抛出异常时,从srcPos到srcPos+k-1位置上的源数组

组件已经被复制到目标数组中的destPos到destPos+k-1位置,而目标数组中的其他位置不会被修改。(因

为已经详细说明过的那些限制,只能将此段落有效地应用于两个数组都有引用类型的组件类型的情况。)

参数:src-源数组。

srcPos-源数组中的起始位置。

dest-目标数组。

destPos-

目标数据中的起始位置。

length-

要复制的数组元素的数量。

抛出:IndexOutOfBoundsException-

如果复制会导致对数组范围以外的数据的访问。

ArrayStoreException-如果因为类型不匹配而使得无法将src数组中的元素存储到dest数组中。

NullPointerException-如果src或dest为null。

二维数组

不想匆匆了事,那就再介绍一下二维数组的声明、初始化和引用吧。

二维数组的声明、初始化和引用与一维数组相似:

int intArray[ ][ ] = { {1,2}, {2,3}, {4,5} };
int a[ ][ ] = new int[2][3];
a[0][0] = 12;
a[0][1] = 34;
// ......
a[1][2] = 93;

Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同。例如:

int intArray[ ][ ] = { {1,2}, {2,3}, {3,4,5} };
int a[ ][ ] = new int[2][ ];
a[0] = new int[3];
a[1] = new int[5];

【示例】通过二维数组计算两个矩阵的乘积。

public class Demo {
	public static void main(String[] args){
		// 第一个矩阵(动态初始化一个二维数组)
		int a[][] = new int[2][3];
		// 第二个矩阵(静态初始化一个二维数组)
		int b[][] = { {1,5,2,8}, {5,9,10,-3}, {2,7,-5,-18} };
		// 结果矩阵
		int c[][] = new int[2][4];
		// 初始化第一个矩阵
		for (int i=0; i<2; i++)
		for (int j=0; j<3 ;j++)
		a[i][j] = (i+1) * (j+2);
		// 计算矩阵乘积
		for (int i=0; i<2; i++){
			for (int j=0; j<4; j++){
				c[i][j]=0;
				for (int k=0; k<3; k++)
				c[i][j] += a[i][k] * b[k][j];
			}
		}
		// 输出结算结果
		for (int i=0; i<2; i++){
			for (int j=0; j<4; j++)
			System.out.printf("%-5d", c[i][j]);
			System.out.printlnwww.ymzxrj.com();
		}
	}
}

运行结果:

25 65 14 -65
50 130 28 -130

总结

以上就是本文关于java编程中拷贝数组的方式及相关问题分析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

java数组复制的四种方法效率对比

Java中的数组复制(clone与arraycopy)代码详解

浅谈java中String的两种赋值方式的区别

如有不足之处,欢迎留言指出,期待您的宝贵意见!

相关文章

  • SpringBoot实现excel生成并且通过邮件发送的步骤详解

    SpringBoot实现excel生成并且通过邮件发送的步骤详解

    实际开发中,特别是在B端产品的开发中,我们经常会遇到导出excel的功能,更进阶一点的需要我们定期生成统计报表,然后通过邮箱发送给指定的人员, 今天要带大家来实现的就是excel生成并通过邮件发送,需要的朋友可以参考下
    2023-10-10
  • springBoot项目常用目录解读

    springBoot项目常用目录解读

    这篇文章主要介绍了springBoot项目常用目录解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 解析springboot整合谷歌开源缓存框架Guava Cache原理

    解析springboot整合谷歌开源缓存框架Guava Cache原理

    本文主要为大家解析了springboot整合谷歌开源缓存框架Guava Cache的原理以及在实际开发过程中的使用,附含源码,有需要的朋友可以参考下
    2021-08-08
  • 关于Springboot | @RequestBody 接收到的参数对象属性为空的问题

    关于Springboot | @RequestBody 接收到的参数对象属性为空的问题

    这篇文章主要介绍了关于Springboot | @RequestBody 接收到的参数对象属性为空的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Spring @Order注解使用详解

    Spring @Order注解使用详解

    注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响
    2022-08-08
  • SpringbBoot实现Tomcat集群的会话管理的详细过程

    SpringbBoot实现Tomcat集群的会话管理的详细过程

    文章介绍了如何使用Nginx作为负载均衡器和SpringSession配合Redis实现Tomcat集群的会话共享,确保跨节点访问时会话的一致性和持久性,通过具体的步骤和示例代码,感兴趣的朋友一起看看吧
    2024-12-12
  • IDEA消除指定警告的两种方法小结

    IDEA消除指定警告的两种方法小结

    有时候IDEA会代码中给出一些我们不需要的警告,看起来就很不美观,本文主要介绍了IDEA消除指定警告的两种方法,感兴趣的可以了解一下
    2023-08-08
  • java开发之读写txt文件操作的实现

    java开发之读写txt文件操作的实现

    本篇文章介绍了,java开发之读写txt文件操作的实现。需要的朋友参考下
    2013-05-05
  • Springboot有效防止XSS攻击的几种方法

    Springboot有效防止XSS攻击的几种方法

    本文介绍了在SpringBoot项目中防止XSS攻击的多种方法,包括输入验证和过滤、输出编码、使用安全框架、使用模板引擎的自动转义功能以及设置安全HTTP头等,感兴趣的可以了解一下
    2024-12-12
  • Java设计模式之java状态模式详解

    Java设计模式之java状态模式详解

    这篇文章主要介绍了Java设计模式之状态模式定义与用法,结合具体实例形式详细分析了Java状态模式的概念、原理、定义及相关操作技巧,需要的朋友可以参考下
    2021-09-09

最新评论