首页 > 其他分享 >项目实战中使用枚举类enum的 values() 方法进行枚举元素匹配优化

项目实战中使用枚举类enum的 values() 方法进行枚举元素匹配优化

时间:2022-12-03 23:31:50浏览次数:37  
标签:OrderStatusEnum Lcom jaemon enum ele 枚举 values public


验证代码

枚举类型

public enum OrderStatusEnum {
CREATE(1),
COMPLETE(10);

private int status;

OrderStatusEnum(int status) {
this.status = status;
}

private static final OrderStatusEnum[] VALUES = OrderStatusEnum.values();
public static OrderStatusEnum matcher(int value) {
// 方式1
/*for (OrderStatusEnum ele : values()) {
if (ele.status == value) {
return ele;
}
}*/

// 方式2 - 推荐
for (OrderStatusEnum ele : VALUES) {
if (ele.status == value) {
return ele;
}
}
return OrderStatusEnum.CREATE;
}

}

验证代码

public class AnswerEnumApp {

public static void main(String[] args) {
for (int i = 0; i < 100000000; i++) {
OrderStatusEnum orderStatusEnum = OrderStatusEnum.matcher(1);
}
}

}

JVM 启动参数: -Xms100M -Xmx100M -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError

结论

使用​​方式1​​​进行枚举元素匹配的话, 系统会进行多次的GC, 使用​​方式2​​的话, 系统GC次数是1次

原因

public class AnswerEnumApp {

public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(OrderStatusEnum.values());
}
}

}

程序运行输出

[Lcom.jaemon.OrderStatusEnum;@531d72ca
[Lcom.jaemon.OrderStatusEnum;@22d8cfe0
[Lcom.jaemon.OrderStatusEnum;@579bb367
[Lcom.jaemon.OrderStatusEnum;@1de0aca6
[Lcom.jaemon.OrderStatusEnum;@255316f2
[Lcom.jaemon.OrderStatusEnum;@41906a77
[Lcom.jaemon.OrderStatusEnum;@4b9af9a9
[Lcom.jaemon.OrderStatusEnum;@5387f9e0
[Lcom.jaemon.OrderStatusEnum;@6e5e91e4
[Lcom.jaemon.OrderStatusEnum;@2cdf8d8a

说明: values() 方法返回的为数组, 每次调用枚举类对应的 values() 方法返回的数组对象都不相同(即: 其在内存中的存储地址不相同)

项目中排查

# 获取服务的PID
jps -lmv
# 保存堆信息
jmap -dump:format=b,file=HeapDump.bin <PID>
# 分析内存中对象情况
jhat -J-mx1024m -stack false -port 7001 HeapDump.bin
# 访问地址, 并根据项目包名或类名搜索相关类在内存中的实例个数
http://localhost:7001/histo/


标签:OrderStatusEnum,Lcom,jaemon,enum,ele,枚举,values,public
From: https://blog.51cto.com/u_15891990/5908832

相关文章

  • 【C语言】【枚举】口袋中有红,黄,蓝,白,黑5种颜色的球若干个。每次从口袋中先后取出3个球
    #include <stdio.h>intmain(){ enumColor{red,yellow,blue,white,black};  //声明枚举类型//  enumColori,j,k,pri;   //定义枚举变量//  intn,loo......
  • 二进制枚举模版
    模版1#include<bits/stdc++.h>usingnamespacestd;intmain(){ intn; intb[100]; cin>>n; for(inti=0;i<=n;i++)b[i]=0; while(b[0]==0){ for(inti=1;......
  • C# 中枚举的使用
    枚举定义枚举对应的值也可以直接写成10进制[Flags]publicenumDays{None=0b_0000_0000,//0Monday=0b_0000_0001,//1Tuesday=0b......
  • 道长的算法笔记:通过回溯暴力枚举
    (一)排列与组合通常通常循环来做暴力枚举是有局限性,通过回溯算法来做枚举往往会更加优雅,回溯算法中两个重要的模型便是组合模型与排列模型。题目思路描述LC......
  • Use Closures Not Enumerations
    ​​http://c2.com/​​ UseClosuresNotEnumerationsIwasreallydisappointedwhenthisturnedoutnottobereferringtoenums... Thisisoneofthe ​​J......
  • 共用体和枚举类型
    描述有n个人员的数据,其中有老师和学生。学生的数据中包括姓名,号码,性别,职业,班号;老师的数据中包括:姓名,号码,性别,职业,职务。可以看出,学生和老师的数据是不同的,学生有班号而没职......
  • 枚举小例子记录
    1、创建枚举类:packagecom.atguigu.common.constant;publicclassProductConstant{publicenumAttrEnum{ATTR_TYPE_BASE(1,"基本属性"),ATTR_TYPE_SALE......
  • C#后续任务条件参数:TaskContinueOption --枚举类型
    一、概述一个线程可以有多个任务,一个任务也可以包含多个任务。把一个任务附加给另一个任务,就需要用到ContinueWith()。该方法是Task类中的方法,有多个重载,其中最基......
  • 常量和枚举的区别
    常量和枚举最大的不同是,枚举是可以穷举的“常量”,比如性别,只有那几种;而常量则是可以有无限多种,一般是用来处理魔法值的,让魔法值限定在某个类里,比如错误通知内容,短信通知内......
  • java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名
    ***测试demo  git仓库: ​​https://github.com/alwaysInRoad/test-enum-demo.git​​             测试demo内的代码是从实际项目中抽离出来......