gpt4 book ai didi

java - 浅层平等和深层平等有什么区别?这如何应用于缓存?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:47:55 28 4
gpt4 key购买 nike

在我的笔记中发现了以下内容,但我无法理解:

Primitive type wrapper classes implement caching for a limited number of values.
This guarantees that a limited number of deeply equal wrapper objects are also shallowly equal: If o1.equals( o2 ) then o1 == o2.
For example, new Integer( 0 ) == new Integer( 0 ).
In general this does not always work.
For example, new Integer( 666 ) == new Integer( 666 )
may not hold.
The reason for caching is that it saves memory.
In general caching works for “small” primitive values.

我不明白这是什么意思,或者深 (.equals()) 和浅 (==) 之间的区别是什么。我知道在实践中,.equals 必须用于对象,== 用于整数值,但实际的推理暗示了我。

我根据名称假设,shallow 可能只是检查两个值是否具有相同的类型和名称,而 deep 检查两个变量是否指向同一个对象?不过,我不明白缓存在这里如何发挥作用,或者它为什么有用。

最佳答案

当您执行 == 时,您正在比较引用的相等性。这意味着您在说“两个对象在内存中的地址是否相同?”

当您执行 .equals() 时,您是在比较对象本身是否相等。这意味着您在说“这两个对象是否认为自己相等?”

给出的例子很差。 JLS 强制对这些数字进行的唯一缓存是 .valueOf() 方法。不缓存构造函数。

此外,JLS 仅指定了您必须缓存的最小值 [-128:127]。 JVM 实现可以选择缓存更多。这意味着 Integer.valueOf(500) == Integer.valueOf(500) 在某些机器上可能是 false,但在其他机器上可能是 true

class biziclop {

public static void main(String[] args) {
System.out.println(new Integer(5) == new Integer(5));
System.out.println(new Integer(500) == new Integer(500));

System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
}
}

结果:

C:\Documents and Settings\glow\My Documents>java biziclop
false
false
true
false

C:\Documents and Settings\glow\My Documents>

在这里查看更详细的答案(评论是一个 gem !):Why do people still use primitive types in Java?

关于java - 浅层平等和深层平等有什么区别?这如何应用于缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5703609/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com