Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 肤浅的平等和深刻的平等有什么区别?这是如何应用于缓存的?_Java_Caching_Deep Copy_Shallow Copy - Fatal编程技术网

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>这一切的士气是,你绝不可以使用==/COD>比较两个复合对象,除非你认为它们是相同的,除非它们是相同的。

    嗯,你的注释是完全错误的。code>newinteger(0)==newinteger(0)
    永远不会为真,也不会
    newinteger(666)==newinteger(666)
    。我建议你请你的教授澄清一下他的意思,因为如果他希望在考试中这样做,他对Java知之甚少
    a.equals(b) // if a != null