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

标签 java arrays types

java如何将数组类型转换为对象类型? 例如,假设我们有一个 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] 和 a[1] 的地址(像 C/C++ 中的指针数组)?

如果我更改了 b[1][3],a[1][3] 会如何更改?复制 a 的正确方法是什么?

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

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

最佳答案

How does java convert array types to Object types ?

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

how does java convert a primitive type array to an instance of Object ? Also while copying to 'dest', how does it know how to copy it without knowing the type ?

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

how does a[1][3] change if i changed b[1][3] and what is the correct way to make a copy of a ?

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

如果你想让每个子数组都是原始子数组的副本,你必须执行System.arraycopy执行 System.arraycopy 后分别对每个子数组进行处理主数组。

关于Java - 数组类型到对象类型的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30973080/

相关文章:

java - 检查二维数组中的越界

haskell - 使用数据种类对函数类型的约束

C 用户输入的数组大小

haskell - “惯用的” haskell 型不等式

javascript - 在 Javascript 中检查数组中元素的类型

java - SuperCSV 中的可选 ParseDate SuperCsvCellProcessorException 是否有解决方法?

java - 编译android_x86 iso镜像时出错

java - Google AppEngine + 本地 JUnit 测试 + Jersey 框架 + 嵌入式 Jetty

Java 字符串参数星号

c++ - 在确定数组的总数和平均值时,如何阻止将哨兵值读入数组?