大家都知道,在Java中,如果不重写toString方法,会输出一个类似于内存地址的字符串,类似于com.oracle.Student@28013
这样子,但是如果此时重写了hashcode后,会发生什么问题呢?笔者在这里做了一个测试:
public class Student {
int id;
String name;
int age;
public Student(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
/*
* 重写hashcode
*/
// @Override
// public int hashCode() {
// final int prime = 31;
// int result = 1;
// result = prime * result + age;
// result = prime * result + id;
// result = prime * result + ((name == null) ? 0 : name.hashCode());
// return result;
// }
/*
* 自定义hashcode
*/
@Override
public int hashCode() {
return 1;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
public class SendValue {
public static void main(String[] args) {
// 自写hashcode,重写equal方法
// Student a = new Student(1, "zhu", 14);
// Student b = new Student(2, "zhu", 15);
// System.out.println(a); // com.oracle.Student@1
// System.out.println(b); // com.oracle.Student@1
// System.out.println(a.hashCode());
// System.out.println(b.hashCode());
// System.out.println(a.age);//14
// System.out.println(b.age);// 15
// System.out.println(a==b);//false
// 注释equal方法
// Student a = new Student(1, "zhu", 14);
// Student b = new Student(2, "zhu", 15);
// System.out.println(a); // com.oracle.Student@1
// System.out.println(b);// com.oracle.Student@1
// System.out.println(a==b);//false
//自动重写hashcode、equal
// Student a = new Student(1, "zhu", 14);
// Student b = new Student(1, "zhu", 14);
// System.out.println(a); // com.oracle.Student@28013
// System.out.println(b); // com.oracle.Student@28013
// System.out.println(a==b);//false
// b.setAge(18);
// System.out.println(a); // com.oracle.Student@28013
// System.out.println(b); // com.oracle.Student@28f17
}
}
经过测试后,发现实际在变量a、b中存贮的地址并非是内存地址,而是hash表中的地址,并且如果hash地址相同的不同对象会形成一个类似单链表的对象存贮机制,这是解决hash表冲突的一种方法:拉链法。
寻址方法:先到hash表中找到该地址,通过指针来找到对象;
java从入门到放弃,真香!