java - 为什么.class文件的常量池表中没有列出一维数组类型?

标签 java arrays multidimensional-array jvm bytecode

如果代码调用new int[0][0],条目[[I将被放入常量池表中。对于更高维的数组,将放置类似的条目。

但是,如果代码调用 new int[0],常量池表中将不会出现任何条目,就像 int 类型不会出现任何条目一样。

同样有趣的是,如果代码调用 new String[0][0],则“[[java/lang/String;”添加到常量池表中,但是如果代码调用 new String() 或 new String[0],则只有“java/lang/String”被添加到常量池表中(第二种情况下没有 [ 或 ; ) .

假设我的代码和commons的BCEL API都正确解析了池表,为什么常量池表中没有列出一维数组类型?

最佳答案

有多种指令可用于创建数组:newarrayanewarraymultinewarray

newarray 创建一个单维原始数组,不需要任何常量池条目。

anewarray 接受一个类型并创建一个包含该类型元素的数组,并初始化为 null。

multinewarray 接受要创建的数组的类型,并自动用子数组填充元素。这使您可以使用一条指令创建多维数组。

其中,只有最后一个需要带有要创建的数组类型的 cp 条目。对于标准编译器,new int[x] 使用第一个,new String[x] 使用第二个,new int[x][y]new String[x][y] 使用第三个。

关于java - 为什么.class文件的常量池表中没有列出一维数组类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18927261/

相关文章:

java - 存档中的部署描述 rune 件 WEB-INF/web.xml 中的部署描述符无效

java - 无法使用新 File 构造函数的 Parent 和 Child 参数通过 Java 创建文件

java - 使用列表<字符串>

python - 减少 ndarray 的第一维 - 保留第一个和最后一个元素

java - 检查 List<String[]> 是否包含 String[] 的最佳方法

java - Java 中的静态类有什么用?

javascript - 有没有办法将字符串数组转换为对象集合?

c++ - 指针、数组和新运算符

java - 根据最长长度的数字打印出特定数量的数字?

C多维字符数组初始化