一.TreeSet集合的介绍
TreeSet集合可以确保集合元素处于排序状态
TreeSet集合并不是根据元素的插入顺序进行排序的,而是根据元素实际指的大小进行排序的
与HashSet集合根据HashCode的值来决定元素的存储位置不同的是TreeSet集合是根据红黑树
的数据结构来存储集合元素的.
二.红黑树介绍
红黑树是一种自平衡排序二叉树,树中每个节点的值,都大于或等于在它的左子树中的所有
节点的值,并且小于或等于在它的右子树中的所有节点的值,这确保红黑树运行时可以快速
地在树中查找和定位的所需节点。
排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索。
排序二叉树要么是一棵空二叉树,要么是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
它的左、右子树也分别为排序二叉树。
三.TreeSet集合支持两种排序方法:自然排序和定制排序.
3.1自然排序
TreeSet集合会调用集合元素的comPareTo(Object object)方法来比较元素之间的大小关系,
然后将元素按升序排列,这种方式就是自然排序.
当把一个对象添加到TreeSet集合时,TreeSet集合调用该对象的comPareTo(Object object)方
法与容器中的其他对象进行比较,然后根据红黑树结构找到他的存储位置.如果两个对象通过
comPareTo(Object object)方法比较相等,新对象将无法添加到TreeSet(Set集合元素不能重复)
集合中.
java提供了一个Comparable接口,该接口里提供了一个comPareTo(Object object)的方法,该方
法返回一个整数,实现该接口的类必须实现该方法,实现了该接口的类的对象就可以比较大小.
当一个对象调用该方法与另外一个对象进行比较时,如object1.compareTo(object2),如果该方
法返回0,则这两个对象相等,如果该方法返回一个正整数则表明object1大于object2,如果该方
法返回一个负整数则表明object1小于object2.
错误示例1
package javaDemo;
import java.util.TreeSet;
public class TreeSetDemo2 {
public static void main(String[] args) {
dealData();
}
public static void dealData() {
TreeSet<Student> dataList = new TreeSet<>();
dataList.add(new Student());
}
}
class Student{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
运行结果:
Exception in thread "main" java.lang.ClassCastException: javaDemo.Student cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at javaDemo.TreeSetDemo2.dealData(TreeSetDemo2.java:12)
at javaDemo.TreeSetDemo2.main(TreeSetDemo2.java:7)
报异常是因为Student类没有实现Comparable接口.
错误示例2
package javaDemo;
import java.util.TreeSet;
public class TreeSetDemo2 {
public static void main(String[] args) {
dealData();
}
public static void dealData() {
TreeSet<Object> dataList = new TreeSet<>();
// dataList.add(new Student());
dataList.add("1");
dataList.add(1);
}
}
运行结果:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at java.lang.Integer.compareTo(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at javaDemo.TreeSetDemo2.dealData(TreeSetDemo2.java:14)
at javaDemo.TreeSetDemo2.main(TreeSetDemo2.java:7)
分析:
大部分类在实现compareTo(Object object)方法时都需要将被比较的对象object强转成相同的类型,
因为只有相同的类的两个实例才会比较大小.当试图把一个对象添加到TreeSet集合中时,TreeSet集合
就会调用该对象compareTo(Object object)方法与集合中的其他元素进行比较,这就要求集合中的其
他元素与该元素是同一个类的实例.
也就是说向TreeSet集合中添加的是同一个类的对象,否则就引发异常.
TreeSet集合可以确保集合元素处于排序状态
TreeSet集合并不是根据元素的插入顺序进行排序的,而是根据元素实际指的大小进行排序的
与HashSet集合根据HashCode的值来决定元素的存储位置不同的是TreeSet集合是根据红黑树
的数据结构来存储集合元素的.
二.红黑树介绍
红黑树是一种自平衡排序二叉树,树中每个节点的值,都大于或等于在它的左子树中的所有
节点的值,并且小于或等于在它的右子树中的所有节点的值,这确保红黑树运行时可以快速
地在树中查找和定位的所需节点。
排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索。
排序二叉树要么是一棵空二叉树,要么是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
它的左、右子树也分别为排序二叉树。
三.TreeSet集合支持两种排序方法:自然排序和定制排序.
3.1自然排序
TreeSet集合会调用集合元素的comPareTo(Object object)方法来比较元素之间的大小关系,
然后将元素按升序排列,这种方式就是自然排序.
当把一个对象添加到TreeSet集合时,TreeSet集合调用该对象的comPareTo(Object object)方
法与容器中的其他对象进行比较,然后根据红黑树结构找到他的存储位置.如果两个对象通过
comPareTo(Object object)方法比较相等,新对象将无法添加到TreeSet(Set集合元素不能重复)
集合中.
java提供了一个Comparable接口,该接口里提供了一个comPareTo(Object object)的方法,该方
法返回一个整数,实现该接口的类必须实现该方法,实现了该接口的类的对象就可以比较大小.
当一个对象调用该方法与另外一个对象进行比较时,如object1.compareTo(object2),如果该方
法返回0,则这两个对象相等,如果该方法返回一个正整数则表明object1大于object2,如果该方
法返回一个负整数则表明object1小于object2.
错误示例1
package javaDemo;
import java.util.TreeSet;
public class TreeSetDemo2 {
public static void main(String[] args) {
dealData();
}
public static void dealData() {
TreeSet<Student> dataList = new TreeSet<>();
dataList.add(new Student());
}
}
class Student{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
运行结果:
Exception in thread "main" java.lang.ClassCastException: javaDemo.Student cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at javaDemo.TreeSetDemo2.dealData(TreeSetDemo2.java:12)
at javaDemo.TreeSetDemo2.main(TreeSetDemo2.java:7)
报异常是因为Student类没有实现Comparable接口.
错误示例2
package javaDemo;
import java.util.TreeSet;
public class TreeSetDemo2 {
public static void main(String[] args) {
dealData();
}
public static void dealData() {
TreeSet<Object> dataList = new TreeSet<>();
// dataList.add(new Student());
dataList.add("1");
dataList.add(1);
}
}
运行结果:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at java.lang.Integer.compareTo(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at javaDemo.TreeSetDemo2.dealData(TreeSetDemo2.java:14)
at javaDemo.TreeSetDemo2.main(TreeSetDemo2.java:7)
分析:
大部分类在实现compareTo(Object object)方法时都需要将被比较的对象object强转成相同的类型,
因为只有相同的类的两个实例才会比较大小.当试图把一个对象添加到TreeSet集合中时,TreeSet集合
就会调用该对象compareTo(Object object)方法与集合中的其他元素进行比较,这就要求集合中的其
他元素与该元素是同一个类的实例.
也就是说向TreeSet集合中添加的是同一个类的对象,否则就引发异常.