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


你可能感兴趣的:(学习日志)