Java 使用“比较保存在ArrayList中的对象”;布尔等于();

Java 使用“比较保存在ArrayList中的对象”;布尔等于();,java,arraylist,boolean,equals,Java,Arraylist,Boolean,Equals,我有一个类叫做产品。此类具有名称和价格。 我可以通过以下方式创建产品: Product book = new Product(); book.setName("book"); book.setPrice(3); 之后,我应该检查一下这个产品是否已经存在于ArrayList中,我应该将它保存到,如果不存在,我就把它放在那里。我应该使用以下方法来完成此操作: public boolean equals(Object obj){ } 问题是,如果我应该保存产品的ArrayList在public

我有一个
叫做
产品
。此类具有
名称
价格
。 我可以通过以下方式创建产品:

Product book = new Product();
book.setName("book");
book.setPrice(3);
之后,我应该检查一下这个产品是否已经存在于
ArrayList
中,我应该将它保存到,如果不存在,我就把它放在那里。我应该使用以下方法来完成此操作:

public boolean equals(Object obj){

}
问题是,如果我应该保存产品的
ArrayList
public static void main
中创建并初始化,而这个
boolean
是在
ArrayList
存在之前创建的,我该怎么做

我是否应该将
类本身设置为
ArrayList
,就像这样

public class ArrayList<Product>{
}
公共类数组列表{
}

不要担心它的存在。由于您在产品类中过度定义了equals方法,所以可以在下面尝试这样做

if(yourArayList.contains(book)){
   // it existed in the list
 }else{
   yourArayList.add(book);
}

当您调用contains方法时,它会在内部调用Product方法的equals方法,而不是传递给它的对象。

不要担心它的存在。由于您在产品类中过度定义了equals方法,所以可以在下面尝试这样做

if(yourArayList.contains(book)){
   // it existed in the list
 }else{
   yourArayList.add(book);
}
当您调用contains方法时,它会在内部调用Product方法vs传递给它的对象的equals方法

这个
boolean
是在
ArrayList
存在之前创建的

你误解了
等于
的工作方式。它不会“创建”一个
布尔值
,直到您使用某个对象作为参数调用它,并且它会根据您传递的对象的属性返回一个
布尔值

当您定义
equals
方法时,您提供了确定相等性的代码,但此时您没有做出任何决定:

@Override
public boolean equals(Object obj){
    if (obj == this) return true
    if (!(obj instanceof Product)) return false;
    Product other = (Product)obj;
    if (!other.getName().equals(getName())) return false;
    if (!other.getPrice() == getPrice()) return false;
    return true;
}
@Override
public int hashCode() {
    return 31*getName().hashCode() + getPrice();
}
现在,如果列表中有您的
产品
,您可以使用
equals
以以下两种方式之一进行删除:

  • 使用
    contains
    -此方法调用
    equals
    检查包含,或
  • 迭代所有对象,并手动调用
    equals
这个
boolean
是在
ArrayList
存在之前创建的

你误解了
等于
的工作方式。它不会“创建”一个
布尔值
,直到您使用某个对象作为参数调用它,并且它会根据您传递的对象的属性返回一个
布尔值

当您定义
equals
方法时,您提供了确定相等性的代码,但此时您没有做出任何决定:

@Override
public boolean equals(Object obj){
    if (obj == this) return true
    if (!(obj instanceof Product)) return false;
    Product other = (Product)obj;
    if (!other.getName().equals(getName())) return false;
    if (!other.getPrice() == getPrice()) return false;
    return true;
}
@Override
public int hashCode() {
    return 31*getName().hashCode() + getPrice();
}
现在,如果列表中有您的
产品
,您可以使用
equals
以以下两种方式之一进行删除:

  • 使用
    contains
    -此方法调用
    equals
    检查包含,或
  • 迭代所有对象,并手动调用
    equals

    • 您不需要创建自己的ArrayList类。 如果您实现了you equals right,当您执行
      myList.contains(book)

      实际上,有一种结构允许您跳过代码中的检查。您可以使用
      java.util.HashSet
      。它确保不能添加重复项。此外,它还返回一个布尔值,表示是否添加了元素。例如

      Set<Product> mySet = new HashSet<>(); 
      boolean added = mySet.add(book);
      
      Set mySet=new HashSet();
      boolean added=mySet.add(book);
      

      请不要忘记易于遵循的规则-在定义equals时,还要定义hashCode。如果使用IDE,则可以轻松地生成它们

      您不需要创建自己的ArrayList类。 如果您实现了you equals right,当您执行
      myList.contains(book)

      实际上,有一种结构允许您跳过代码中的检查。您可以使用
      java.util.HashSet
      。它确保不能添加重复项。此外,它还返回一个布尔值,表示是否添加了元素。例如

      Set<Product> mySet = new HashSet<>(); 
      boolean added = mySet.add(book);
      
      Set mySet=new HashSet();
      boolean added=mySet.add(book);
      

      请不要忘记易于遵循的规则-在定义equals时,还要定义hashCode。如果使用IDE,则可以轻松地生成它们

      在ArrayList存在之前,不会创建此布尔值

      您需要覆盖Product的equals()方法,如下所示:

      @Override
      public boolean equals(Object obj) {
          if(obj == this) return true; // Both objects have the same reference -> the objects are equal
          if((obj == null) || (obj.getClass() != this.getClass())) return false; // Classes are different -> objects are different
          Product p = (Product) obj; // Cast obj into Product
          if( (this.getPrice() == p.getPrice()) && (this.getName().equals(p.getName())) ) return true; // Price and name are the same -> both products are the same
          return false; // At this point the two objects can't be equal
      }
      
      以下是创建ArrayList的方法:

      ArrayList<Product> products = new ArrayList<Product>();
      

      在ArrayList存在之前,不会创建此布尔值

      您需要覆盖Product的equals()方法,如下所示:

      @Override
      public boolean equals(Object obj) {
          if(obj == this) return true; // Both objects have the same reference -> the objects are equal
          if((obj == null) || (obj.getClass() != this.getClass())) return false; // Classes are different -> objects are different
          Product p = (Product) obj; // Cast obj into Product
          if( (this.getPrice() == p.getPrice()) && (this.getName().equals(p.getName())) ) return true; // Price and name are the same -> both products are the same
          return false; // At this point the two objects can't be equal
      }
      
      以下是创建ArrayList的方法:

      ArrayList<Product> products = new ArrayList<Product>();
      

      解释得有点简短,但还是要谢谢你我的解释有点简短,但还是要谢谢你感谢您的解释感谢您的解释3我想避免使用HashSet,因为我还没有完全理解它,但我感谢您的帮助和花时间来编写它^_^我想避免使用HashSet,因为我还没有完全理解它,但是我感谢您的帮助和花时间来编写它^_^非常感谢你花时间写这篇文章。在每一行上使用注释的解释确实帮助我理解3请注意,在调用
      obj.getClass()
      之前,应检查是否存在
      obj==null
      ,以避免出现NullPointerException。您还经常在第一次检查时检查
      obj==this
      ,因为一个对象应该等于它自己,而且这比方法的其余部分要轻得多。@AndyTurner谢谢注意,我忘了这一点。我据此编辑了我的答案。非常感谢你花时间写这篇文章。在每一行上使用注释的解释确实帮助我理解3请注意,在调用
      obj.getClass()
      之前,应检查是否存在
      obj==null
      ,以避免出现NullPointerException。你也经常