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的两种赋值方式的区别

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

(0)

相关推荐

  • Java数组的扩容代码示例

    在写程序的过程中,我们常常会碰见数组空间不够用的情况,比如我已经初始化了一个数组int []a = {1,2,3,4,5,6,7,8,9,10} ;这时,我想往数组下标3的位置插入一个元素,该怎么做?用C语言实现太难了吧,需要调用memcpy函数要一个一个偏,但是在java中就不用那么麻烦了,有种叫数组的扩容方式,轻松实现.来看看代码: public class HelloWorld { public static void main(String[] args){ // Scanner s =

  • Java中一维二维数组的静态和动态初始化

    今天我们要开始来讲讲Java中的数组,包括一维数组和二维数组的静态初始化和动态初始化 数组概述: 数组可以看成是多个相同类型数据的组合,对这些数据的统一管理; 数组变量属于引用数据类型,数组也可以看成是对象,数组中的每一个元素相当于该对象的成员变量; 数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型; 一维数组的声明: 声明方式: 例如; int a [ ]  = new int [3]; Java语言中 声明是不能指定其长度[数组中元素的个数]; 非法声明; int a [5];

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

    有关数组的基础知识,有很多方面,比方说初始化,引用,遍历,以及一维数组和二维数组,今天我们先看看数组复制的有关内容. 来源于牛客网的一道选择题: JAVA语言的下面几种数组复制方法中,哪个效率最高? A.for循环逐一复制 B.System.arraycopy C.System.copyof D.使用clone方法 效率:System.arraycopy>clone>Arrays.copyOf>for循环 1.System.arraycopy的用法: public static void

  • 浅谈java中字符串数组、字符串、整形之间的转换

    字符串数组转字符串(只能通过for循环): String[] str = {"abc", "bcd", "def"}; StringBuffer sB = new StringBuffer(); for (int i = 0; i < str.length;i++) { sB.append(str[i]); } String s = sB.toString(); 字符数组转字符串可以通过下面的方式: char[] data = {"

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

    JAVA数组的复制是引用传递,而并不是其他语言的值传递. 1.clone protectedObjectclone() throwsCloneNotSupportedException创建并返回此对象的一个副本."副本"的准确含义可能依赖于对象的类.这样做的目的是,对于任何对象x,表达式: x.clone()!=x为true,表达式: x.clone().getClass()==x.getClass()也为true,但这些并非必须要满足的要求.一般情况下: x.clone().equa

  • Java实现数组去除重复数据的方法详解

    本文实例讲述了Java实现数组去除重复数据的方法.分享给大家供大家参考,具体如下: 前一段时间被面试问到:如果一个数组中有重复元素,用什么方法可以去重?一时间会想到用一种方法,但是后来查阅资料后发现,有好多方法可以实现,现在就总结一下,比较简单的几种. 一.用List集合实现 int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList<Integer>(); for (int i=0; i<s

  • 详解java中反射机制(含数组参数)

    详解java中反射机制(含数组参数) java的反射是我一直非常喜欢的地方,因为有了这个,可以让程序的灵活性大大的增加,同时通用性也提高了很多.反射原理什么的,我就不想做过大介绍了,网上一搜,就一大把.(下面我是只附录介绍下) Reflection 是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等).superclass(例如O

  • Java map存放数组并取出值代码详解

    获取map的值主要有四种方法,这四种方法又分为两类,一类是调用map.keySet()方法来获取key和value的值,另一类则是通过map.entrySet()方法来取值,两者的区别在于,前者主要是先获取到所有的key的集合,当你需要查询value的值的时候需要通过key来查询value,后者则直接将key和value的键值对直接取出来,只用查询一次,对于那种性能更好,我觉得还是用map.entrySet()更好一点,具体请参见map.keySet()和map.EntrySet()的比较,接下

  • 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数组的值复制给arra

  • 详解Java编程中统一资源定位符URL的相关使用

    统一资源定位符URL(Uniform Resource Locator)是www客户机访问Internet时用来标识资源的名字和地址.超文本链路由统一资源定位符URL维持.URL的格式是:     <METHOD>://<HOSTNAME:PORT>/<PATH>/<FILE> 其中:Method是传输协议:HOSTNAME是文档和服务器所在的Internet主机名(域名系统中DNS中的点地址);PORT是服务端口号(可省略):PATH是路径名,FILE是文

  • Java编程实现统计数组中各元素出现次数的方法

    本文实例讲述了Java编程实现统计数组中各元素出现次数的方法.分享给大家供大家参考,具体如下: package javatest; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class NumOfEle { public static void main(String[] ar

  • 浅谈Java编程中string的理解与运用

    一,"=="与equals() 运行以下代码,如何解释其输出结果? public class StringPool { public static void main(String args[]) { String s0="Hello"; String s1="Hello"; String s2="He"+"llo"; System.out.println(s0==s1);//true System.out

  • Java编程中ArrayList源码分析

    之前看过一句话,说的特别好.有人问阅读源码有什么用?学习别人实现某个功能的设计思路,提高自己的编程水平. 是的,大家都实现一个功能,不同的人有不同的设计思路,有的人用一万行代码,有的人用五千行.有的人代码运行需要的几十秒,有的人只需要的几秒..下面进入正题了. 本文的主要内容: · 详细注释了ArrayList的实现,基于JDK 1.8 . ·迭代器SubList部分未详细解释,会放到其他源码解读里面.此处重点关注ArrayList本身实现. ·没有采用标准的注释,并适当调整了代码的缩进以方便介

  • java编程中实现调用js方法分析

    本文实例讲述了java编程中实现调用js方法.分享给大家供大家参考,具体如下: /* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); try { String str="2&1"

  • Javascript编程中几种继承方式比较分析

    本文实例分析了Javascript编程中几种继承方式比较.分享给大家供大家参考,具体如下: 开篇 从'严格'意义上说,javascript并不是一门真正的面向对象语言.这种说法原因一般都是觉得javascript作为一门弱类型语言与类似java或c#之类的强型语言的继承方式有很大的区别,因而默认它就是非主流的面向对象方式,甚至竟有很多书将其描述为'非完全面向对象'语言.其实个人觉得,什么方式并不重要,重要的是是否具有面向对象的思想,说javascript不是面向对象语言的,往往都可能没有深入研究

  • Java编程中10个最佳的异常处理技巧

    在实践中,异常处理不单单是知道语法这么简单.编写健壮的代码是更像是一门艺术,在本文中,将讨论Java异常处理最佳实践.这些Java最佳实践遵循标准的JDK库,和几个处理错误和异常的开源代码.这还是一个提供给java程序员编写健壮代码的便利手册.Java 编程中异常处理的最佳实践 这里是我收集的10个Java编程中进行异常处理的10最佳实践.在Java编程中对于检查异常有褒有贬,强制处理异常是一门语言的功能.在本文中,我们将尽量减少使用检查型异常,同时学会在Java编程中使用检查型VS非检查型异常

  • 深入理解Java编程中异常处理的优劣

    Java编程中的异常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到异常处理.不过,我认为很多人其实没有真正掌握正确处理异常情况的方法和策略,最多也就不过了解个大概,知道概念.我想对三种不同程度和质量的Java异常处理进行了讨论,所阐述的处理异常的方式按手法的高下分为:好,不好和恶劣三种.同时提供了一些解决这些问题的技巧.首先解释一些java异常处理中必须搞清楚的定义和机制.Java语言规范将自Error类或RuntimeException类衍生出来的任何违例都称作"不可检查&

  • java编程中自动拆箱与自动装箱详解

    什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象实例的时候,我们会这样: Class a = new Class(parameter); 当我们创建一个Integer对象时,却可以这样: Integer i = 100; (注意:不是 int i = 100; ) 实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = Integer.valueOf(100); (感谢@

随机推荐