Java集合中的TreeSet
导读
通过本文的阅读,可以了解如下的信息:
- 了解TreeSet的特点
- 如何创建TreeSet
- TreeSet中如何添加元素
- TreeSet中如何判定元素存在
- TreeSet中如何删除元素
- 如何计算TreeSet的大小
- 如何迭代TreeSet
- 如何在TreeSet中添加自定义的类
TreeSet类的定义
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
{
...
}
继承了AbstractSet类AbstractSet,具有相应的一些集合的操作
实现了NavigableSet接口,NavigableSet继承了SortedSet并进行了扩展,具有了为给定搜索目标报告最接近匹配项的导航方法。其中方法 lower、floor、ceiling 和 higher 分别返回小于、小于等于、大于等于、大于给定元素的元素,如果不存在这样的元素,则返回 null。
实现了Cloneable接口,表明可以实现克隆功能
实现了Serializable接口,表明可以被序列化。
TreeSet的主要特点
- 内部的元素是有序的
- TreeSet类中的方法没有synchronized修饰,所以线程是不同步的,线程不是安全的
- TreeSet中不允许有null值
创建TreeSet的格式
TreeSet<T> name=new TreeSet<T>();
如何添加元素
实例
import java.util.TreeSet;
import java.util.Iterator;
public class Demo{
public static void main(String[] args){
TreeSet<String> treeSetName=new TreeSet<String>();
treeSetName.add("gh");
treeSetName.add("6");
treeSetName.add("vv");
Iterator ite=treeSetName.iterator();
while(ite.hasNext()){
System.out.println(ite.next());
}
}
}
运行结果
6
gh
vv
TreeSet具有Set的一般特性----不允许有相同的数据
实例
import java.util.TreeSet;
import java.util.Iterator;
public class Demo{
public static void main(String[] args){
TreeSet<String> treeSetName=new TreeSet<String>();
treeSetName.add("gh");
treeSetName.add("6");
treeSetName.add("vv");
treeSetName.add("vv");
Iterator ite=treeSetName.iterator();
while(ite.hasNext()){
System.out.println(ite.next());
}
}
}
运行结果
6
gh
vv
如有相同的值会对其进行覆盖。
如何判断元素是否存在
实例
import java.util.TreeSet;
import java.util.Iterator;
public class Demo{
public static void main(String[] args){
TreeSet<String> treeSetName=new TreeSet<String>();
treeSetName.add("good");
treeSetName.add("luck");
treeSetName.add("ok");
System.out.println(treeSetName.contains("ok"));
}
}
运行结果
true
如何删除元素
实例
import java.util.TreeSet;
import java.util.Iterator;
public class Demo{
public static void main(String[] args){
TreeSet<String> treeSetName=new TreeSet<String>();
treeSetName.add("gh");
treeSetName.add("6");
treeSetName.add("vv");
treeSetName.add("vv");
treeSetName.remove("vv");
Iterator ite=treeSetName.iterator();
while(ite.hasNext()){
System.out.println(ite.next());
}
}
}
运行结果
6
gh
如何计算大小
实例
import java.util.TreeSet;
public class Demo{
public static void main(String[] args){
TreeSet<String> treeSetName=new TreeSet<String>();
treeSetName.add("gh");
treeSetName.add("6");
treeSetName.add("vv");
System.out.println(treeSetName.size());
}
}
运行结果
3
如何迭代TreeSet
实例
import java.util.TreeSet;
import java.util.Iterator;
public class Demo{
public static void main(String[] args){
TreeSet<String> treeSetName=new TreeSet<String>();
treeSetName.add("gh");
treeSetName.add("6");
treeSetName.add("vv");
//通过Iterator迭代器
Iterator ite=treeSetName.iterator();
while(ite.hasNext()){
System.out.print(ite.next()+" ");
}
System.out.println();
//通过for循环迭代
for(String s:treeSetName){
System.out.print(s+" ");
}
System.out.println();
}
}
运行结果
6 gh vv
6 gh vv
为什么TreeSet中不能有null值
实例
import java.util.TreeSet;
public class Demo{
public static void main(String[] args){
TreeSet<String> treeSetName=new TreeSet<String>();
try{
treeSetName.add("gh");
treeSetName.add("6");
treeSetName.add(null);
System.out.println(treeSetName.size());
}catch(NullPointerException e){
System.out.println("抛出异常"+e);
}
}
}
运行结果
抛出异常java.lang.NullPointerException
说明TreeSet中添加null值会出现异常
个人见解:首先TreeSet是有序的,然而null值不能比较,所以不能有null值。(仅代表个人观点,欢迎指正)
通过实验也证明了不能添加null值。
重头戏
如果向TreeSet中添加自己定义的类,需要重写CompareTo方法。
实例
import java.util.TreeSet;
import java.util.Iterator;
class Student implements Comparable{
public int age;
public String name;
Student(int age,String name){
this.age=age;
this.name=name;
}
public String toString(){
return "年龄"+age+"名字"+name;
}
public int compareTo(Object o){
Student stu=(Student)o;
int num=age>stu.age?1:(age==stu.age?0:-1);
if(num==0){
num=name.compareTo(stu.name);//这里的compareTo是String中的方法
}
return num;
}
}
public class Demo{
public static void main(String[] args){
TreeSet<Student> treeSetName=new TreeSet<Student>();
treeSetName.add(new Student(15,"jjj"));
treeSetName.add(new Student(12,"bgf"));
treeSetName.add(new Student(13,"lll"));
Iterator ite=treeSetName.iterator();
while(ite.hasNext()){
System.out.println(ite.next());
}
}
}
运行结果
年龄12名字bgf
年龄13名字lll
年龄15名字jjj
这里通过重写Comparable中的compareTo实现相应的比较操作,目的是自定义的类有比较方法,TreeSet才知道如何排序。