Java 肤浅的平等和深刻的平等有什么区别?这是如何应用于缓存的?
在我的笔记中发现以下内容,但我无法理解: 基元类型包装类实现有限数量的缓存 价值观。Java 肤浅的平等和深刻的平等有什么区别?这是如何应用于缓存的?,java,caching,deep-copy,shallow-copy,Java,Caching,Deep Copy,Shallow Copy,在我的笔记中发现以下内容,但我无法理解: 基元类型包装类实现有限数量的缓存 价值观。 这就保证了有限数量的深度相等的包装器对象是 也大致相等: 如果o1.等于(o2)则o1==o2 例如,新整数(0)==新整数(0) 一般来说,这并不总是有效。 例如,新整数(666)=新整数(666) 可能不成立。 缓存的原因是它可以节省内存。 通常,缓存适用于“小”基本值 我不明白这是什么意思,也不明白深(.equals())和浅(=)equals之间有什么区别。我知道在实践中,.equals必须用于对象,=
这就保证了有限数量的深度相等的包装器对象是 也大致相等: 如果
o1.等于(o2)
则o1==o2
例如,
新整数(0)==新整数(0)
一般来说,这并不总是有效。
例如,新整数(666)=新整数(666)
可能不成立。
缓存的原因是它可以节省内存。
通常,缓存适用于“小”基本值 我不明白这是什么意思,也不明白深(.equals())和浅(=)equals之间有什么区别。我知道在实践中,.equals必须用于对象,==必须用于整数值,但实际的推理暗示了我
我假设通过名称,浅层可能只是检查两个值是否具有相同的类型和名称,而深层检查两个变量是否指向相同的对象?不过,我不知道缓存在这里是如何发挥作用的,也不知道它为什么会有用。当您执行
==
时,您正在比较引用是否相等。这意味着您要问“两个对象在内存中的地址是否相同?”
执行.equals()
操作时,您正在比较对象本身是否相等。这意味着你在说“这两个物体认为自己是平等的吗?”< /P>
所举的例子很差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>
请参阅此处更详细的答案(注释是一块宝石!):equals()测试两个对象是否本质上相同,但对于两个不同的对象,它可以返回true;i、 例如,两个不同的回形针“相等”。“==”对于引用类型,测试两个引用是否引用同一个对象,即回形针==仅引用自身测试身份,等于
测试等价性
您可以有两个不同的整数对象,其中包含0(它们是equals()
);缓存意味着保存对象并尽可能重用它们。您所谓的“浅相等”是标识:如果两个引用(即对象)是非常相同的实例,则它们是相同的。如果您知道其他语言中的指针是什么,您可以将标识与指针相等进行比较
你所说的“深度相等”就是相等:如果
a
和b
返回true
,那么两个对象a
和b
是相等的。等式的正确性很大程度上取决于equals
方法的实现方式。有关详细信息,请参阅对象
类的Javadoc。首先:新整数(0)==新整数(0)
将永不求值为真
,因为新
总是创建一个新对象,避开任何可能存在的自动装箱缓存机制
您可能听说过的是自动装箱(即在必要时将原语值自动转换为各自的包装类)。自动装箱使用一种机制,也可以使用包装类valueOf()
方法访问该机制。换句话说:将int
自动装箱到Integer
与调用Integer.valueOf(int)
的工作原理基本相同
Integer.valueOf(0)=Integer.valueOf(0)
将计算为true
,因为公共值(即具有较低绝对值的值)被缓存。当您连续两次调用valueOf(0)
时,将得到相同的
对象。对于较高的值(例如您的示例中的666),这不一定正确。实际上,浅/深解剖不同于==/equal解剖:
等于对象的
比较
等价,即“逻辑”值
两个,可能不完全相同
对象,是一样的。如果是两个人
物体
那是真的
a.equals(b) // if a != null
,但事实并非如此
案例等于
比较。
浅薄意味着你只能比较
要删除的两个对象的即时内容
找出他们在你的生活中是否“平等”
理智,而深沉意味着你
比较对象的内容
递归地,直到您需要
比较是基本字段。如果
您定义的方法等于
对象作为调用的序列
等于这些的实例字段上的
对象,则使用深度比较。如果
您可以使用=
运算符来比较复合类型,
比如字符串,然后使用浅层比较——这在Java中是不正确的
<> P>这一切的士气是,你绝不可以使用
newinteger(666)==newinteger(666)
。我建议你请你的教授澄清一下他的意思,因为如果他希望在考试中这样做,他对Java知之甚少
a.equals(b) // if a != null