gpt4 book ai didi

Java:在 NavigableSet 中添加相同的对象被拒绝

转载 作者:行者123 更新时间:2023-11-30 04:01:43 24 4
gpt4 key购买 nike

这是我的代码:

导入java.util.*;

public class AnotherBackedCollectionsTest{

public static void main(String... args){

Shape square = new Shape("square");
Shape circle = new Shape("circle");
Shape triangle = new Shape("triangle");

NavigableSet<Shape> shapes = new TreeSet<Shape>();
shapes.add(square);
shapes.add(circle);
shapes.add(triangle);

System.out.println("New shape added? " +shapes.add(new Shape("square")));

for(Shape s : shapes){
System.out.println(s.getName());
}


Set<Shape> shapes2 = new HashSet<Shape>();
shapes2.add(square);
shapes2.add(triangle);
shapes2.add(circle);

System.out.println("New shape added? " +shapes2.add(new Shape("square")));

for(Shape s : shapes2){
System.out.println(s.getName());
}

}

}

class Shape implements Comparable<Shape>{

private String name;

public Shape(String name){
this.name = name;
}

public String getName(){
return this.name;
}

public int compareTo(Shape shape){
return this.name.compareTo(shape.getName());
}

}

我得到这个输出:

New shape added? false
circle
square
triangle
New shape added? true
triangle
square
square
circle

如您所见,我没有覆盖 equals() Shape上的方法目的。当我尝试添加另一个 Shape 时,我发现很奇怪NavigableSet 中名为“square”的对象,它以某种方式拒绝了它。是因为Shape implements Comparable<T>所以它使用了覆盖 compareTo()确定方法相等的方法?

基本上,我想问的是 NavigableSet 如何确定我正在尝试添加重复的对象,而事实上,我没有重写 equals() 方法。

最佳答案

TreeSet不使用 equals() 来比较元素。它使用Comparable接口(interface)。

来自documentation :

a TreeSet instance performs all element comparisons using its compareTo (or compare) method, so two elements that are deemed equal by this method are, from the standpoint of the set, equal.

正如文档还指出的,如果您希望您的集合遵守一般 Set 约定,则必须以与 一致的方式定义 equals()比较():

The behavior of a set is well-defined even if its ordering is inconsistent with equals; it just fails to obey the general contract of the Set interface.

另一方面,HashSet确实使用了equals()hashCode(),并且不关注compareTo( )

这解释了行为上的差异。

简而言之,为了使您的元素尽可能广泛兼容,请确保重写 equals()hashCode(),并实现 Comparable 接口(interface)。

关于Java:在 NavigableSet 中添加相同的对象被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21835098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com