HashSet和TreeSet的一些區別 , equals方法和hashCode重新的一些問題。
HashSet和TreeSet的相同之處是: 都實現了Set這個介面。
不同之處:
1、HashSet的資料結構的基於雜湊表,其中的資料元素中是無序的,雖然本來Set就是無序的。
2、TreeSet的資料結構的基於樹結構的,其中資料元素是有序排列的。
3、HashSet的效能是優於TreeSet的,通常我們使用的都是HashSet, 當資料需要排序的時候就選用TreeSet.
首先列出的是三個問題:
1、為什麼要重寫equals和hashCode方法,
2、什麼類需要重寫這兩方法,
3、如何重寫equals和hashCode方法
解決問題一: 新建物件存到Set的時候,如果想使得資料列表沒有出現重複的現象,那麼就需要同時重寫equals和hashCode方法。這裡注意是要同時兩個方法都必須重寫。只寫一個或者都不寫,那麼資料中就會出現重複的資料。
解決問題二:如果底層記憶體是以雜湊表為資料結構的就要重新equals和hashCode方法。
解決問題三:下面我以一個列子展示一下怎麼重新這兩個方法:
import java.util.HashSet;
import java.util.Set;
public class HashCodeAndEquals {
public static void main(String[] args) {
// TODO Auto-generated method stub
Set set = new HashSet();
set.add(new Student(1001, "您好"));
set.add(new Student(1002, "你好"));
set.add(new Student(1003, "王五"));
set.add(new Student(1004, "你好"));
set.add(new Student(1003, "王五"));
System.out.println("set 集合的陣列結果是:"+set);
}
}
class Student {
int id;
String name;
public Student(int id,String name){
this.id= id;
this.name = name;
}
public boolean equals(Object object){
return student.id== this.id && student.name==this.name;
}
public int hashCode(){
return id* this.name.hashCode();
}
public String toString(){
return this.id+" "+this.name;
}
}
這裡我用的是HashSet,所以需要重寫equals和haseCode方法。
輸出結果是:set 集合的陣列結果是:[1003 王五, 1004 你好, 1001 您好, 1002 你好]
必須是同時重寫這兩個方法,只寫一個都會出現下面的那種結果。
******下面是不重寫這兩個方法的輸出結果:
import java.util.HashSet;
import java.util.Set;
public class HashCodeAndEquals {
public static void main(String[] args) {
// TODO Auto-generated method stub
Set set = new HashSet();
set.add(new Student(1001, "您好"));
set.add(new Student(1002, "你好"));
set.add(new Student(1004, "你好"));
set.add(new Student(1003, "王五"));
set.add(new Student(1004, "你好"));
set.add(new Student(1003, "王五"));
System.out.println("set 集合的陣列結果是:"+set);
}
}
class Student {
int id;
String name;
public Student(int id,String name){
this.id= id;
this.name = name;
}
public String toString(){
return this.id+" "+this.name;
}
}
輸出結果是:
set 集合的陣列結果是:[1004 你好, 1003 王五, 1004 你好, 1001 您好, 1002 你好, 1003 王五]