Uri*_*Uri 10 java primitive equals
我想确定Java中的一些东西:如果我有一个字符或一个整数或一个Long以及那些东西,我应该使用equals还是==足够?
我知道使用字符串并不能保证每个唯一字符串只有一个实例,但我不确定其他盒装类型.
我的直觉是使用平等,但我想确保我不浪费表现.
Jon*_*eet 30
编辑:该规范为拳击转换提供了一些保证.从5.1.7节:
如果被装箱的值p为true,false,一个字节,范围为\ u0000到\ u007f的char,或者介于-128和127之间的int或短号,则让r1和r2为任意两个装箱转换的结果p.始终是r1 == r2的情况.
请注意,实施可以使用更大的池.
我真的会避免编写依赖于它的代码.不是因为它可能会失败,而是因为它并不明显 - 很少有人能够很好地了解规范.(我之前认为它是依赖于实现的.)
您应该使用equals或比较基础值,即
if (foo.equals(bar))
Run Code Online (Sandbox Code Playgroud)
要么
if (foo.intValue() == bar.intValue())
Run Code Online (Sandbox Code Playgroud)
请注意,即使自动装箱保证使用固定值,其他呼叫者也总能创建单独的实例.
如果要比较任何对象的值,请使用.equals().
甚至(尤其是)如果那些对象是原始包装类型Byte,Character,Short,Integer,Long,Float,Double和Boolean.
" =="只会比较对象身份和你很少,你很想要的东西.并且事实上并不是你想要的原始包装器.
仅用于==以下两种情况之一:
enums的比较,因为值绑定到对象标识)如果装箱的值 p 为 true、false、字节、\u0000 到 \u007f 范围内的字符,或者 -128 到 127 之间的 int 或短数字,则令 r1 和 r2 为任意两个装箱转换的结果p。r1 == r2 的情况总是如此。
和:
讨论
理想情况下,装箱给定的原始值 p 总是会产生相同的引用。实际上,使用现有的实现技术这可能不可行。上述规则是务实的妥协。上面的最后一个子句要求始终将某些公共值装箱到无法区分的对象中。实现可以延迟或急切地缓存它们。
对于其他值,此公式不允许程序员对装箱值的身份进行任何假设。这将允许(但不要求)共享部分或全部这些引用。
这确保了在大多数常见情况下,该行为将是所需的行为,而不会造成过度的性能损失,尤其是在小型设备上。例如,内存限制较少的实现可能会缓存所有字符和短整型,以及 -32K - +32K 范围内的整数和长整型。
因此,在某些情况下 == 会起作用,但在许多其他情况下则不会。为了安全起见,请始终使用 .equals,因为您无法(通常)授予实例的获取方式。
如果速度是一个因素(大多数 .equals 以 == 比较开始,或者至少它们应该)并且您可以保证它们是如何分配的并且它们符合上述范围,那么 == 是安全的。
某些虚拟机可能会增加该大小,但假设语言规范指定的最小大小比依赖特定虚拟机行为更安全,除非您确实确实需要这样做。
| 归档时间: |
|
| 查看次数: |
32506 次 |
| 最近记录: |