Set接口的定义
Collection就不能进行双向输出,因为没有提供get()方法,但是Set接口与Collection接口的定义一致,所以其本身也不能双向输出。
HashSet:使用散列的方式存放内容,本身没有顺序。
import java.util.HashSet ; import java.util.Set ; public class HashSetDemo01{ public static void main(String args[]){ Set<String> allSet = new HashSet<String>() ; allSet.add("A") ; // 增加内容 allSet.add("B") ; // 增加内容 allSet.add("C") ; // 增加内容 allSet.add("C") ; // 重复内容 allSet.add("C") ; // 重复内容 allSet.add("D") ; // 增加内容 allSet.add("E") ; // 增加内容 System.out.println(allSet) ; } };
执行结果中可以看出插入的顺序是无序排列的,而List接口的内同插入的顺序是其保存的顺序。
如果现在希望所有的内容可以自动进行排序的操作,则可以使用Set中的第二个子类————TreeSet.
import java.util.TreeSet ; import java.util.Set ; public class TreeSetDemo01{ public static void main(String args[]){ Set<String> allSet = new TreeSet<String>() ; allSet.add("C") ; // 增加内容 allSet.add("C") ; // 重复内容 allSet.add("C") ; // 重复内容 allSet.add("D") ; // 增加内容 allSet.add("B") ; // 增加内容 allSet.add("A") ; // 增加内容 allSet.add("E") ; // 增加内容 System.out.println(allSet) ; } };
TreeSet类的内容是可以排序的,那么任意给出一个类,观察能否进行排序。
import java.util.Set ; import java.util.TreeSet ; class Person{ private String name ; private int age ; public Person(String name,int age){ this.name = name ; this.age = age ; } public String toString(){ return "姓名:" + this.name + ";年龄:" + this.age ; } }; public class TreeSetDemo02{ public static void main(String args[]){ Set<Person> allSet = new TreeSet<Person>() ; allSet.add(new Person("张三",30)) ; allSet.add(new Person("李四",31)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("赵六",33)) ; allSet.add(new Person("孙七",33)) ; System.out.println(allSet) ; } };
import java.util.Set ; import java.util.TreeSet ; class Person implements Comparable<Person>{ private String name ; private int age ; public Person(String name,int age){ this.name = name ; this.age = age ; } public String toString(){ return "姓名:" + this.name + ";年龄:" + this.age ; } public int compareTo(Person per){ if(this.age>per.age){ return 1 ; }else if(this.age<per.age){ return -1 ; }else{ return 0 ; } } }; public class TreeSetDemo03{ public static void main(String args[]){ Set<Person> allSet = new TreeSet<Person>() ; allSet.add(new Person("张三",30)) ; allSet.add(new Person("李四",31)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("赵六",33)) ; allSet.add(new Person("孙七",33)) ; System.out.println(allSet) ; } };
import java.util.Set ; import java.util.TreeSet ; class Person implements Comparable<Person>{ private String name ; private int age ; public Person(String name,int age){ this.name = name ; this.age = age ; } public String toString(){ return "姓名:" + this.name + ";年龄:" + this.age ; } public int compareTo(Person per){ if(this.age>per.age){ return 1 ; }else if(this.age<per.age){ return -1 ; }else{ return this.name.compareTo(per.name) ; // 调用String中的compareTo()方法 } } }; public class TreeSetDemo04{ public static void main(String args[]){ Set<Person> allSet = new TreeSet<Person>() ; allSet.add(new Person("张三",30)) ; allSet.add(new Person("李四",31)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("赵六",33)) ; allSet.add(new Person("孙七",33)) ; System.out.println(allSet) ; } };
此时去掉的重复元素并不是真正意义上的重复元素的取消。
import java.util.Set ; import java.util.HashSet ; class Person{ private String name ; private int age ; public Person(String name,int age){ this.name = name ; this.age = age ; } public String toString(){ return "姓名:" + this.name + ";年龄:" + this.age ; } }; public class RepeatDemo01{ public static void main(String args[]){ Set<Person> allSet = new HashSet<Person>() ; allSet.add(new Person("张三",30)) ; allSet.add(new Person("李四",31)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("赵六",33)) ; allSet.add(new Person("孙七",33)) ; System.out.println(allSet) ; } };
import java.util.Set ; import java.util.HashSet ; class Person{ private String name ; private int age ; public Person(String name,int age){ this.name = name ; this.age = age ; } public boolean equals(Object obj){ // 覆写equals,完成对象比较 if(this==obj){ return true ; } if(!(obj instanceof Person)){ return false ; } Person p = (Person)obj ; // 向下转型 if(this.name.equals(p.name)&&this.age==p.age){ return true ; }else{ return false ; } } public int hashCode(){ return this.name.hashCode() * this.age ; // 定义一个公式 } public String toString(){ return "姓名:" + this.name + ";年龄:" + this.age ; } }; public class RepeatDemo02{ public static void main(String args[]){ Set<Person> allSet = new HashSet<Person>() ; allSet.add(new Person("张三",30)) ; allSet.add(new Person("李四",31)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("王五",32)) ; allSet.add(new Person("赵六",33)) ; allSet.add(new Person("孙七",33)) ; System.out.println(allSet) ; } };
SortedSet接口:
import java.util.SortedSet ; import java.util.TreeSet ; public class TreeSetDemo05{ public static void main(String args[]){ SortedSet<String> allSet = new TreeSet<String>() ; // allSet.add("A") ; // 增加内容 allSet.add("B") ; // 增加内容 allSet.add("C") ; // 增加内容 allSet.add("C") ; // 增加内容 allSet.add("C") ; // 增加内容 allSet.add("D") ; // 增加内容 allSet.add("E") ; // 增加内容 System.out.println("第一个元素:" + allSet.first()) ; System.out.println("最后一个元素:" + allSet.last()) ; System.out.println("headSet元素:" + allSet.headSet("C")) ; System.out.println("tailSet元素:" + allSet.tailSet("C")) ; System.out.println("subSet元素:" + allSet.subSet("B","D")) ; } };