Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在TreeSet和TreeMap中使用hashCode()和equals()_Java_Treemap_Treeset - Fatal编程技术网

Java 在TreeSet和TreeMap中使用hashCode()和equals()

Java 在TreeSet和TreeMap中使用hashCode()和equals(),java,treemap,treeset,Java,Treemap,Treeset,从下面的代码中,我了解到,对于TreeSet和TreeMap,不需要重写equals()和hashCode()方法,也不需要进行排序和搜索 public class ComparableTest implements Comparable<ComparableTest> { private String username; public ComparableTest(String name) { this.username = name;

从下面的代码中,我了解到,对于TreeSet和TreeMap,不需要重写equals()和hashCode()方法,也不需要进行排序和搜索

public class ComparableTest implements Comparable<ComparableTest> {

    private String username;

    public ComparableTest(String name) {
        this.username = name;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int compareTo(ComparableTest o) {
        return username.compareTo(o.getUsername());
    }

    @Override
    public String toString() {
        return this.getUsername();
    }

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {

        ArrayList<ComparableTest> comparableTestsList = new ArrayList<ComparableTest>();
        ArrayList<ComparableTest> comparableTestsList2;

        comparableTestsList.add(new ComparableTest("Second Name"));
        comparableTestsList.add(new ComparableTest("First name"));
        System.out.println("Orignal Array List  = " + comparableTestsList);

        // making a clone to test this list in Treeset
        comparableTestsList2 = (ArrayList<ComparableTest>) comparableTestsList
                .clone();
        // Sorting the first arraylist which works
        Collections.sort(comparableTestsList);
        System.out.println("Sorted Array List  = " + comparableTestsList);

        // searching the first array which does not work as equals method has
        // not been overriden
        int position = comparableTestsList.indexOf(new ComparableTest(
                "First name"));
        System.out.println("The position of First name is = " + position);

        //using the cloned collection in TreeSet
        TreeSet<ComparableTest> ts = new TreeSet<ComparableTest>(
                comparableTestsList2);
        System.out.println("The value in Tree Set is = " + ts);

        System.out.println("The position of First name is = " + ts.contains(new ComparableTest("First name")));//works fine

        //using the cloned collection in TreeMap
        TreeMap<ComparableTest, String> tMap = new TreeMap<>();
        for(ComparableTest ct: comparableTestsList2) {
            tMap.put(ct, "anushree");
        }       
        System.out.println("The value in Tree Map is = " + tMap);
        System.out.println(tMap.get(new ComparableTest("First name")));//works fine
    }
}
公共类ComparableTest实现了Comparable{
私有字符串用户名;
公共可比性测试(字符串名称){
this.username=名称;
}
公共字符串getUsername(){
返回用户名;
}
public void setUsername(字符串用户名){
this.username=用户名;
}
公共国际比较(可比测试o){
返回username.compareTo(o.getUsername());
}
@凌驾
公共字符串toString(){
返回这个.getUsername();
}
@抑制警告(“未选中”)
公共静态void main(字符串[]args){
ArrayList CompariableTestsList=新的ArrayList();
ArrayList可比测试列表2;
可比性测试列表。添加(新的可比性测试(“第二个名称”);
可比性测试列表。添加(新的可比性测试(“名字”));
System.out.println(“原始数组列表=“+CompariableTestsList”);
//制作克隆以在Treeset中测试此列表
comparableTestsList 2=(ArrayList)comparableTestsList
.clone();
//对第一个有效的arraylist进行排序
Collections.sort(可比测试列表);
System.out.println(“排序数组列表=“+CompariableTestsList”);
//搜索不作为equals方法工作的第一个数组时
//未被覆盖
int position=comparableTestsList.indexOf(新的ComparableTest(
"姓名);;
System.out.println(“名字的位置是=”+位置);
//在TreeSet中使用克隆的集合
树集ts=新树集(
可比测试2);
System.out.println(“树集中的值为=“+ts”);
System.out.println(“First name的位置是=“+ts.contains(new ComparableTest(“First name”)));//工作正常
//在树映射中使用克隆的集合
TreeMap tMap=新的TreeMap();
用于(可比测试ct:可比测试SLIST2){
tMap.put(ct,“anushree”);
}       
System.out.println(“树映射中的值为=“+tMap”);
System.out.println(tMap.get(newcomparabletest(“First name”));//工作正常
}
}
这与javadoc中的内容非常吻合 TreeSet实例使用其compareTo(或compare)方法执行所有元素比较,因此,从集合的角度来看,此方法认为相等的两个元素是相等的。即使集合的顺序与equals不一致,集合的行为也是定义良好的;它只是没有遵守Set接口的总合同

还写了: 请注意,如果要正确实现set接口,set维护的顺序(无论是否提供显式比较器)必须与equals一致

equals()和hashCode()如何出现在TreeSet和TreeMap的图片中?能给我一个代码示例吗。谢谢

你刚才说过:

TreeSet实例使用其compareTo(或compare)方法执行所有元素比较


equals()
hashCode
在处理
TreeSet
TreeMap
时不会出现在图片中。但是,如果您将来将此对象用作
HashMap
(例如)的键,则正确地重写它们是一种良好的做法。

同意@Tunaki的输入。TreeSet和TreeMap不需要hashCode和equals方法,因为排序取决于compareTo或客户端提供的compare方法。我认为这就是为什么这些DS的containsKey方法和TreeMap的get(key)方法都在log(n)时间内运行,而不是在O(1)时间内运行的原因,因为它们不是基于散列的数据结构,比如HashMap或HashTable,通过在键上应用散列函数,可以在O(1)时间内找到元素的位置。对于树集和树映射,将应用二进制搜索来定位元素。

同意。。我期待着同样的答案