private int hash; // Default to 0
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i ) {
h = 31 * h val[i];
}
hash = h;
}
return h;
}
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i ;
}
return true;
}
}
return false;
}
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o){
if(this == o){
return true;
}
if(o instanceof Person){
Person p = (Person)o;
return this.age == p.getAge() && this.name.equals(p.getName());
}
return false;
}
}
public class Application {
public static void main(String[]args){
Set<Person> set = new HashSet<>();
Person p1 = new Person("Lilei", 25);
Person p2 = new Person("Lilei", 25);
set.add(p1);
System.out.println("p1 equals p2: " (p1 == p2));//1
System.out.println("set contains p1: " set.contains(p1));//2
System.out.println("set contains p2: " set.contains(p2));//3
}
}
p1 equals p2: false set contains p1: true set contains p2: false
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Application {
public static void main(String[]args){
Set<Person> set = new HashSet<>();
Person p1 = new Person("Lilei", 25);
Person p2 = new Person("Lilei", 25);
set.add(p1);
set.add(p2);
System.out.println("set size is: " set.size());
//System.out.println("p1 equals p2: " (p1 == p2));
//System.out.println("set contains p1: " set.contains(p1));
//System.out.println("set contains p2: " set.contains(p2));
}
}
set size is: 2
@Override
public int hashCode(){
return name.hashCode() * 31 age;
}
set size is: 2
@Override
public boolean equals(Object o){
if(this == o){
return true;
}
if(o instanceof Person){
Person p = (Person)o;
return this.age == p.getAge() && this.name.equals(p.getName());
}
return false;
}
@Override
public int hashCode(){
return name.hashCode() * 31 age;
}
set size is: 1
这一点和第二点实际上是一样的,这里就不举例介绍了。 实际上,Set的对象和Map的key的操作和hashCode以及equals方法有关,比如查这个对象是否在Set里,先根据hashCode定位到一个段,在根据equals进行确定是否存在,这样不需要把Set里所有的对象都遍历一遍,效率太低,Map的key是同样道理。 那么hashCode和equals的设计原则就呼之欲出了。