hashCode()
hashCoed 的特性:(1) HashCode 的存在主要是用于查找的快捷性,如 Hashtable , HashMap 等, HashCode 经常用于确定对象的存储地址;(2)如果两个对象相同, equals 方法一定返回 true ,并且这两个对象的 HashCode 一定相同;(3)两个对象的 HashCode 相同,并不一定表示两个对象就相同,即 equals() 不一定为 true ,只能够说明这两个对象在一个散列存储结构中。(4)如果对象的 equals 方法被重写,那么对象的 HashCode 也尽量重写。
面试题:两个对象的 hashCode() 相同,则对象一定相同吗? 不一定System.out.println("Ma".hashCode());//2484 System.out.println("NB".hashCode());//2484 String s1 = new String("Ma"); String s2 = new String("NB"); System.out.println(s1.hashCode()); //2484 System.out.println(s2.hashCode()); //2484 System.out.println(s1==s2);//false
所以有可能不同的值计算出来的 hashCode() 相同,但是同一个值的 hashCode() 是不会变的,所以 可以根据字符串值推算出它的hashCode(), 但是不能根据 hashCode() 的值推算出字符串的值。
我们平时经常用到map来存储对象,因为map是key,value形式的,它不像list形式的集合可以有顺序的从0开始往集合里放数据,而是随意的放,但是取值的话就很麻烦,因为它存放值的时候没有顺序,所以取值的时候根据key去里面一个一个对比,等找到key相等的值就取出,这样就会造成效率问题。
当我们用到hashCode()可以看到我们将name计算为3373707,age计算为98511,这样的话我们存值的时候就根据计算后的数值进行对应位置的存储,同样当我们get取值的时候再次将key计算为hashCode()值,因为同一个字符串hashCode()值相等,这个时候我们就可以直接根据hashCode()值将对应位置的数据取出,就不需要对key一个一个进行对比了,这样大大提高了效率,这就是为什么有 hashCode()存在的原因了。
toString()
toString() 是 Java 中的一个方法,它用于将对象转换为字符串表示形式。
在 Java 中,每个类都继承了 Object 类,并且 Object 类有一个默认的toString() 方法。该方法的实现返回一个包含类名和对象内存地址的字符串。
public class MyClass {
private int value;
public MyClass(int value) {
this.value = value;
}
public static void main(String[] args) {
MyClass obj = new MyClass(5);
System.out.println(obj.toString());
}
}
输出结果为:MyClass@123a439b
然而,通常情况下我们希望将对象的属性信息也包含在 toString() 方法的输出中,以便更好地调试和理解代码。为此,我们可以重写 toString() 方法,根据自己的需求来定义对象的字符串表示形式。
public class MyClass {
private int value;
public MyClass(int value) {
this.value = value;
}
@Override
public String toString() {
return "MyClass(value=" + value + ")";
}
public static void main(String[] args) {
MyClass obj = new MyClass(5);
System.out.println(obj.toString());
}
}
输出结果为:MyClass(value=5)
通过重写 toString() 方法,我们可以自定义对象的字符串表示形式,以便更好地满足我们的需求。