大量的枚举类对性能(内存)影响大吗

逗泥丸的平方 2016-10-14 11:53:28
枚举类的内存模型是什么样的?

如果单纯只是为了保存一些键值对, 是不是map会更节约内存?

如果需要一些更复杂的操作,较多的方法,枚举值的形式,和map相比,哪个更好一些?
...全文
2253 15 打赏 收藏 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
逗泥丸的平方 2016-10-17
  • 打赏
  • 举报
回复
引用 13 楼 hemowolf 的回复:
用枚举可以有效地利用编译器查错 之前 java 没有枚举,有个老外用一种模式封装了枚举,后来的枚举基本原理和那个模式也差不多,思路几乎是一样的 在没有枚举的情况下,一般会用整数常量作为枚举值,但这样无法保证有使用类的人会正确使用它们。比如在 jdk 里,光标样式(正常、等待、手形状等)全部是用整数表示的,java.awt.Cursor 构造器也是传入一个整数值。但是在实际应用中,可能程序员传入一个无意义的枚举值,这时编译器无法检测到它是否合理,于是隐患就这样产生了。
嗯... 我想到的大概也是这种情况吧. 那么map<key,Bean>,当然也可以是map<Enum,Bean>的形式 和 直接用枚举来实现的方式哪个更好呢 ?
逗泥丸的平方 2016-10-17
  • 打赏
  • 举报
回复
引用 12 楼 bree06 的回复:
定义为字符串数组较好. String[] weeks = {null, ""星期一"", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; 要获取中文名的话直接使用下标就行了. 比如星期一, 可以weeks[1]; 只要不是写通用的jar包, 做公司的项目大家约定好就行不必使用枚举, java中的枚举编译后会生成一个Enum的对象继承和一组公共常量. java的枚举是一个有限制的类
星期几只是举了个例子,实际上可能是各种各样的业务字段. 而且,这种写法很危险吧... 谁知道几是几,这就要额外维护文档了. 而且使用数组的话,万一需要中间插入一个,那就完蛋了
小灰狼 2016-10-17
  • 打赏
  • 举报
回复
引用 10 楼 qq_35209952 的回复:
[quote=引用 8 楼 hemowolf 的回复:] 文章里说的是手机里运行的程序 对服务器来说,浪费一点内存关系不大。一个项目浪费个10M内存,换来软件的开发和维护效率都是值得的
不过,因为很少见到使用枚举类的情况, 不知道这种做法会不会真的提高开发维护效率呢? 可能是因为习惯吧, 感觉map和 static String似乎比 enum更加直观. 所以希望可以分享一下这方面 的经验~[/quote] 用枚举可以有效地利用编译器查错 之前 java 没有枚举,有个老外用一种模式封装了枚举,后来的枚举基本原理和那个模式也差不多,思路几乎是一样的 在没有枚举的情况下,一般会用整数常量作为枚举值,但这样无法保证有使用类的人会正确使用它们。比如在 jdk 里,光标样式(正常、等待、手形状等)全部是用整数表示的,java.awt.Cursor 构造器也是传入一个整数值。但是在实际应用中,可能程序员传入一个无意义的枚举值,这时编译器无法检测到它是否合理,于是隐患就这样产生了。
一不小心_ 2016-10-15
  • 打赏
  • 举报
回复
如果只是为了存储一两个值,那没必要枚举,只会消耗性能,大量创建不是很必要的枚举肯定是不好的
bree06 2016-10-15
  • 打赏
  • 举报
回复
定义为字符串数组较好. String[] weeks = {null, ""星期一"", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; 要获取中文名的话直接使用下标就行了. 比如星期一, 可以weeks[1]; 只要不是写通用的jar包, 做公司的项目大家约定好就行不必使用枚举, java中的枚举编译后会生成一个Enum的对象继承和一组公共常量. java的枚举是一个有限制的类
若鱼1919 2016-10-14
  • 打赏
  • 举报
回复
public void biz(int gender); public void biz(Enum gender); 这两个的区别还是很大的,比如: (1)要限定参数只能是男或者女,int就做不到,而枚举就很简单。当然你可以用gender==0||gender==1来判断,但是如果有十几个可选的值呢? (2)枚举是可以带有方法的,int就不行了。 (3)楼下的继续补充
逗泥丸的平方 2016-10-14
  • 打赏
  • 举报
回复
引用 8 楼 hemowolf 的回复:
文章里说的是手机里运行的程序 对服务器来说,浪费一点内存关系不大。一个项目浪费个10M内存,换来软件的开发和维护效率都是值得的
不过,因为很少见到使用枚举类的情况, 不知道这种做法会不会真的提高开发维护效率呢? 可能是因为习惯吧, 感觉map和 static String似乎比 enum更加直观. 所以希望可以分享一下这方面 的经验~
逗泥丸的平方 2016-10-14
  • 打赏
  • 举报
回复
引用 6 楼 goldenfish1919 的回复:
1.Enum并不是为了保持键值对的 2.内存优化指的是在android上,android的内存少,服务端开发这点内存是可以忽略的
那依赖Enum.ValueOf的编程算不算是对枚举值滥用呢 ? 依赖指的是甚至当成 map.get()来用 再一个方向是赋予枚举值更复杂的结构, 最近有一种想法,使用枚举值来对table进行定义,我想在枚举值的构造中,直接对字段进行详细的定义.

enum Items {
		LOGIN_ID("登录ID", 20), //
		LOGIN_PWD("登录PWD", 20), //
		START_TIME("传送开始时间", 4), //
		END_TIME("传送结束时间", 4);

		private int length;
		private String cnName;
		private String type;
		Items(String name) {
			this.cnName = name;
		}

		Items(String name, int length) {
			this(name);
			this.length = length;
		}
		Items(String name, int length , String type) {
			this(name,length);
			this.type = type;
		}
		public int getLength() {
			return length;
		}

		public String getCnName() {
			return cnName;
		}
这样可以把格式,校验之类的东西进行统一处理. 这种做法会不会很差呢 ?
小灰狼 2016-10-14
  • 打赏
  • 举报
回复
引用 5 楼 qq_35209952 的回复:
[quote=引用 4 楼 YidingHe 的回复:] 如果一个项目中有大量的(1000个以上)枚举,我会怀疑有滥用之嫌。
呃.. 是说1000个class ,还是说 一个枚举类里有1000个值... 我经历的项目(虽然我还年轻)中反倒很少见到枚举类(也许因为是十年左右的项目),不知道比较现代的项目里是不是经常会使用枚举类? 我在网上看到有人提到一个内存优化 http://blog.csdn.net/hp910315/article/details/48975655 就是把枚举类干掉.. 有这么夸张吗[/quote] 文章里说的是手机里运行的程序 对服务器来说,浪费一点内存关系不大。一个项目浪费个10M内存,换来软件的开发和维护效率都是值得的
若鱼1919 2016-10-14
  • 打赏
  • 举报
回复
Android应用程序的默认最大内存值为也就100多M,服务器动不动32个G,不是一个数量级的
若鱼1919 2016-10-14
  • 打赏
  • 举报
回复
引用 5 楼 qq_35209952 的回复:
[quote=引用 4 楼 YidingHe 的回复:] 如果一个项目中有大量的(1000个以上)枚举,我会怀疑有滥用之嫌。
呃.. 是说1000个class ,还是说 一个枚举类里有1000个值... 我经历的项目(虽然我还年轻)中反倒很少见到枚举类(也许因为是十年左右的项目),不知道比较现代的项目里是不是经常会使用枚举类? 我在网上看到有人提到一个内存优化 http://blog.csdn.net/hp910315/article/details/48975655 就是把枚举类干掉.. 有这么夸张吗[/quote] 1.Enum并不是为了保持键值对的 2.内存优化指的是在android上,android的内存少,服务端开发这点内存是可以忽略的
逗泥丸的平方 2016-10-14
  • 打赏
  • 举报
回复
引用 4 楼 YidingHe 的回复:
如果一个项目中有大量的(1000个以上)枚举,我会怀疑有滥用之嫌。
呃.. 是说1000个class ,还是说 一个枚举类里有1000个值... 我经历的项目(虽然我还年轻)中反倒很少见到枚举类(也许因为是十年左右的项目),不知道比较现代的项目里是不是经常会使用枚举类? 我在网上看到有人提到一个内存优化 http://blog.csdn.net/hp910315/article/details/48975655 就是把枚举类干掉.. 有这么夸张吗
捏造的信仰 2016-10-14
  • 打赏
  • 举报
回复
如果一个项目中有大量的(1000个以上)枚举,我会怀疑有滥用之嫌。
逗泥丸的平方 2016-10-14
  • 打赏
  • 举报
回复
可能描述还不太清楚.. 比如一周有7天,我要通过某种方式得到它的中文名字
public enum ChangedFields {
	MON("星期一"), //
	TUE("星期二"), //
	WED("星期三");
	String name = "";

	ChangedFields(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
}
这样的实现,和map相比,哪个更好呢 ?
逗泥丸的平方 2016-10-14
  • 打赏
  • 举报
回复
引用 1 楼 goldenfish1919 的回复:
public void biz(int gender); public void biz(Enum gender); 这两个的区别还是很大的,比如: (1)要限定参数只能是男或者女,int就做不到,而枚举就很简单。当然你可以用gender==0||gender==1来判断,但是如果有十几个可选的值呢? (2)枚举是可以带有方法的,int就不行了。 (3)楼下的继续补充
呃.. 我是说和map比, 感觉枚举更多的情况下被用来表达"自己是什么",而map是通过标记找到"他的键"代表的是什么.
大气污染是影响公众健康与生态环境的重要问题,精准的空气质量时空预测与污染源贡献度量化是精准治污的关键支撑。针对现有研究多源融合不充分、时空关联刻画不足、预测与源解析割裂三方面缺陷,本文设计实现了城市空气质量时空预测与污染源贡献度分析系统,融合监测、气象、工业排放与交通四类数据,构建基于时空注意力的LSTM(STAM-LSTM)预测模型与基于正定矩阵因子分解(PMF)的源解析模型,形成数据融合-特征工程-预测-源解析-可视化闭环。 系统实现四类数据时空对齐与融合,构建时序与空间邻域特征,以普通克里金插值生成1km网格浓度场;STAM-LSTM引入时空注意力自适应学习站点间污染传输时变权重,以72小时输入预测未来24小时逐小时PM2.5浓度;PMF识别交通、工业、燃煤、扬尘与二次生成五个源因子,量化各源全年贡献度并分析时空演变。 实验表明:STAM-LSTM预测RMSE 24.6、MAE 17.8、R² 0.88,相对LSTM基线(30.2)提升18.5%;普通克里金插值误差8.9,优于反距离加权(11.4);源解析显示交通源28.4%、工业源23.1%、燃煤源19.6%为主要贡献源,冬季燃煤源升至27.3%、早高峰交通源达34.8%,下风向工业源贡献高出上风向8~12个百分点;减排情景显示交通源减排20%可使年均PM2.5下降5.7%,与源贡献度排序一致。 系统按五模块14组件实现,功能测试16项用例全部通过,为大气污染预警、源管控与减排政策制定提供了决策依据。 【课程报告内容】 摘要 第1章 绪论 第2章 相关技术与理论 第3章 系统需求分析 第4章 系统总体设计 第5章 系统详细设计与实现 第6章 系统测试与分析 第7章 总结与展望 参考文献 附件-实现指南

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧