为什么构造 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)]