首页 > 解决方案 > List.indexOf() 与我的班级的自定义 equals() 返回 -1

问题描述

我试图理解为什么 ArrayList.indexOf() 返回-1?

我创建了一个简单的类,在该类中实现了自定义 equals,以便可以将类的实例与字符串进行比较。

public class Currency {
    final private String code;
    final private String unicodeHex;
    final private String name;

    public Currency(String code, String unicodeHex, String name) {
        this.code = code;
        this.unicodeHex = unicodeHex;
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public String getSymbol() {
        return unicodeHex;
    }

    public String getName() {
        return name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null) return false;
        if (o instanceof Currency) {
            Currency currency = (Currency) o;
            return code.equals(currency.code);
        } else if (o instanceof String) {
            String currency = (String) o;
            return code.equals(currency);
        } else return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(code);
    }

    @Override
    public String toString() {
        return "Currency{" +
                "code='" + code + '\'' +
                ", unicodeHex='" + unicodeHex + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

现在我需要在 ArrayList 中找到该类的一个实例。

List<Currency>  currencies = new ArrayList<>(Arrays.asList(
                new Currency("USD","0024","United States Dollar"),
                new Currency("EUR","20ac","Euro Member Countries")));

Log.d(TAG, currencies.toString());
Log.d(TAG,Integer.toString(currencies.indexOf("USD")));
2019-02-13 15:41:50.082 D/CurrencySelector: [Currency{code='USD', unicodeHex='0024', name='United States Dollar'}, Currency{code='EUR', unicodeHex='20ac', name='Euro Member Countries'}]
2019-02-13 15:41:50.082 D/CurrencySelector: -1

我得到:-1

但:

Currency currency = new Currency("USD","0024","United States Dollar");

Log.d(TAG,Boolean.toString(currency.equals("USD")));
2019-02-13 15:41:50.082 D/CurrencySelector: true

equals 应该返回true

ArrayList.indexOf应该使用 equals :

public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

标签: java

解决方案


虽然currency.equals("USD")可能返回true(由于您的实现),但"USD".equals(currency)永远不会返回true,因为它使用类的equals实现String,这要求比较实例的类型为String

因此,currencies.indexOf("USD")将返回-1,因为o.equals(elementData[i])调用String的是equals,而elementData[i]不是String


推荐阅读