2016-07-27 64 views
-3

我测试了类,枚举,接口这3种封装常量字符串的方法。为什么Java Enums使用比接口更多的内存?

public class Company { 
     public final static String CAPITAL_ONE = "Capital_One"; 
    } 
    public interface ICompany { 
     public final static String CAPITAL_ONE = "Capital_One"; 
    } 
    public enum ECompany { 
     CAPITAL_ONE 
    } 

编译之后,它们产生的330个字节,181个字节和818个字节的字节码,这意味着接口ICompany当被加载到JVM将花费更少的内存。为什么是这样?

+3

也许是因为那些不是等价的数据结构? –

+1

接口只需要有一个字段名称,类型和值。除了常量值之外,枚举需要存储多个不同的方法实现('values()'和'valueOf(String)',以及静态初始化)。 – resueman

回答

2

使用javap实用程序检查3个“.class”文件并比较输出。例如:

$ javap -c Company.class 

简短的答案是,有一些标准方法(values()valueOf(String)toString())的enum类必须实现,但其他类不就得了。

话虽如此,一个“.class”文件的大小不一定是一个准确的预测器,当一个类被加载和JIT编译时使用的内存。

0

单个类文件定义了类或接口。纵观结构(https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html):

ClassFile { 
    u4    magic; 
    u2    minor_version; 
    u2    major_version; 
    u2    constant_pool_count; 
    cp_info  constant_pool[constant_pool_count-1]; 
    u2    access_flags; 
    u2    this_class; 
    u2    super_class; 
    u2    interfaces_count; 
    u2    interfaces[interfaces_count]; 
    u2    fields_count; 
    field_info  fields[fields_count]; 
    u2    methods_count; 
    method_info methods[methods_count]; 
    u2    attributes_count; 
    attribute_info attributes[attributes_count]; 
    } 

一个ENUM是一个类,如果你看它编译成,你就会明白为什么有必要开销(在这里看到:In java, What does such enum type compile to?)。一个接口是一个抽象类型,它实际上只是一个类必须符合的一组操作和常量。

ICompany.class:

����4 
CAPITAL_ONELjava/lang/String; 
ConstantValue 
SourceFile 
ICompany.javaICompanyjava/lang/ObjectCapital_One 

ECompany.class:

����4( 


! 

" 
" #$CAPITAL_ONE 
LECompany;$VALUES[LECompany;values 
()[LECompany;CodeLineNumberTablevalueOf(Ljava/lang/String;)LECompany;<init>(Ljava/lang/String;I)V Signature()V<clinit>Ljava/lang/Enum<LECompany;>; 
SourceFile 
ECompany.java 
%&ECompany'java/lang/Enumclone()Ljava/lang/Object;5(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;@1 
@ 
    " 
���� " 
*���*+��7�Y�� �Y� S�� 

从类文件中,你可以看到,在示例中的界面没有太多添加到它的条款方法或标志,因此更小的尺寸。

相关问题