1. 程式人生 > >HashSet和TreeSet的一些區別 , equals方法和hashCode重新的一些問題。

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(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 boolean equals(Object object){
Student student = (Student)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  王五]