Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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中的equal方法_Java - Fatal编程技术网

我应该在什么时候重写Java中的equal方法

我应该在什么时候重写Java中的equal方法,java,Java,所以在学校,我们第一次学习Java,我们想模拟一个Java库应用程序,在这个应用程序中,我们有两个名为Book的类和另一个名为one的类,在同一个书架上不可能有具有相同ISBN的书。所以我所做的就像下面的shelf类内部一样,它工作得很好 private boolean checkIsbnNumber(Book book){ boolean isbnTaken = false; for(Book bList : this.bookList){

所以在学校,我们第一次学习Java,我们想模拟一个Java库应用程序,在这个应用程序中,我们有两个名为Book的类和另一个名为one的类,在同一个书架上不可能有具有相同ISBN的书。所以我所做的就像下面的shelf类内部一样,它工作得很好

private boolean checkIsbnNumber(Book book){
        boolean isbnTaken = false;
        for(Book bList : this.bookList){
            if(bList.getIsbn().equals(book.getIsbn())){
                System.out.println("The books isbn number is taken");
                isbnTaken = true;
            }
        }
        return isbnTaken;
    }
但是我们的讲师告诉我们的是,在book类中,重写hash和equals方法,如下所示

@Override
    public boolean equals(Object obj) { 
        if (obj instanceof Book) 
            return isbn.equals(((Book)obj).isbn); 
        else 
            return false; 
    } 

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 53 * hash + Objects.hashCode(this.isbn);
        return hash;
    }
然后在shelf类内部再次执行以下操作

public boolean checkISBN(Book b){
        boolean isbnExists = false;
        for (Book bList : bookList)
        {
            if(bList.getIsbn().equals(b.getIsbn())){
                System.out.println("Book ISBN already exist");
                isbnExists = true;
            }
        }
        return isbnExists;  
    }
我想知道的是这样做的意义是什么?这有什么好处吗?为什么我们要在equals方法中再次调用equals方法?我们将非常感谢您的帮助

我想知道的是这样做的意义是什么

你的条件是没有两个ISBN是相同的。您正在更改等值方法,以便如果ISBN是相同的,它将考虑两个书本对象相等。

为什么我们要在equals方法中再次调用equals方法

您的ISBN是一个对象。当你比较两个物体时,如果你这样做

Object1 == Object2
然后测试它们是否是同一个对象。如果它们具有相同的值,则不会。当您调用equals时,您正在测试其他一些条件。例如,对于字符串

这是因为s与s2不是同一对象,但它具有相同的值

额外阅读

是对为什么需要重写hashCode方法的深入分析

这是一个非常详细的示例,详细说明了为什么需要对对象使用equals而不是==

我想知道的是这样做的意义是什么

你的条件是没有两个ISBN是相同的。您正在更改等值方法,以便如果ISBN是相同的,它将考虑两个书本对象相等。

为什么我们要在equals方法中再次调用equals方法

您的ISBN是一个对象。当你比较两个物体时,如果你这样做

Object1 == Object2
然后测试它们是否是同一个对象。如果它们具有相同的值,则不会。当您调用equals时,您正在测试其他一些条件。例如,对于字符串

这是因为s与s2不是同一对象,但它具有相同的值

额外阅读

是对为什么需要重写hashCode方法的深入分析

这是一个非常详细的示例,详细说明了为什么需要对对象使用equals而不是==

通常,您重写equals有两个原因:

您想为您的对象设置自定义相等语义,或者 您希望在哈希容器中使用对象。 在这两种情况下,您也必须重写hashCode

例如,如果希望在不修改book对象本身的情况下将注释附加到每本书,则使用适当的equals和hashCode可以执行以下操作:

Map<Book,String> comments = new HashMap<Book,String>();
comments.put(myBook, "This is a good book");
比写这个容易

if (book1.equals(book2)) ...
if (book1.getIsbn().equals(book2.getIsbn())) ...
通常,您重写equals有两个原因:

您想为您的对象设置自定义相等语义,或者 您希望在哈希容器中使用对象。 在这两种情况下,您也必须重写hashCode

例如,如果希望在不修改book对象本身的情况下将注释附加到每本书,则使用适当的equals和hashCode可以执行以下操作:

Map<Book,String> comments = new HashMap<Book,String>();
comments.put(myBook, "This is a good book");
比写这个容易

if (book1.equals(book2)) ...
if (book1.getIsbn().equals(book2.getIsbn())) ...

如果您真的想使用equals方法,那么您的比较应该如下所示:-

public boolean checkISBN(Book b){
    boolean isbnExists = false;
    for (Book bList : bookList)
    {
        if(**bList.equals(b)**){
            System.out.println("Book ISBN already exist");
            isbnExists = true;
        }
    }
    return isbnExists;  
}
注意高亮部分

你的讲师想这样做是为了理解equals方法的用法。 让我给你们解释一下你们的方法和他的方法之间的区别。那么这样做的好处是:- 1.不使用equals:-在这种方法中,您比较图书的ISBN,而不是将具有相同ISBN的图书放在书架上

以相等替代:- 首先,你是压倒平等,这意味着你说两本书有相同的ISBN是平等的。第二步,你可以比较书籍是否平等。 那么优势是什么呢,假设你需要在你的程序中进行基于相同等式的其他运算,那么你就不会到处写ISBN逻辑,你只需要写等式。 优点1:在现实世界中,软件的不同部分是由不同的人编写的,所以如果你在写这本书,其他人不需要知道是什么使这两本书相等。他的部分设计或要求,将两个写代码的基础上平等

优点2:-汤姆鲁姆,你决定书的平等性不仅基于ISBN号,还基于作者,你只需要更新equals方法,每个人的代码都能正常工作,不需要改变每个人


在真实编程世界中,面向对象的编码是针对真实对象进行的,有时是由于现实世界中的业务变化而导致的对象更改

如果您真的想使用equals方法,那么您的比较应该是这样的:-

public boolean checkISBN(Book b){
    boolean isbnExists = false;
    for (Book bList : bookList)
    {
        if(**bList.equals(b)**){
            System.out.println("Book ISBN already exist");
            isbnExists = true;
        }
    }
    return isbnExists;  
}
注意高亮部分

你的讲师想这样做是为了让学生理解 使用equals方法。 让我给你们解释一下你们的方法和他的方法之间的区别。那么这样做的好处是:- 1.不使用equals:-在这种方法中,您比较图书的ISBN,而不是将具有相同ISBN的图书放在书架上

以相等替代:- 首先,你是压倒平等,这意味着你说两本书有相同的ISBN是平等的。第二步,你可以比较书籍是否平等。 那么优势是什么呢,假设你需要在你的程序中进行基于相同等式的其他运算,那么你就不会到处写ISBN逻辑,你只需要写等式。 优点1:在现实世界中,软件的不同部分是由不同的人编写的,所以如果你在写这本书,其他人不需要知道是什么使这两本书相等。他的部分设计或要求,将两个写代码的基础上平等

优点2:-汤姆鲁姆,你决定书的平等性不仅基于ISBN号,还基于作者,你只需要更新equals方法,每个人的代码都能正常工作,不需要改变每个人


在真实的编程世界中,面向对象的编码是针对真实对象进行的,有时由于现实世界中的业务变化,对象会发生变化

嗯……我看不出有什么区别。除了private和public之外,惟一明显的变化是变量/方法名和输出文本。顺便说一句,在这里输出文本似乎是错误的。这个方法的实际作用,它的工作原理,一点也没有改变。嗯……我看不出有什么不同。除了private和public之外,惟一明显的变化是变量/方法名和输出文本。顺便说一句,在这里输出文本似乎是错误的。这个方法实际上做了什么,它是如何工作的,一点也没有改变。我确实得到了==部分,但我不明白的是为什么我要重写等号。为什么?因为这是惯例!我确实得到了==部分,但我不明白的是,为什么我要覆盖等于。为什么?因为这是惯例!我理解的第一部分比较简单,好吧,那么讲师也必须将代码更改为该代码,对吗?@Colouslol对,一旦你以同样的方式实现了equal,你的checkISBN就可以切换到使用if book1.equalsbook2代码。我理解的第一部分比较简单,好吧,那么讲师也必须将代码更改为该代码,对吗?@Colouslol对,一旦你以同样的方式实现了equal,你的checkISBN就可以切换到使用if book1.equalsbook2代码。在代码部分突出显示某些内容不是一个好的做法。好的,这对我来说是一个完美的理由,谢谢你的解释。Maximin感谢你的建议,但是我突出显示了我的作品和他的一样,只有一行。他是一名大学生,我想他可能会忽略这一点。我相信他也错过了同样的机会,因为他的勒克斯特错过了Sameno,这是一个很好的实践,可以突出代码部分中的某些内容。好吧,这对我来说是一个完美的理由,谢谢你的解释。Maximin感谢你的建议,但是我强调了我的作品和他的一样,只有一行。他是一名大学生,我想他可能会忽略这一点。我相信他也错过了同样的机会,而他的淫荡者也错过了同样的机会