The underlying layer of TreeSet is TreeMap's keySet(), and TreeMap is implemented based on red and black trees. Red and black trees are a balanced binary search tree, which can ensure that the height difference between left and right subtrees of any node will not exceed one twice that of the shorter tree.
TreeMap is sorted by key, so the elements in TreeSet are also sorted. Obviously, the compareTo() method must be called when the element is inserted into the TreeSet, so the elements in the TreeSet must implement the Comparable interface. TreeSet as a Set, it does not allow duplicate elements to appear. TreeSet uses compareTo() to judge duplicate elements, not equals(), see the following code.
import java.util.TreeSet;import org.junit.Test;public class TestTreeSet {class Combine implements Comparable<Combine> {private int p1;private int p2;public Combine(int p1, int p2) {this.p1 = p1;this.p2 = p2;}@Override public int hashCode() {return p1 * 31 + p2;}@Override public Boolean equals(Object obj) {System.out.print("whether equal " + this + " and " + obj);Boolean rect = false;if (obj instanceof Combine) {System.out.println("whether equal " + this + " and " + obj);Combine other = (Combine) obj;rect = (this.p1 == other.getP1() && this.p2 == other.getP2());}System.out.println(": " + rect);return rect;}@Override public int compareTo(Combine o) {System.out.print("compare " + this + " and " + o);// Only consider p1if (this.p1 < o.p1) {System.out.println(", return -1");return -1;} else if (this.p1 > o.p1) {System.out.println(", return 1");return 1;} else {System.out.println(", return 0");return 0;}}@Override public String toString() {return "(" + p1 + "," + p2 + ")";}public int getP1() {return p1;}public void setP1(int p1) {this.p1 = p1;}public int getP2() {return p2;}public void setP2(int p2) {this.p2 = p2;}}@Test public void test() {Combine c1 = new Combine(1, 2);Combine c2 = new Combine(1, 2);Combine c3 = new Combine(1, 3);Combine c4 = new Combine(5, 2);TreeSet<Combine> set = new TreeSet<Combine>();set.add(c1);set.add(c2);set.add(c3);set.add(c4); while (!set.isEmpty()) {//Output the elements in TreeSet in order Combine combine = set.pollFirst();System.out.println(combine.getP1() + "/t" + combine.getP2());}}}Output:
compare (1,2) and (1,2), return 0
compare (1,2) and (1,2), return 0
compare (1,3) and (1,2), return 0
compare (5,2) and (1,2), return 1
1 2
5 2
We see that regardless of whether the compareTo() returns equal or not, the equals() method is not called.
Summarize
The above is all about TreeSet judgment repetitive elements analysis and code examples. I hope it will be helpful to everyone. Interested friends can continue to refer to other related topics on this site. If there are any shortcomings, please leave a message to point it out. Thank you friends for your support for this site!