java - 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;
}
解决方案
虽然currency.equals("USD")
可能返回true
(由于您的实现),但"USD".equals(currency)
永远不会返回true
,因为它使用类的equals
实现String
,这要求比较实例的类型为String
。
因此,currencies.indexOf("USD")
将返回-1
,因为o.equals(elementData[i])
调用String
的是equals
,而elementData[i]
不是String
。
推荐阅读
- c++ - 如何创建一个类来存储大小仅受系统可用内存总量限制的数字?
- javascript - 来自输入类型=文件的角度传递引用变量
- aws-lambda - 在提供 CSS 和 JS 文件时,在 AWS Lambda 中运行的 .NET Core MVC 应用程序的身份验证不起作用
- widget - 如何获得均匀数量的网格单元
- algorithm - 堆排序(自下而上)
- reactjs - Reactjs Array.slice(开始,结束)不起作用
- swift - 如何从自定义类中的视图控制器访问变量?
- c++ - 如何确保调用显式构造函数并允许大括号初始化?
- javascript - 适用于 null 和 undefined 的 Typescript/javascript 扩展方法
- python - 处理 python 列表中的模糊重复项