2015-06-22 442 views
1

java如何将数组类型转换为对象类型?例如,假设我们有一个int数组'src',并且我们使用System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length),那么java如何将一个原始类型数组转换为Object的一个实例?在复制到'dest'的同时,它如何知道如何在不知道类型的情况下复制它?Java - 将数组类型转换为对象类型转换

是否只是通过做副本字节一个字节像一个克隆,因为当我运行下面的代码

int[][] a = new int[][] {{1,2,3,4,5},{6,7,8,9,0}}; 
int[][] b = new int[a.length][a[0].length]; 
System.arraycopy(a,0,b,0,a.length); 
System.out.println(java.util.Arrays.toString(a)); 
b[1][3]=100; 
System.out.println(java.util.Arrays.toString(a[0])); 
System.out.println(java.util.Arrays.toString(a[1])); 

我得到以下输出

[[[email protected], [[email protected]] 
[1, 2, 3, 4, 5] 
[6, 7, 8, 100, 0] 

什么是输出[[[email protected], [[email protected]]?它是否像数组a [0]和[1](如C/C++中的指针数组)的地址?

另外,如果我改变了b [1] [3],那么[1] [3]如何改变以及制作副本的正确方法是什么?

编辑:另外如何java.lang.reflect.Array.getLength(Object array)工作?

编辑:我想指出的是,我改变的值b [1] [3],但在打印时一个 [1],该值一个 [1] [3]也被改变。为什么会发生?

回答

1

java如何将数组类型转换为对象类型?

数组类型已经是Object的子类,所以不需要任何转换。

java如何将原始类型数组转换为Object的实例?在复制到'dest'的同时,它如何知道如何在不知道类型的情况下复制它?

原始类型数组已经是Object的一个实例,因此不需要转换。 JVM在运行时知道存储在源和目标数组中的元素的类型。如果它们不匹配,则抛出ArrayStoreException

如果我改变了b [1] [3],那么a [1] [3]如何改变,以及如何修改a的副本?

System.arraycopy不做深层复制。它将源数组的每个位置的基元或引用复制到目标数组。当源数组的一个元素本身是对一个子数组的引用时,引用将被按原样复制到目标数组中。因此a[1] == b[1](它们指的是相同的数组对象),所以更改b[1][3]更改a[1][3]

如果您希望每个子阵列都是原始子阵列的副本,则必须为主阵列执行System.arraycopy之后,分别为每个子阵列执行System.arraycopy

0

Object javadocs

Object类的toString方法返回由 其中物体是一个实例,所述-SIGN 字符'@”的类的名称的字符串,并且无符号十六进制表示的散列 代码的对象。换句话说,此方法返回一个字符串等于 到的值:

`getClass().getName() + '@' + Integer.toHexString(hashCode())` 
0

的输出是什么 “[[I @ 7d08c1b7,[I @ 49e61582]”?它是否像数组a [0]和[1](如C/C++中的指针数组)的地址 ?

它是类名和hashCode。 getClass().getName() + '@' + Integer.toHexString(hashCode())

还怎么做了[1] [3]变化,如果我改变了B [1] [3],是什么使一个副本 正确的方法是什么?

System.arraycopy将创建一个新的数组,所以变成了b,这对b没有影响。

编辑:另外如何工作java.lang.reflect.Array.getLength(Object array) ?

如果将anArray静态类型为数组类型,则应该使用anArray.length(不是方法调用)。如果仅将对数组的引用指定为Object,则将使用反射表单。

+0

'System.arraycopy将创建一个新的数组,所以变成了b,这对b没有影响。'我假设你的意思是'System.arraycopy将创建一个新的数组,所以变成了b,没有对a.'的影响。这仍然是错误的,因为'arraycopy'执行浅拷贝,所以即使'a!= b','a [i] == b [i]'是真的,并且改变b [i] [j]会改变一个[i] [j]。 – Eran

1

java如何将数组类型转换为对象类型?

数组是一个容器对象,它包含固定数量的单个类型的值。它生活在堆上。

什么是输出“[[I @ 7d08c1b7,[I @ 49e61582]”?它是否像数组a [0]和1(如C/C++中的指针数组)的地址 ?

“[我@ 7d08c1b7,[I @ 49e61582]” 是的类名&哈希码为[0] &一个1

还怎么做了1 [3]的变化,如果我更改b 1 [3]以及什么是 正确的方法来复制一个?

我写了一个示例代码

 int[] a = new int[]{1,2,3,4,5,6,7}; 
     int[] b = new int[a.length]; 

     b=Arrays.copyOf(a, a.length); 
     //System.arraycopy(a, 0, b, 0, a.length); 
     b[2]=789; 
     System.out.println(Arrays.toString(a)); 
     System.out.println(Arrays.toString(b)); 

输出

[1, 2, 3, 4, 5, 6, 7] 
[1, 2, 789, 4, 5, 6, 7] 

变化在B不会影响的值。

如果你想b变更&也希望在

随后的变化只是做

b=a; //now b is a shallow copy of a 

好复制数组对象是使用Arrays.copyOf方法的标准方式。

+0

您的示例代码复制了一维数组,因此它的行为与问题中的二维数组的行为不同。 – Eran

相关问题