java - java数组是如何真正工作的

标签 java arrays jvm runtime scjp

谁能给我解释一下数组在 Java 中的真正工作原理。

我对下面的代码感到惊讶:

        Object test = new Object[2][2];
        Object test2 = new Object[] {
                new Object[2],new Object[2]
        };
        Object test3 = new Object[2][];
        ((Object[])test3)[0] = new Object[2];
        ((Object[])test3)[1] = new Object[2];
        System.out.println(test instanceof Object[]);
        System.out.println(test instanceof Object[][]);
        System.out.println(test2 instanceof Object[]);
        System.out.println(test2 instanceof Object[][]);
        System.out.println(test3 instanceof Object[]);
        System.out.println(test3 instanceof Object[][]);

只有test2不是Object[][]的实例

运行时有什么区别?

编辑:我看到了一些答案。 Jon Skeet,请注意我可以做到:

Object[] test4 = (Object [])test;
test4[0] = "blaaa";
test4[1] = "toto";
System.out.println(test4);

测试 instanceof Object[] 返回 true,并且在运行时不会引发异常。根据 Sierra & Bates 的 SCJP 书,测试 IS-A Object[][] 也是一个 Object[]

但是当尝试用“test4[0] = “blaaa”;”重新分配一个新值时,我得到一个异常: 线程“main”中的异常 java.lang.ArrayStoreException: java.lang.String 在 Main.main(Main.java:24)

所以在运行时看来,test 和 test2 都是 IS-A Object[],并且都包含对象数组,但只有一个是 IS-A Object[][]

最佳答案

Test2 仅被声明为一个对象数组。它包含的对象恰好也是数组,但这没有声明。这就是区别。

关于java - java数组是如何真正工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6378611/

相关文章:

java - Spring Boot Admin 日志中重复出现 AsyncRequestTimeoutException

java - WCF Duplex 服务和 Android 客户端?任何可能性

java - 你怎么能用显示毫秒的计时器制作秒表?

java - array.remove() 给出 IndexOutOfBoundsException

java - 为什么 JMX 报告的 JVM 堆使用最大值会随时间变化?

java - 比较 time.time() 和 System.Currenttimemillis()

c++ - 在 C++ 中是否有一种用于将值随机输入数组的库?

php - 固定 PHP 5.3.5 数组的段错误

linux - 主机内存不足,使用稳定的JVM

java - HBase java.lang.OutOfMemoryError 错误