Java中Set接口及其实现类
- Set接口是Collection的子接口,Set接口类似于数学上集合的概念,不允许有重复的元素
- Set接口没有定义新的方法,只有从Collection上继承的方法
- Set的接口有三个常用的实现类:HashSet,TreeSet,LinkedHashSet
- 下面是HahSet实现的例子
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args){
Set <String> words = new HashSet<>() ;
words.add("one") ;
words.add("two") ;
words.add("three") ;
words.add("one") ;
for(String m : words){
System.out.print(m + " ") ;
}
}
}
- TreeSet是一种树集合,使用红黑树为元素排序,添加到TreeSet中的元素必须是可以比较的
- 元素的类必须实现Comparable接口,它的操作通常比HashSet慢
- 下面的TreeSet实现的例子
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args){
Set<String> ts = new TreeSet<>() ;
String [] s = new String[]{"one","two","three","four"} ;
for(int i=0; i<s.length; i++){
ts.add(s[i]) ;
}
for(String m : ts){
System.out.print(m + " ") ;
}
System.out.println() ;
System.out.println(((TreeSet<String>) ts).first()) ;
System.out.println(((TreeSet<String>) ts).last()) ;
System.out.println(((TreeSet<String>) ts).subSet("four","three")) ;
System.out.println(((TreeSet<String>) ts).headSet("two")) ;
System.out.println(((TreeSet<String>) ts).tailSet("four")) ;
System.out.println(((TreeSet<String>) ts).comparator()) ;
}
}
- 创建TreeSet对象如果没有指定比较器对象,集合中的元素按自然顺序排列
- 自然顺序是指集合对象实现了Comparable接口的compareTo()方法,对象则根据该方法排序
- 另一种排序方法是创建TreeSet对象时指定一个比较器对象,元素将按比较器规则排序
- 如果需要指定新的规则,可以定义一个实现类实现Comparator接口,然后为集合提供一个新的比较器
- 下面是实现字符串在集合中按字母逆序输出的例子
import java.util.Set;
import java.util.TreeSet;
public class DescSortDemo {
public static void main(String[] args){
String [] s = {"China", "England", "France", "America", "Russia"} ;
Set<String> ts = new TreeSet<>() ;
for(int i=0; i<s.length; i++){
ts.add(s[i]) ;
}
System.out.println(ts) ;
ts = new TreeSet<>((String s1, String s2) -> s2.compareTo(s1)) ;
for(int j=0; j<s.length; j++){
ts.add(s[j]) ;
}
System.out.println(ts) ;
}
}