hashCode与equal,==与equal的区别


public class HashcodeTest {

	public static void main(String[] args) {
		Integer i1=new Integer(100);
		int j = 100;
		System.out.println(i1 == j); //true
		System.out.println(i1.hashCode());//100

		System.out.println(System.identityHashCode(i1));//打印地址
		System.out.println(System.identityHashCode(j));
		
		Integer i2=new Integer(128);
		System.out.println(i2.hashCode());//128
		
		Integer i3=128;
		System.out.println(i3.hashCode());//128
		//integer自动拆装箱范围为-128-127,在范围内直接到常量池中取
		System.out.println(i2==i3);//false
		System.out.println(i2.equals(i3));//true
		
		System.out.println(System.identityHashCode(i2));//打印地址
		System.out.println(System.identityHashCode(i3));
	}

}

结果:
在这里插入图片描述

integer与int区别

equals和HashCode的关系

  • 1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
  • 2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

所有对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!

equals和==的关系

  1. equals和==的区别
    ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
  2. equals 比较的话 先比较地址,如果相等,直接返回true 然后看比较的对象是不是类型相同,如果不是直接返回false
    如果是的话,则依次比较里面的内容,如果全部相等,则返回true

(这里需要注意string比较,string为引用类型,不是基本类型,用equal和==比较可能不一样)
基本类型与引用类型区别

猜你喜欢

转载自blog.csdn.net/qq_40896997/article/details/89526880