java中==和equals的区别是什么?
什么是==?
== 等于比较运算符,如果进行比较的两个操作数都是数值类型,即使他们的数据类型不相同,只要他们的值相等,也都将返回true.如果两个操作数都是引用类型,那么只有当两个引用变量的类型具有父子关系时才可以比较,而且这两个引用必须指向同一个对象,才会返回true.(在这里我们可以理解成==比较的是两个变量的内存地址)
什么是equals()?
区别
坑
int 和 Integer
public static void main(String[] args) { //-128 ~ +127 之间 Integer a = 5; int b = 5; Integer c = new Integer(5); Integer d = 5; System.out.println(a.equals(b)); System.out.println(a == b); System.out.println(a.equals(c)); System.out.println(a == c); System.out.println(a == d); //-128 ~ +127 之外 a = 128; b = 128; c = new Integer(128); d = 128; System.out.println(a.equals(b)); System.out.println(a == b); System.out.println(a.equals(c)); System.out.println(a == c); System.out.println(a == d); }
结果:
重点:
-
System.out.println(a == d); 同样的表达式,不同的值为什么结果不同 System.out.println(a == c); 与 System.out.println(a == d); 同样的对象类型,为什么复制方式不一样,比较结果不一样 System.out.println(a == c); 与 System.out.println(a.equals©); 不同的比较方式,结果为什么不同
解析思路:
首先我们看a,c,d三个变量的赋值方式,其中a和d的赋值方式都是直接赋值,没有调用new关键字,只有d的赋值方式调用了new关键字.然后我们在看赋值的具体数值,一组是5在-128 ~ +127 之间,另一组是128在/-128 ~ +127 之外.我们可以通过已知的不同点去阅读源码.(其中不同的比较方式为什么结果不同,这个可以猜出一定是Integer重写了equals()方法.)
结论:
-
赋值方式中如果调用了new关键字,一定会在内存中给你分配一个新的地址 给Integer类型赋值的时候,如果没有调用new关键字,并且值在-128与+127之间,包括-128和+127,那么指向的都是同一个内存位置. Integer类中重写了equals()方法,使用equals()方法进行比较的时候,实际上比较的内存中最终指向的值的内存位置,不是直接比较变量的内存位置. 重写的equals()方法
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
小结:
本来想接着写下String的一些所谓的坑,但是感觉和文章的标题就有点不配了,实际上关于== 和equals已经说过了.包括int和Integer这个坑也不算是坑了.之所以产生不同的结果,只有一个重写equals()方法与本文标题有关,其它的应该是属于Integer类的初始化赋值范围了.我们需要记住的就是==比较的是世界的内存地址,是java提供的比较运算符,而equals()方法是Object中提供的方法,是可以被重写的,你也可以自己重写,所以在使用equals()方法时应该看看此类是如何重写的,仅此而已.
上一篇:
Java基础知识总结(2021版)
下一篇:
华为od一面 / 二面复盘