Java Arraylist.contains(Object)始终返回false

时间:2015-05-26 20:23:00

标签: java for-loop arraylist contains indexof

基本上我想创建一个“螺丝”类。这个类应该描述一个按类型,长度,厚度等的螺钉。我还想创建一个“存储”类,在所有方差中存储所述“螺钉”。类型,长度等限制为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;
  }
}

现在我想创建一个存储“单元”,这将是一个arraylist。我想用“螺丝”对象填充它。之后我希望能够检查列表中是否包含某个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获取对象的索引吗?

4 个答案:

答案 0 :(得分:4)

你是对的; Screws课程尚未完成。 ArrayList class calls the equals method确定元素是否等于contains的参数,但不要覆盖equals。您的Screws课程正在从equals继承Object,如果它是同一个确切的对象,则只返回true

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

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

答案 1 :(得分:1)

看一下List.contains的javadoc

  

boolean contains(Object o)

     

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

     

指定人:
      包含在接口Collection

中      

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

,则返回true      

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

如果您没有为类螺丝指定等号方法,它会检查它们是否是同一个对象。定义一个等于方法。

答案 2 :(得分:0)

ArrayList的

contains方法执行此操作:

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对象。

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

默认只比较内存地址。 screws1和screws2具有不同的内存地址,因此它们不是同一个对象,并且它们不相等。您必须覆盖boolean equals(Object)类中的int hashcode()Screws,定义两个螺丝对象相等的方式

答案 3 :(得分:0)

Screws课程中,您需要覆盖方法equals(...)并实现两个螺丝应该相等的方式