Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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 - Fatal编程技术网

Java 对象等于方法为==和浅复制

Java 对象等于方法为==和浅复制,java,Java,我有 这里的equals不是==,它应该比较哈希代码,对吗?因为它是一个物体。 资料来源: 但在我的笔记上,它说这里的equal方法意味着== 我的笔记错了吗 我的笔记说object类有aclone()方法,但它有一个空的实现, 由于这个原因,不允许对象类的对象调用此方法 有人能解释一下吗?我想我误解了一些东西=比较对象引用-它们是完全相同的内存引用吗equals是每个类实现的一种方法,通常用于进行更有用的比较(例如,如果两个字符串包含相同的字符,或者如果两个列表包含相同的内容) 但是,Obje

我有

这里的equals不是==,它应该比较哈希代码,对吗?因为它是一个物体。 资料来源:

但在我的笔记上,它说这里的equal方法意味着==

我的笔记错了吗

我的笔记说object类有aclone()方法,但它有一个空的实现, 由于这个原因,不允许对象类的对象调用此方法


有人能解释一下吗?我想我误解了一些东西

=
比较对象引用-它们是完全相同的内存引用吗
equals
是每个类实现的一种方法,通常用于进行更有用的比较(例如,如果两个字符串包含相同的字符,或者如果两个列表包含相同的内容)

但是,
Object
中的默认实现只是返回到执行
=
比较,因此对于该类的实例,没有区别。

  • =
    检查对象引用上下文中的对象标识

    Object o = new Object()
    o == o.clone(); //I understand this should be false since it's different two arraylist pointing to the same object right?
    o.equals(o.clone())  //it's true if it's shallow copy since pointing at the same one
    
    仅在基本数据类型(
    boolean
    byte
    short
    int
    long
    char
    float
    double
    )的上下文中,
    =
    检查值。1

  • equals
    方法只不过是一种使对象能够将自身与其他对象进行比较的方法。
    的文档等于
    对程序员应该如何实现该方法设置了要求,但从技术上讲,程序员可以做任何他想做的事情

    Object.equals(Object)
    的实现只是
    返回this==obj)

  • equals
    方法不应依赖或调用
    hashCode()
    ,因为根据
    equals
    被认为不相等的两个对象可能具有相同的哈希代码。
    hashCode
    的唯一要求是相反的:它必须通过
    equals
    方法为所有被认为相等的对象返回相同的哈希代码



1正如Andreas在评论中已经提到的,从技术上讲,Andreas总是检查值。这也适用于对象引用,因为对象引用本身就是值。

这与…什么相反?关于
hashCode
,这个答案是不正确的(我已经对它进行了评论,希望它很快会得到修复)-比较
hashCode
值不是
equals
的默认实现,而且不应该是
equals
的实现-对于
hashCode
,可能有多个具有相同结果的非相等对象。也就是说,无论何时重写
等于
,都应该始终重写
hashCode
,以便相等的对象生成相同的哈希。请作为初级读物阅读。我已经为你的另一个问题添加了我自己的答案,希望它能对解释这个概念有所帮助。@Krease所以根据链接equals mean==但我在objects compare hashcode中学会了equals,但是==意味着检查值否?
equals
并不“意味着”
=
equals
只是一种使对象能够将自己与其他对象进行比较的方法。它的默认实现(即
Object.equals(Object)
)是检查标识(即
=
)。“这里equals[…]应该比较哈希代码,对吗?”不,
equals()
不比较哈希代码。假设你在你的类上实现了这个方法,那么它不知道你编码它要做什么。对于
对象
类,
equals()
被实现为使用
=
,因此对于
对象
(以及没有
equals()
实现的任何类,
equals()
=
相同,但它(应该)永远不要比较散列码。从技术上讲,
=
总是检查值,只是如果值是引用,则检查的是引用值(对象标识)。@Andreas你是对的,就像Java总是按值传递一样。我将把它添加到我的答案中。
Foo f1 = new Foo();
Foo f2 = f1; // Both f1 and f2 refer to the same object.
// f1 == f2 returns true
Foo f3 = new Foo(); // A second instance of Foo is created
// f1 == f3 returns false