Java 为什么将int数组更改为char数组时.class文件会变大?

Java 为什么将int数组更改为char数组时.class文件会变大?,java,memory,Java,Memory,所以我的文件中有一行代码 char[] arr = new char[256]; 但是,当我将此更改为 int[] arr = new int[256]; 类文件缩小了.01KB。这是为什么?可能是因为类型的符号稍微短了一点。可能是因为类型的符号稍微短了一点。可能是因为编译器生成的符号短了几个字符。就像在.java文件中一样,第一行将创建一个更大的文件,因为它有更多的字符 如果在vim中打开.class,您将看到int数组的以下内容 Êþº¾^@^@^@2^@^O ^@^C^@^L^G^@^

所以我的文件中有一行代码

char[] arr = new char[256];
但是,当我将此更改为

int[] arr = new int[256];

类文件缩小了.01KB。这是为什么?

可能是因为类型的符号稍微短了一点。

可能是因为类型的符号稍微短了一点。

可能是因为编译器生成的符号短了几个字符。就像在
.java
文件中一样,第一行将创建一个更大的文件,因为它有更多的字符

如果在vim中打开
.class
,您将看到
int
数组的以下内容

Êþº¾^@^@^@2^@^O
^@^C^@^L^G^@^M^G^@^N^A^@^F<init>^A^@^C()V^A^@^DCode^A^@^OLineNumberTable^A^@^Dmain^A^@^V([Ljava/lang/String;)V^A^@
SourceFile^A^@!JFileChooserDisableDirectory.java^L^@^D^@^E^A^@^\JFileChooserDisableDirectory^A^@^Pjava/lang/Object^@!^@^B^@^C^@^@^@^@^@^B^@^A^@^D^@^E^@^A^@^F^@^@^@^]^@^A^@^A^@^@^@^E*·^@^A±^@^@^@^A^@^G^@^@^@^F^@^A^@^@^@^A^@  ^@^H^@  ^@^A^@^F^@^@^@"^@^A^@^B^@^@^@^F^P
¼
L±^@^@^@^A^@^G^@^@^@
^@^B^@^@^@^D^@^E^@^E^@^A^@
^@^@^@^B^@^K

使用可以看到代码中的差异。

这可能是因为编译器生成了一个短几个字符的符号。就像在
.java
文件中一样,第一行将创建一个更大的文件,因为它有更多的字符

如果在vim中打开
.class
,您将看到
int
数组的以下内容

Êþº¾^@^@^@2^@^O
^@^C^@^L^G^@^M^G^@^N^A^@^F<init>^A^@^C()V^A^@^DCode^A^@^OLineNumberTable^A^@^Dmain^A^@^V([Ljava/lang/String;)V^A^@
SourceFile^A^@!JFileChooserDisableDirectory.java^L^@^D^@^E^A^@^\JFileChooserDisableDirectory^A^@^Pjava/lang/Object^@!^@^B^@^C^@^@^@^@^@^B^@^A^@^D^@^E^@^A^@^F^@^@^@^]^@^A^@^A^@^@^@^E*·^@^A±^@^@^@^A^@^G^@^@^@^F^@^A^@^@^@^A^@  ^@^H^@  ^@^A^@^F^@^@^@"^@^A^@^B^@^@^@^F^P
¼
L±^@^@^@^A^@^G^@^@^@
^@^B^@^@^@^D^@^E^@^E^@^A^@
^@^@^@^B^@^K

使用您可以看到代码中的差异。

您可能会这么认为,但是如果我将“char”改为“short”,它的大小也会缩小。@user1522860-出于同样的原因。如果你真的想/需要理解,你需要自己手动解码类文件。。。使用JVM规范中指定的类文件格式。但是,答案并不重要。。。所以不要期望人们浪费时间为你做这件事。你会这么想,但如果我把“char”改为“short”,它的大小也会缩小。@user1522860-出于同样的原因。如果你真的想/需要理解,你需要自己手动解码类文件。。。使用JVM规范中指定的类文件格式。但是,答案并不重要。。。所以,不要期望人们浪费时间为你做这件事。你为什么不在文件上做一个
diff
FC/B
,在Windows中)看看有什么不同?为什么不在文件上做一个
diff
FC/B
,在Windows中)看看有什么不同?有趣!为了节省内存,是否仍然值得使用char数组而不是int数组?直觉会说是的,但我不确定了。如果你想节省内存,你可能需要一个
short[]
byte[]
。Java字符是2字节无符号整数,这可能不是您想要的。它不会有明显的区别。即使您有一百万个数组,它仍然只有mb左右。“为了节省内存,是否仍然值得使用字符数组而不是int数组?”-是什么让您想到可以从“.class”文件的大小推断字符数组的大小?它们完全是无关的问题@斯蒂芬斯:我误解了他的问题,你说得很好,很有趣!为了节省内存,是否仍然值得使用char数组而不是int数组?直觉会说是的,但我不确定了。如果你想节省内存,你可能需要一个
short[]
byte[]
。Java字符是2字节无符号整数,这可能不是您想要的。它不会有明显的区别。即使您有一百万个数组,它仍然只有mb左右。“为了节省内存,是否仍然值得使用字符数组而不是int数组?”-是什么让您想到可以从“.class”文件的大小推断字符数组的大小?它们完全是无关的问题@斯蒂芬斯:我误解了他的问题,你说得对。