我尝试了以下简单的测试.
class ZiggyTest{
public static void main(String[] args){
List<Cities> cities3 = new ArrayList<Cities>();
Cities city = new Cities("London");
cities3.add(new Cities("Manchester"));
cities3.add(new Cities("Glasgow"));
cities3.add(new Cities("Leeds"));
cities3.add(city);
cities3.add(new Cities("Leicester"));
cities3.add(new Cities("Croydon"));
cities3.add(new Cities("Watford"));
System.out.println("IndexOf(new Croydon) "
+ cities3.indexOf(new Cities("Croydon")));
System.out.println("IndexOf(city) "
+ cities3.indexOf(city));
}
}
class Cities implements Comparable<Cities>{
String title;
Cities(String aTitle){
this.title = aTitle;
}
public String getTitle(){
return title;
}
public String toString(){
return "Title : " + title;
}
public int compareTo(Cities c){
return title.compareTo(c.getTitle());
}
}
Run Code Online (Sandbox Code Playgroud)
上述测试的输出是
IndexOf(new Croydon) -1
IndexOf(city) 3
Run Code Online (Sandbox Code Playgroud)
我理解为什么第二行产生3但我不明白为什么第一行没有找到title ="Croydon"的新行.
API将该indexOf方法描述为一种方法
返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1.更正式地,返回最低索引i
(o==null ? get(i)==null : o.equals(get(i))),或者-1如果没有这样的索引.
我认为API说如果对象为null,那么它将从列表中返回第一次出现的null对象的索引.如果它不为null,它将返回传入的对象equals方法返回true的第一个匹配项的索引.
创建的对象不cities3.indexOf(new Cities("Croydon")应该等于先前添加的对象cities3.add(new Cities("Croydon"));吗?
mis*_*off 10
重新定义equals的,而不是compareTo如果你想要执行搜索操作.
默认情况下,indexOf使用equals操作进行比较,在您的情况下等于未重新定义,这意味着您通过引用进行比较.当您使用相同的名称创建新的City对象时,您有另一个对象的引用,因此equals返回false.
PS如果使用描述城市的对象,则为城市而非城市的优先名称