首页 > 其他分享 >枚举真的比静态常量更占空间吗?

枚举真的比静态常量更占空间吗?

时间:2022-09-20 18:34:02浏览次数:70  
标签:String 静态 Season public 枚举 static final 常量

前两天在网上看到一条信息:枚举比静态常量更占用空间。
这是真的吗?

前言

枚举

枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。

枚举实现原理

在使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了Java API中的java.lang.Enum类,也就是说通过关键字enum创建枚举类型在编译后事实上也是一个类类型而且该类继承自java.lang.Enum类。

枚举

新建一个枚举类

package com.example.demo;

/**
 * @Author: 少年闰土
 * @Date: 2019/12/27 0027 上午 9:23
 * @Description:
 */
public enum Season {

    SPRING("春天", "趁春踏青"),
    SUMMER("夏天", "夏日炎炎"),
    AUTUMN("秋天", "秋高气爽"),
    WINTER("冬天", "围炉赏雪");

    private final String name;
    private final String desc;

    Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }
}

接下来使用javac命令进行编译:生成class文件,然后再通过javap反编译
image

public final class com.example.demo.Season extends java.lang.Enum<com.example.de
mo.Season> {
  public static final com.example.demo.Season SPRING;
  public static final com.example.demo.Season SUMMER;
  public static final com.example.demo.Season AUTUMN;
  public static final com.example.demo.Season WINTER;
  //编译器为我们添加的静态的values()方法
  public static com.example.demo.Season[] values();
  //编译器为我们添加的静态的valueOf()方法,注意间接调用了Enum也类的valueOf方法
  public static com.example.demo.Season valueOf(java.lang.String);
  //构造方法
  public java.lang.String getName();
  public java.lang.String getDesc();
  static {};
}

静态常量

package com.example.demo;

/**
 * @Author: 少年闰土
 * @Date: 2019/12/27 0027 上午 10:49
 * @Description:
 */
public class Season {

    public static final String SPRING ="春天";
    public static final String SUMMER ="夏天";
    public static final String AUTUMN ="秋天";
    public static final String WINTER ="冬天";

}

javap反编译后:
image

public class com.example.demo.Season {
  public static final java.lang.String SPRING;
  public static final java.lang.String SUMMER;
  public static final java.lang.String AUTUMN;
  public static final java.lang.String WINTER;
  public com.example.demo.Season();
}

对比

枚举
枚举

静态常量
静态常量

编译后的枚举class文件大小为1471字节,静态常量class文件大小为400字节。
image

用Chkdsk查看簇大小
image

经过对比枚举类型文件大小更大一些。

枚举的实现原理就是定义一个类,然后实例化几个由final修饰的这个类的对象,每个实例都带有自己的元信息。而常量相比之下,没有这一层封装,只占用最基本的内存,包括引用,和它的值本身,要简单轻巧很多。如果值可以使用基本类型而不是包装类型,那更不用说了。 不过话又说回来,通常情况下我们没必要在意这种区别。如果用枚举可读性、可扩展性更好,用就是了,枚举占那点内存,沧海一粟。在性能与代码维护性之间,除个别情况,优先选后者。高级编程语言的诞生本身就是硬件提升的背景下,牺牲某些性能来降低开发门槛,提高开发效率的,相对于微小的性能损耗,人力成本更值钱

标签:String,静态,Season,public,枚举,static,final,常量
From: https://www.cnblogs.com/leepandar/p/16712072.html

相关文章

  • 静态static内容
    我们知道static是静态修饰符,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而被static修饰的代码会在编译时就被分配内存,程序退出时才会释放其内存,也就......
  • k8s pv与pvc持久化存储(静态与动态)
    k8spv与pvc持久化存储(静态与动态)PersistenVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理PV分为静态和动态,动态能够自动创建PV•PersistentVolumeC......
  • django_静态文件
    ***************************************************************************************************************************************************************......
  • 第二次Java课堂随笔(静态static的内容)
    老师的课件里面提到了Java中的静态导入内容,那么什么是静态导入呢?于是我在网上查了这个有关内容,百度给出的解释是这样的:Java静态导入实际上就是通过给导入包名中添加一个sta......
  • 静态static
    static关键字修饰变量和函数:1、局部变量2、全局变量3、函数static关键字最基本的用法是:1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一......
  • 动态语言和静态语言
    什么是静态语言?java就是静态语言,他的变量类型和值都是有类型的,类型要相符才能赋值什么是动态语言?javascript是动态语言,值有类型,但是变量没有类型,赋值没有要求,动态类型看......
  • 静态方法中如何使用Spring的注入对象
    问题:静态方法里边引用了非静态变量b,会直接报错静态方法中引用的b虽然用了@Autowired注解,但是该注解的注入是在静态方法加载之后执行的,所以此处的b在使用时为null当一......
  • UEC++ 结构体和枚举
    1、结构体在虚幻C++中结构体和普通C++结构体构建方式相同,但是如果希望构建于蓝图交互的结构体则需要额外的处理!UE支持结构体的构建和使用,但是由于蓝图特殊,普通的结构体......
  • C#教程 - 枚举器 & 迭代器(IEnumrator & Iterator)
    更新记录转载请注明出处:https://www.cnblogs.com/cqpanda/p/16691006.html2022年9月19日发布。2022年9月10日从笔记迁移到博客。枚举器(Enumerator)枚举器和可枚举......
  • 24. Fragment的产生、使用方法、静态(动态)添加fragment
    24.Fragment的产生、使用方法、静态(动态)添加fragment24.1Fragment的产生Android3.0之后不同的Fragment运行在同一个Activity之上。24.2什么是Fragment具备生命周......