【问题标题】:Java Arraylist.contains(Object) always returns false [duplicate]Java Arraylist.contains(Object) 总是返回 false [重复]
【发布时间】:2015-08-08 16:42:52
【问题描述】:

基本上我想创建一个“螺丝”类。此类应按类型、长度、厚度等描述螺钉。我还想创建一个“存储”类,以各种形式存储所说的“螺钉”。类型、长度等限制为 7 和 3(所以可能性有限)

public class Screws{
public Screws(int typ,double durchmesser,double laenge,double gangHoehe){
    this.schraubenArt = typ;
    this.durchmesser=durchmesser;
    this.laenge=laenge;
    this.gangHoehe=gangHoehe;
  }
}

现在我想创建一个存储“单元”,它将是一个数组列表。我想用“螺丝”的对象填充它。之后我希望能够检查列表中是否包含某个 Scredobject。

import java.util.ArrayList;
public class Lager {

private Screws schrauben;
private ArrayList<Screws>Kreuzschlitzlager;

public Lager(){
Kreuzschlitzlager = new ArrayList<>();

for(int durchmesser=0; durchmesser <=3; durchmesser++){
    for(int laenge=0; laenge <= 3; laenge++){
        for(int ganghoehe=0; ganghoehe <=3; ganghoehe++){
            Kreuzschlitzlager.add(new Screws (1,durchmesser,laenge,ganghoehe);); 
    }}}}

public boolean checkForObject(Screws object){
    return Kreuzschlitzlager.contains(object);
}

现在我的问题是,我得到了一长串对象,我可以“获取”其属性,但如果我 checkForObject(Anything),它总是会给我一个“假”。我不知道为什么。别担心螺丝类,它还没有完成。 :D 那么,我如何检查一个数组列表是否包含某个对象,为什么它在这种情况下不起作用,我可以用 .IndexOf 获取对象的索引吗?

【问题讨论】:

  • 您应该实现正确的equalshashCode 方法。如果您不想自己编写,大多数 IDE 都可以为您生成 equals 和 hashCode。
  • .length() 返回什么?

标签: java for-loop arraylist contains indexof


【解决方案1】:

contains ArrayList 的方法是这样做的:

Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e))

例如,我们初始化两个包含精确值的螺丝对象。

Screws screws1 = new Screws(1, 1.0, 1.0, 1.0, 1.0);
Screws screws2 = new Screws(1, 1.0, 1.0, 1.0, 1.0);
Kreuzschlitzlager.add(screws1);
Kreuzschlitzlager.contains(screws2);   // this returns false

默认只比较内存地址。螺丝1和螺丝2的内存地址不同,所以不是同一个对象,也不相等。你必须在你的Screws 类中覆盖boolean equals(Object)int hashcode(),定义你自己的方式两个螺丝对象如何相等

【讨论】:

  • 在这种情况下 int hashcode() 做了什么?我以前没有听说过这个:) 不过我得到了方法部分!
  • @Shenanigator 不错。 hashcode() 仅在哈希表中使用。
【解决方案2】:

在您的Screws 类中,您需要重写方法equals(...) 并实现两个螺丝应该如何相等

【讨论】:

    【解决方案3】:

    你是对的; Screws 类还没有完成。 ArrayList class calls the equals method 确定元素是否等于contains 的参数,但您不覆盖equals。您的 Screws 类从 Object 继承 equals,如果它是相同的对象,它只会返回 true

    覆盖equals方法,在Screws中签名boolean equals(Object obj)。您需要自己编写用于确定相等性的逻辑。

    另外,contract for equals 表示需要与hashCode 保持一致。对于这个小型应用程序,没有必要,但通常您还应该覆盖hashCode 以与equals 保持一致。

    【讨论】:

    • 等等,所以我基本上必须向螺丝钉添加一个方法,将列表中对象的 getValue1 与在啤酒中创建的对象进行比较?非常感谢,我会试试的!
    【解决方案4】:

    查看 List.contains 的 javadoc

    布尔包含(对象o)

    如果此列表包含指定元素,则返回 true。更多的 正式地,当且仅当此列表包含至少一个时才返回 true 元素 e 使得 (o==null ? e==null : o.equals(e))。

    指定者:
    包含在接口Collection中

    参数:
    o - 要在此列表中测试其存在的元素 返回: 如果此列表包含指定的元素,则为 true

    投掷:
    ClassCastException - 如果指定元素的类型与此列表不兼容(可选) NullPointerException - 如果指定元素为 null 并且此列表不允许 null 元素(可选)

    如果你没有为你的螺丝类指定一个 equals 方法,它会检查它们是否是同一个对象。定义一个equals方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 2015-09-14
      • 2017-04-26
      相关资源
      最近更新 更多