HashMap中的比较key是这样的,先求出key的hashcode(),比较其值是否相等,若相等再比较equals(),若相等则认为他们是相等的。若equals()不相等则认为他们不相等。若是只重写hashcode()不重写equals()方法,当比较equals()时只是看他们是否为同一对象(即进行内存地址的比较),因此一定要两个方法一块儿重写。HashMap用来判断key是否相等的方法,实际上是调用了HashSet判断加入元素是否相等。
函数
引用别人说的一段话哈
通常来说,若是你要把一个类的对象放入容器中,那么一般要为其重写equals()方法,让他们比较地址值而不是内容值。特别地,若是要把你的类的对象放入散列中,那么还要重写hashCode()方法;要放到有序容器中,还要重写compareTo()方法。
equals()相等的两个对象,hashcode()必定相等;
equals()不相等的两个对象,却并不能证实他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。(个人理解是因为哈希码在生成的时候产生冲突形成的)。
反过来:hashcode()不等,必定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等 spa
原本不就有hashcode()和equals()了么?干吗要重写,直接用原来的不行么?code
HashMap中,若是要比较key是否相等,要同时使用这两个函数!由于自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即使有相同含义的两个对象,比较也是不相等的。对象