Thinking in java自讀筆記:HashSet與TreeSet
阿新 • • 發佈:2018-11-05
Set集合不能存入相同的元素,HashSet是根據equals()與hashCode()方法來判定元素是否相同,TreeSet是根據compareTo()方法來判定元素是否相同,也可以根據compare()方法來判定,因為compareTo()和compare()方法並不定義於根類,因此要使用TreeSet必須實現compareTo()方法或者compare方法。TreeSet可以得到一個順序列表,HashSet不能保證列表順序。
一.HashSet
HashSet是在equals()方法判定為真時,且hashCode()方法返回值相等,則認為元素相同,其實現原理是通過雜湊表來實現的。預設的hashCode()方法是根據物件地址映射出來的一個值,使用這個值經過雜湊演算法得到一個雜湊碼,即使2個不同物件的雜湊碼也有可能相同,因此需要equals()方法來進一步保證元素的相同性。
import java.util.*;
public class Test {
public static void main(String[] args) {
HashSet<Student> hs=new HashSet<Student>();
Student s1=new Student("LX");
Student s2=new Student("LX");
hs.add(s1);
hs.add(s2);
System.out.println(hs.size());
}
}
class Student{
String name;
public Student(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Student) {
return ((Student) obj).name == name;
}
return false;
}
@Override
public int hashCode() {
return 1;
}
}
輸出為:1
二.TreeSet
TreeSet是根據compareTo()方法或compare()方法來判定2個元素是否相同的,其實現原理是通過二叉樹實現的,通過定製排序或者自然排序來比較元素大小,與其說是排序,不如說是比較元素的方法。
方式一:*自然排序,重寫compareTo()方法*
import java.util.*;
public class Test {
public static void main(String[] args) {
TreeSet<Student> ts=new TreeSet<Student>();
Student s1=new Student("LX");
Student s2=new Student("LX");
ts.add(s1);
ts.add(s2);
System.out.println(ts.size());
}
}
class Student implements Comparable {
String name;
public Student()
{}
public Student(String name) {
this.name = name;
}
@Override
public int compareTo(Object o) {
if(o instanceof Student)
{
if(name.compareTo(((Student) o).name)==0)
return 0;
if(name.compareTo(((Student) o).name)>0)
{
return 1;
}
}
return -1;
}
}
方式二:定製排序,重寫compare方法,在定義TreeSet時傳入一個重寫了compare()方法的物件
import java.util.*;
public class Test {
public static void main(String[] args) {
TreeSet<Student> ts=new TreeSet<Student>(new Student());
Student s1=new Student("LX");
Student s2=new Student("LX");
ts.add(s1);
ts.add(s2);
System.out.println(ts.size());
}
}
class Student implements Comparator {
String name;
public Student()
{}
public Student(String name) {
this.name = name;
}
@Override
public int compare(Object o1, Object o2) {
Class it=o1.getClass();
if(it==o2.getClass()&&it.getName()=="Student")
{
int num=((Student)o1).name.compareTo(((Student)o2).name);
if(num==0)return 0;
if(num>0)return 1;
}
return -1;
}
}
輸出為:1
總結:
1.HashSet是通過雜湊表來實現的,通過equals()方法和hashCode()方法來判斷元素是否相等。
2.TreeSet是通過二叉樹實現的,有2種比較方法,其排序方式應該為二叉樹排序(未看程式碼,但估計是)。