java集合之HashSet、TreeSet使用
Set容器的特点
Set容器是一个不包含重复元素的Collection,并且最多包含一个null元素,它和List容器相反,Set容器不能保证其元素的顺序。
最常用的两个Set接口的实现类是HashSet和TreeSet
HashSet及常用方法
HashSet扩展AbstractSet并且实现Set接口,底层封装HashSet,使用了HashSet的Key
HashSet使用散列表进行存储
构造方法:
HashSet()
HashSet(Collection m)
HashSet(int capacity)
HashSet(int capacity,float fillRato)//fillRato为填充因子,默认0.75
散列集合没有确保其元素的顺序,因为散列处理通常不参与排序
TreeSet及常用方法
TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序存储,访问和检索很快
在存储了大量需要进行快速检索的排序信息的情况下,TreeSet是一个很好的选择
构造方法:
TreeSet()
TreeSet(Collection c)
TreeSet(Comparator comp) //可参考TreeMap的使用
TreeSet(SortedSet ss)
TreeSet底层使用的是TreeMap,只是使用了TreeMap的Key
demo:
package pkg1.set; import java.util.HashSet; import java.util.Iterator; import java.util.TreeSet; public class HashSetDemo { public static void main(String[] args) { test1(); test2(); } public static void test1(){ HashSet<String> data=new HashSet<String>(); data.add("jack"); data.add("john"); data.add("rose"); System.out.println(data.add("john"));//重复对象添加失败,返回false System.out.println(data); HashSet<Student> stuSet=new HashSet<Student>(); stuSet.add(new Student("张三",12)); stuSet.add(new Student("李四",18)); System.out.println(stuSet.add(new Student("张三",12)));//重复对象添加失败,返回false //用迭代器和增强for循环输出都行 Iterator<Student> it = stuSet.iterator(); while(it.hasNext()){ System.out.println(it.next()); } System.out.println("---------------------------"); } public static void test2(){ TreeSet<Person> pset=new TreeSet<Person>( /* // 参数实现Comparator接口与对象中实现Comparable接口效果一样 new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { int temp = o1.getAge() - o2.getAge(); if (temp > 0) return 1; else if (temp < 0) return -1; else return o1.getName().compareTo(o2.getName()); } } */ ); pset.add(new Person("person1",15)); pset.add(new Person("person2",15)); pset.add(new Person("person1",18)); pset.add(new Person("person2",15));//相同的项会添加失败 for(Person p:pset){//增强for循环输出信息 System.out.println(p); } } } class Student{ private String name; private int age; public Student(String name, int age) { super(); this.name = name; this.age = 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; } //重写 hashCode()和equals()方法,HashSet中处理才会当成同一对象 @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } public String toString(){ return name+" "+age; } } //作为TreeSet的类型参数时,必须实现Comparable<T>接口或在定义TreeMap对象时传入比较方法的实现 class Person implements Comparable<Person> { private String name; private int age; public Person(String name, int age) { super(); this.name = name; this.age = 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; } public String toString() { return name + " " + age; } @Override public int compareTo(Person o) {// 自定义排序 ,按年龄从小到大 if (o == null) return 1; // 先按年龄比较,再按姓名比较 int temp = age - o.getAge(); if (temp > 0) return 1; else if (temp < 0) return -1; else return name.compareTo(o.name); } }
效果: