首页 > 其他 > 详细

TreeMap 和 TreeSet;equals() hashCode() compareTo()

时间:2019-09-23 22:31:52      阅读:115      评论:0      收藏:0      [点我收藏+]

为什么构造 TreeMap 或者 TreeSet的时候,无法指定容器的大小,跟其数据机构,也就是红黑树有关吗?

 

注意 TreeSet 和 HashSet 判断相等的依据不同。

 TreeSet 是以equals() 和 hashCode() 方法来判断是否相等,而HashSet 是以compareTo() 方法来判断。

测试例子1:

import lombok.Data;

import java.util.HashSet;
import java.util.TreeSet;

public class Test1 {

    public static void main(String[] args) {

        testTreeMap();

    }

    static void testTreeMap() {
        TreeSet<Test3> treeSet = new TreeSet<>();
        HashSet<Test3> hashSet = new HashSet<>();

        Test3 test3 = new Test3(12l);
        Test3 test31 = new Test3(20l);

        Test3 test32 = new Test3(12l);
        Test3 test33 = new Test3(2l);

        treeSet.add(test3);
        treeSet.add(test31);
        treeSet.add(test32);
        treeSet.add(test33);
        System.out.println("====treeSet=====");
        System.out.println(treeSet);

        hashSet.add(test3);
        hashSet.add(test31);
        hashSet.add(test32);
        hashSet.add(test33);
        System.out.println("====hashSet=====");
        System.out.println(hashSet);


    }


}

@Data
class Test3 implements Comparable {
    private Long count;

    public Test3(Long count) {
        this.count = count;
    }

    @Override
    public boolean equals(Object o) {
        return false;
    }

    @Override
    public int hashCode() {
        return 1;
    }

    @Override
    public int compareTo(Object o) {
        return 0;
    }
}

 

 

输出结果: 

====treeSet=====
[Test3(count=12)]
====hashSet=====
[Test3(count=12), Test3(count=20), Test3(count=12), Test3(count=2)]

 

测试例子2:(把上面代码的 equals() 方法返回值改为true, compareTo() 返回值改为非0)

输出结果:

====treeSet=====
[Test3(count=12), Test3(count=20), Test3(count=12), Test3(count=2)]
====hashSet=====
[Test3(count=12)]

 

注意:对象的hashCode()函数,如果不重写,则默认调用Object.hashCode();函数,每个对象都是不同的(JDK8 的默认hashCode的计算方法是通过和当前线程有关的一个随机数+三个确定值,运用Marsaglia‘s xorshift scheme随机数算法得到的一个随机数--这句话摘抄自下面的链接);而java的一些内置对象,比如 Integer  String 等,都重写了hashCode()方法,保证相同内容的Integer 或者 String对象的hashCode() 是相等的。因此如果我们希望自定义对象的比较规则,则需要同时实现equals()和hashCode()方法。

Java Object.hashCode()返回的是否对象内存地址? https://www.jianshu.com/p/be943b4958f4

 

TreeMap 和 TreeSet;equals() hashCode() compareTo()

原文:https://www.cnblogs.com/zhangxuezhi/p/11574742.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!