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才知道如何排序。