1 介绍HashSet和TreeSet
1.1 接口继承图
- Set接口
- SortedSet接口
- TreeSet接口
- HashSet实现类
- LinkedHashSet实现类
- SortedSet接口
1.2 共同点
元素对象唯一性(不重复),都不是线程安全的(Note that this implementation is not synchronized.)
1.3 差异点
- 实现方式:
- HashSet: Hash表实现
- TreeSet: 红黑树实现
- 存入对象:
- HashSet: 可存入null
- TreeSet: 不能添加null,添加对象必须是可排序的
- 其他差异:
- HashSet: 添加对象要重写hashCode和equals方法
- TreeSet: 元素必须实现Comparable接口,该接口中只用一个方法,就是compare()方法
2 比较HashSet和TreeSet
2.1 代码片段
package com.loongshaw;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class SetComparation {
public static void hashSetStringTest(){
Set<String> set = new HashSet<String>();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
set.add("d");
System.out.println("-------hashset 输出无序结果---------");
for(String value : set){
System.out.print(value+" ");
}
System.out.println();
}
public static void hashSetStudentTest(){
Set<Student> set = new HashSet<Student>();
set.add(new Student(7));
set.add(new Student(6));
set.add(new Student(1));
set.add(new Student(2));
set.add(new Student(3));
set.add(new Student(4));
set.add(new Student(5));
System.out.println("-------hashset 输出Student结果---------");
for(Student obj : set){
System.out.print(obj+" ");
}
System.out.println();
}
public static void hashSetPersonTest(){
Set<Person> set = new HashSet<Person>();
set.add(new Person("a"));
set.add(new Person("b"));
set.add(new Person("c"));
set.add(new Person("d"));
set.add(new Person("e"));
set.add(new Person("f"));
set.add(new Person("g"));
System.out.println("-------hashset 输出Person结果---------");
for(Person obj : set){
System.out.print(obj+" ");
}
System.out.println();
}
public static void hashSetObjectTest(){
Set<Integer> set = new HashSet<Integer>();
set.add(6);
set.add(3);
set.add(2);
set.add(1);
set.add(4);
set.add(5);
System.out.println("-------hashset 输出有序结果---------");
for(Integer value : set){
System.out.print(value+" ");
}
System.out.println();
}
public static void treeSetStringTest(){
Set<String> set = new TreeSet<String>();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
set.add("e");
set.add("A");
System.out.println("-------treeset 输出有序结果---------");
for(String value : set){
System.out.print(value+" ");
}
System.out.println();
}
public static void treeSetObjectTest(){
Set<Integer> set = new TreeSet<Integer>();
set.add(6);
set.add(3);
set.add(2);
set.add(1);
set.add(4);
set.add(5);
System.out.println("-------treeset 输出有序结果---------");
for(Integer value : set){
System.out.print(value+" ");
}
System.out.println();
}
public static void treeSetStudentTest(){
@SuppressWarnings("unchecked")
Set<Student> set = new TreeSet<Student>(new MyComparator());
set.add(new Student("lili",18));
set.add(new Student("jim",17));
set.add(new Student("green",19));
set.add(new Student("brown",20));
set.add(new Student("jack",16));
set.add(new Student("ocean",15));
System.out.println("-------treeset 输出有序结果---------");
for(Student value : set){
System.out.print(value.getName()+"-"+value.getAge() +" ");
}
System.out.println();
}
public static void main(String[] args){
hashSetStringTest();
hashSetObjectTest();
hashSetStudentTest();
hashSetPersonTest();
treeSetStringTest();
treeSetObjectTest();
treeSetStudentTest();
}
}
2.2 Person对象类
package com.loongshaw;
public class Person {
String name;
public Person(String name){
this.name = name;
}
@Override
public String toString() {
return this.name;
}
@Override
public int hashCode() {
return this.name.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Person){
Person p = (Person) obj;
if (p.name == this.name)
return true;
}
return false;
}
}
2.3 Student对象类
package com.loongshaw;
public class Student {
int id;
String name;
int age;
public Student(int id){
this.id = id;
}
public Student(String name,int age){
this.name = name;
this.age = age;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
@Override
public String toString() {
return this.id+"";
}
@Override
public int hashCode() {
return this.id;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Student){
Student stu = (Student) obj;
if (stu.id == this.id)
return true;
}
return false;
}
}
2.4 TreeSet实现Comparator接口,改写排序规则
package com.loongshaw;
import java.util.Comparator;
@SuppressWarnings("rawtypes")
public class MyComparator implements Comparator{
public int compare(Object o1, Object o2){
if(!((o1 instanceof Student)&&(o2 instanceof Student))){
throw new RuntimeException("Sorry");
}
Student s1 =(Student)o1;
Student s2 =(Student)o2;
int num = s1.getAge() -s2.getAge();
//int num =s1.getName().compareTo(s2.getName());
//if(num ==0)
// return s1.getAge() -s2.getAge();
return num;
}
}
2.5 输出结果
-------hashset 输出无序结果---------
d b c a
-------hashset 输出有序结果---------
1 2 3 4 5 6
-------hashset 输出Student结果---------
1 2 3 4 5 6 7
-------hashset 输出Person结果---------
f g d e b c a
-------treeset 输出有序结果---------
A a b c d e
-------treeset 输出有序结果---------
1 2 3 4 5 6
-------treeset 输出有序结果---------
ocean-15 jack-16 jim-17 lili-18 green-19 brown-20