谈谈“equals”和“==”

2019-07-12  本文已影响0人  Wayne_Dream

总是遇到 equals 和 == 这类题,之前只知道对于基本数据类型, == 比较的是值,对于引用类型,== 比较的是内存地址。关于 equals 方法,首先是在Object 中被定义的,它的定义中就是使用==方式来匹配的。equals 默认是用来比较内存地址的,但是像 String、Long、Integer 等包装类型,默认重写 equals 方法,所以 equals 比较的就是值了。

下面对于此问题进行更详细的解释:

1.关于==

首先要知道==用于匹配内存单元上的内容,其实就是一个数字,计算机内部也只有数字,而在java语言中,当==匹配时,就是比对两个单元内存的内容是否一样。

如果是原始类型,byte,boolean,short,char,int,long,float,double,就是直接比较他们的值。

如果是引用,比较的就是引用的值,引用的值可以被认为是对象的逻辑地址,如果两个引用发生==操作,就是比较两个相应的对象的地址值是否一样,换句话说,如果两个引用保存的是同一个对象,则返回true,否则返回false。

2.关于equals()

equals方法,首先是在Object中被定义的,它的定义中就是使用==方式来匹配的,也就是说,如果不去重写equals方法,并且对应的类其父类列表中都没有重写过equals方法,那么默认的equals操作就是对比对象的地址。

equals方法之所以存在,是希望子类去重写这个方法,实现对比值的功能,类似的,String就自己实现了该方法。


总结:Byte、Short、Integer、Long这几个类的valueOf方法实现类似的。所以在[-128,127]区间内,==比较的时候,值总是相等的(指向的是同一对象),在这个区间外是不等的。
而Float和Double则不相等, Boolean的值总是相等的


测试题:

Integer a = 1000, b = 1000; 
System.out.println(a == b);//1 false
Integer c = 100, d = 100; 
System.out.println(c == d);//2 true

Integer s=new Integer(9);
Integer t=new Integer(9);
Long u=new Long(9);

上一篇下一篇

猜你喜欢

热点阅读