Alb*_*s32 6 java caching deep-copy shallow-copy
在我的笔记中找到以下内容,但我无法理解它:
基元类型包装类为有限数量的值实现缓存.
这保证了有限数量的深度相等的包装器对象也非常相等:如果那样的o1.equals( o2 )话o1 == o2.
例如,new Integer( 0 ) == new Integer( 0 ).
一般来说,这并不总是有效.
例如,新的Integer(666)== new Integer(666)
可能不成立.
缓存的原因是它可以节省内存.
通常,缓存适用于"小"原始值.
我不明白这是什么意思,或深(.equals())和浅(==)等于之间的区别.我知道在实践中,.equals必须用于对象,而==用于Integral值,但实际的推理却暗示了我.
我假设名称浅浅可能只是检查两个值是否具有相同的类型和名称,深层检查两个变量是否指向同一个对象?我不知道缓存会如何在这里发挥作用,或者为什么它会有用.
当您这样做时,==您将比较相等的参考.这意味着你说"两个对象的内存地址是否相同?"
当你这样做时,.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));
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
C:\Documents and Settings\glow\My Documents>java biziclop
false
false
true
false
C:\Documents and Settings\glow\My Documents>
Run Code Online (Sandbox Code Playgroud)
在这里查看更详细的答案(评论是宝石!):为什么人们仍然在Java中使用原始类型?
实际上,浅/深解剖不同于== /同等解剖:
==比较对象标识,即你检查操作数是否实际上是相同的(对同一内存区域的两个引用),而equals对象等价的比较,即两个的"逻辑"值,可能不是相同的对象,是相同.如果是两个对象
a == b
Run Code Online (Sandbox Code Playgroud)
那是真的
a.equals(b) // if a != null
Run Code Online (Sandbox Code Playgroud)
,但在所有情况下都不一样.
equals比较.Shallow意味着您只比较两个对象的直接内容以查找它们在您的意义上是否"相等",而deep意味着您递归地比较对象的内容,直到您需要比较的所有内容都是原始字段.如果equals将对象的方法定义为equals对这些对象的实例字段的调用序列
,则使用深度比较.如果你定义equals使用==
运算符来比较复合类型,比如字符串,那么你使用浅层比较 - 这在Java中是不正确的.所有这一切的士气是你绝不能==用来比较两个复合对象,除非你认为它们是相同的,只有它们是相同的.