Java中的‘==’和equals的区别
八大基本数据类型:byte,short,int,long,double,folat,boolean,char
-
‘==’:
对于基本数据类型的变量,==是直接对其值进行比较。
对于引用数据类型的变量,==是对其内存地址的比较
因此,不管怎样,==是对数值上的一种比较。
-
equals
任何类都继承Object类,Object中就有equals方法:
没有重写equals方法之前,equals方法里是直接调用==,因此实质上与==没有差别。
但是要注意:equals方法不能作用于基本数据类型的变量,这是因为基本数据类型非对象的缘故,没有方法。
在一些类库当中这个方法被重写了,比如String 、Date、ArrayList等类,这样就不在是去比较在堆内存中的存放地址了。
这里我们可以看下String类里equals方法的重写:
可以看到在String类里,equals是逐一对比两者的内容,内容相同才返回true。
-
示例代码
- intern()方法之后把字符串对象加入常量池中,常量池存在于方法区的,是线程共享的,是线程安全的,它会让有相同值的引用指向同一个位置。如果引用值变化了,但是常量池中没有新的值,那么就会新开辟一个常量结果来交给新的引用,而并非像线程不同步那样,针对同一个对象,new出来的字符串和直接赋值给变量的字符串存放的位置是不一样的,前者是在堆里面,而后者在常量池里面。因此,对于输出a==e,a已经被加入常量池中,常量池中已有同值存在,故给e以a相同存放地址,故返回为true。因此,因为d还是在堆内存,存放地址肯定不同,d==e肯定返回为false。
- 做字符串拼接操作,也就是字符串两两相"+"的时候,得出的结果是存在在常量池或者堆里面,这个是根据情况不同不一定的。