【问题标题】:How TreeSet works internally and stores custom object?TreeSet 如何在内部工作并存储自定义对象?
【发布时间】:2021-04-15 17:39:21
【问题描述】:

类 People 实现 Comparable {

private String name;

People(String name){
    this.name=name;
}

@Override
public int compareTo(Object o) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public String toString() {
    return "People [name=" + name + "]";
}

}

公共类 TestTreeSet {

public static void main(String[] args) {
    
    Set<People> set=new TreeSet<>();
    People p1=new People("ABC");
    People p2=new People("DEF");
    People p3=new People("CBD");
    People p4=new People("ABC");
    
    set.add(p1);
    set.add(p2);
    set.add(p3);
    set.add(p4);
    
    System.out.print(set.size());
    
}

}

我无法理解输出为 1 的原因?在这里,我存储了 4 个具有 3 个不同值的不同对象。 它是如何只存储一个对象的?

【问题讨论】:

  • 因为你的 compareTo 总是返回 0 它认为所有人都是平等的。由于 TreeSet 是唯一且已排序的,因此它会忽略后续添加。
  • 你的 compareTo 方法总是返回零,这意味着,这种类型的所有对象都是相等的。由于集合不存储重复项,因此它不能有多个始终相等的对象。
  • compareTo 总是返回 0,表示所有对象都相等,所以 size 为 1
  • 你必须实际实现 compareTo 方法。通过始终返回 0,此类的每个实例都等于另一个。只需将 this 的“名称”与 o 的“名称”进行比较并返回值。
  • 您还会收到大量警告,您应该注意它们。

标签: java collections java-8


【解决方案1】:

您实际上并没有实现“compareTo”方法:

@Override
public int compareTo(Object o) {
     if  (o instanceof People) {
         return ((People) o).name.compareTo(this.name);
     } else {
         return 1;
     } 
}

【讨论】:

  • 不要因为输入错误而返回1。这违反了Comparable 合同,对错误的调用者没有任何帮助。该类应该实现Comparable&lt;People&gt;,首先要有一个People 参数类型。对于预泛型代码,该方法应无条件转换为 People,因为无法将其与其他内容进行比较,而 ClassCastException 是对错误类型参数的最佳响应。
猜你喜欢
  • 1970-01-01
  • 2013-12-25
  • 2011-01-19
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多