==和equals区别
java中经常用来比较的两个语法就是“==”和equals,两者有什么区别呢?想到你应该无数次看到过这个问题了,也可能你已经看过无数篇文章了,如果你还是一头雾水或者是不理解,那试着看看这篇文章,相信你一定能看懂
一、“==” 的理解
1.基本数据类型:对于基本数据类型,如果使用==比较 ,则比较的是两个基本类型变量的值是否相等,比如int a = 2;int b=3 ;则a==b 比较的就是2和3是否相等
2.引用数据类型:对于引用数据类型,比如比较自己新建的两个User对象 ,则比较的实际是两个对象的地址是否相同,如下
User user = new User(); user.setUserId("111"); user.setUserName("李四"); User user1 = new User(); user1 .setUserId("111"); user1 .setUserName("李四"); System.out.println(user==user1);//user 和user1地址不同 所以比较结果也不同
OK。到这就注意了,你会发现,我在举引用的例子的时候,使用的是自己新建的User对象,而不是String。别着急接着往下看。
二、“equals"理解
我们来看下equals实现源码,equals方法是在Object中就有。注意了这里的源码是Object里面的equals。
比较的是当前对象的引用和obj的引用是否相同,也就是说比较的默认就是地址。还记的在上面我们使用的是User而不是String嘛?在这里==比较的是引用的地址,equals也是比较的是引用的地址,所以他们的效果在这里是一样的。即下面结果一样
重写equals方法
Object对象里面的==和equals没有什么区别,这样一看equals方法存在的意义真的不大,不过后来String在Object的基础之上重写了equals,String的源码中找寻
从上面的源码,String中的equals方法首先比较两个对象地址是否一样,一样直接返回true ,不一样则比较的是字符串的内容是否一样。一样返回true 不一样false。也就是说如果像String、Date这些重写equals的类,使用的时候会和Object的不一样。
总结:
==:基本数据类型==比较的是值,引用数据类型==比较的是内存地址
equals():
情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
情况2:类覆盖了 equals() 方法。比如String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是 比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。