hashCode()和toString()
hashCode()
hashCoed 的特性:
(1)HashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,HashCode经常用于确定对象的存储地址;
(2)如果两个对象相同, equals方法一定返回true,并且这两个对象的HashCode一定相同;
(3)两个对象的HashCode相同,并不一定表示两个对象就相同,即equals()不一定为true,只能够说明这两个对象在一个散列存储结构中。
(4)如果对象的equals方法被重写,那么对象的HashCode也尽量重写。
面试题:两个对象的 hashCode()相同,则值一定相同吗?不一定
HashCode.java
/*
* Copyright (c) 2017, 2023, zxy.cn All rights reserved.
*
*/
package cn.practice2;
/**
* <p>Description:</p>
* <p>Class:</p>
* <p>Powered by zxy On 2023/5/16 20:29 </p>
*
* @author zxy [zxy06291@163.com]
* @version 1.0
* @since 17
*/
public class HashCode {
public static void main(String[] args) {
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
}
}
所以有可能不同的值计算出来的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()方法是Object类中的方法,而Java中所有的类都继承了object类;
在使用时可以将其重写。
ing()方法是Object类中的方法,而Java中所有的类都继承了object类;在使用时可以将其重写。