1l和(长)1之间的差异

62o28rlo  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(720)

这个问题在这里已经有答案了

显式类型转换与对float/double java使用后缀-区别(6个答案)
上个月关门了。
一位同事在公关中加了一条评论,说我们应该用1l而不是(长)1。唯一的解释是我的同事给出的是,它方便使用和阅读1l。所以我的问题是,除了可读性,1l还有其他好处吗?
我的代码

void getUserId() {
    assert((long) 1, userService.getUserId())
}

userService.getUserId() returns long value i.e 1
assert() accepts two long object
idfiyjo8

idfiyjo81#

一个很好的理由是使用语言提供的最简单的方式。
遵循惯例也很重要:我从java还是个婴儿的时候就开始编写它,而且我以前从未见过java long 使用 (long) 演员阵容。

t2a7ltrp

t2a7ltrp2#

解释

性能方面没有区别。 (long) 1 是一个常量表达式(因为 1 因此,根据java语言规范(jls)的规则,将是 long 已经编译好了。
然而,根据我的经验,人们使用 long 文字和书写 1L 为了可读性。

int文字越界

当你实际使用时,你会看到一些不同 int 32位整数范围之外的值的文本。例如:

(long) 100_000_000_000

习惯于编译,你必须使用 long 并添加 L 去吧。

字节码

考虑以下两个示例代码段:

System.out.println((long) 5);

// versus

System.out.println(5L);

现在看看他们的字节码:

0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc2_w #3 // long 5l
6: invokevirtual #5

两者编译成完全相同的代码 ldc2_w 直接加载 long 放在烟囱上。所以没有从 intlong 运行时不再需要。

捷豹路虎

jls在第15章中解释了这种行为。表达:
有些表达式的值可以在编译时确定。这些是常量表达式(§15.28).
其中规定:
常量表达式是表示基元类型的值或字符串的表达式,该值或字符串不会突然完成,并且只使用以下内容组成:[…]
原语类型的文字和字符串类型的文字(§3.10.1, §3.10.2, §3.10.3, §3.10.4, §3.10.5)
强制转换为基元类型和强制转换为类型字符串(§15.16)
所以代码段,因为它只包含一个原语文本和一个对原语类型的转换,被认为是一个常量表达式,因此将在编译时进行计算。

相关问题