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 王五]