我有一个JAVA程序,它将EPOCH时间戳转换为日期,我们有两个建议的解决方案。一个只有3行代码,另一个大约10行。两者都产生正确的结果,操作次数相同,除了以下内容:
代码1: Date d = new Date;
d = setTime(arg1*1000);
代码2: Date d = new Date;
long timestamp = arg1 * 1000;
d = setTime(timestamp);
这里有区别吗?可能是效率?或者内存使用?我不完全确定代码2是否使用了更多的内存,因为它声明了一个变量"时间戳"。输入需要的。谢谢!
如果时间戳变量没有在其他任何地方使用,那么这两种方法同样是最优的。由于计算量不是太大而无法读取,java只需要计算一次。
JVM Optimization
注释和答案都是正确的,没有必要担心这样的效率,因为JVM编译器和运行时非常擅长优化。保持代码简单为这种优化提供了最大的机会。换句话说,为智能JVM编写愚蠢的代码。
通常鼓励使用明智的名称创建中间变量:
- 使您的代码更加自文档化。
- 现代jvm擅长于有效地处理和处置任何这样的短寿命对象。编译器可能已经优化掉了额外的变量,并将值内联了。 最重要的是,调试是如此容易。在跟踪完整的代码时,您可以看到每个增量更改/操作的发生。命名的变量创建了一个值目录,供您在调试器工具中查看。
所以关注可读性,让你的代码易于人们理解。为此,我将:
- 改变语句的顺序。通常最好在使用数据之前准备好数据,所以在计算毫秒数之前不要开始实例化
Date
对象。 - 利用
java.util.Date
构造函数删除一行代码。 - 将变量名更改为自记录。
- 在数字文本中插入下划线以使数字更易于阅读。
- 将大写
L
附加到数字字面值。由于编译器可以将int
增大到long
,所以在这种特殊情况下,附加可能不是技术上必要的,但L
向读者强调,我们正在努力创建long
而不是更常见的int
。
long millisecondsSinceEpoch = ( secondsSinceEpoch * 1_000L ) ;
Date date = new Date( millisecondsSinceEpoch ) ;
<标题> java.time h1> 好是完全避免旧的java.util.Date/。日历类是出了名的麻烦。在Java 8及以后的版本中,这些类已经被新的Java所取代。时间包。Instant instant = Instant.ofEpochSecond( secondsSinceEpoch ) ;
标题>标题>
没有显著的差异,只是你喜欢哪种风格。如果值不止一次使用,我通常使用第二种样式,否则使用第一种样式。这取决于可读性和以后修改代码的容易程度。
我有自己的原则。如果这段代码可以抛出异常,那么我就把它放在单独的一行中。我讨厌对这样的问题进行故障排除:堆栈跟踪指向具有多个潜在Java异常源的行。在您的示例中,乘法不会抛出异常,因此根据我的规则,可以与setTime()方法调用放在同一行。