Java - 对象类型转换的数组类型

时间:2015-06-22 06:09:50

标签: java arrays types

java如何将数组类型转换为Object类型? 例如,假设我们有一个int数组' src'我们使用System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)然后java如何将基本类型数组转换为Object实例?此外,在复制到' dest'时,如何在不知道类型的情况下知道如何复制它?

它是否像克隆一样逐字节复制,因为当我运行以下代码时

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]));

我得到以下输出

[[I@7d08c1b7, [I@49e61582]
[1, 2, 3, 4, 5]
[6, 7, 8, 100, 0]

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

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

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

编辑:我想指出我更改了​​ b [1] [3]的值,但在打印 a [1]时,值 a [1] [3]也在发生变化。为什么会这样?

4 个答案:

答案 0 :(得分:1)

  

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

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

  

输出是什么" [[I @ 7d08c1b7,[I @ 49e61582]" ?是不是像   数组a [0]和1的地址(就像C / C ++中的指针数组一样)?

" [[I @ 7d08c1b7,[I @ 49e61582]"是班级名称和[0]&的哈希码一个1

  

如果我改变b 1 [3],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的变化不会影响a的值。

如果你想改变b&

还需要后续更改

只是做

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

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

答案 1 :(得分:1)

  

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

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

  

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

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

  

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

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

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

答案 2 :(得分:0)

来自Object javadocs

  

Object类的toString方法返回一个由。组成的字符串   对象是实例的类的名称,at-sign   字符`@',以及散列的无符号十六进制表示   对象的代码。换句话说,此方法返回一个相等的字符串   价值:

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

答案 3 :(得分:0)

  

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

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

  

如果我改变了b [1] [3],那么[1] [3]如何改变是什么?   正确的方法来复制一个?

System.arraycopy将创建一个新数组,所以更改为b,对b没有影响。

  编辑:还有java.lang.reflect.Array.getLength(对象数组)   工作?

如果anArray静态类型为数组类型,则应使用anArray.length(不是方法调用)。如果只有对数组的引用,则使用反射形式。