先上结论:HashSet集合通过hashCode()和equals()方法来保证存入集合的元素是唯一的.先比较hashCode值是否相等,若不相等,则存入,若相等,则调用equals()方法,不相等,则存入,相等,则不存.应付面试,记住这些就OK了.但是,应付工作是远远不够的.
上代码:
class HashCodeDemo
{
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
String s1 ="小明";
String s2 ="小红";
String s3 ="小力";
String s4=new String("小明");
String s5=new String("小明");
set.add(s1);
set.add(s2);
set.add(s3);
set.add(s4);
set.add(s4);
set.add(s5);
for (String string : set) {
System.out.println(string);
}
System.out.println(s.size());
}
}
结果输出:
小力
小明
小红
这么看来,HashSet确实保证了元素的唯一.但是,请看下面的例子
import java.util.*;
class Person
{
private String name;
private String address;
private int age;
Person(String name,int age,String address){
this.name = name;
this.address=address;
this.age = age;
}
}
class HashCodeDemo
{
public static void main(String[] args)
{
Set<Person> s = new HashSet<Person>();
Person p = new Person("拉格朗日",20,"珠海");
Person p1 = new Person("拉格朗日",20,"珠海");
System.out.println("p.hashCode=" + p.hashCode());
System.out.println("p1.hashCode=" + p1.hashCode());
s.add(p);
s.add(p1);
System.out.println(s.size());
}
}
输出结果:
p.hashCode=4126736
p1.hashCode=1049443
2
很明显,HashSet并没有保证元素的唯一性,这是为什么呢?
重写HashCode()方法试试
package collection;
import java.util.*;
class Person
{
private String name;
private String address;
private int age;
Person(String name,int age,String address){
this.name = name;
this.address=address;
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((address == null) ? 0 : address.hashCode());
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
}
class HashCodeDemo
{
public static void main(String[] args)
{
Set<Person> s = new HashSet<Person>();
Person p = new Person("拉格朗日",20,"珠海");
Person p1 = new Person("拉格朗日",20,"珠海");
System.out.println("p.hashCode=" + p.hashCode());
System.out.println("p1.hashCode=" + p1.hashCode());
s.add(p);
s.add(p1);
System.out.println(s.size());
}
}
输出结果:
p.hashCode=1690552867
p1.hashCode=1690552867
2
可以见得,hashCode值相等,但元素还是被存储进去了,仅仅重写hashCode()方法是不够的,再重写equals()方法试试
package collection;
import java.util.*;
class Person
{
private String name;
private String address;
private int age;
Person(String name,int age,String address){
this.name = name;
this.address=address;
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((address == null) ? 0 : address.hashCode());
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (address == null) {
if (other.address != null)
return false;
} else if (!address.equals(other.address))
return false;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
class HashCodeDemo
{
public static void main(String[] args)
{
Set<Person> s = new HashSet<Person>();
Person p = new Person("拉格朗日",20,"珠海");
Person p1 = new Person("拉格朗日",20,"珠海");
System.out.println("p.hashCode=" + p.hashCode());
System.out.println("p1.hashCode=" + p1.hashCode());
s.add(p);
s.add(p1);
System.out.println(s.size());
}
}
输出结果:
p.hashCode=1690552867
p1.hashCode=1690552867
1