java中equals和==区别
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,
例如:
Objet obj = new Object();
?
变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
但是对于下面的情况:
String a=new String("foo"); String b=new String("foo"); ?两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的。一般来说,我们需要比较对象的内容是否相同,可是这时候用==却不能实现,那么该怎么办呢。我们可以将两个对象的内容一一取出来进行比较,如果都相等就返回真,否则返回假。而equals方法就是这样实现的。?
JAVA中Object类的equals方法的实现代码如下:
boolean equals(Object o){ return this==o; } ?可以看到,如果一个类不重写equals方法,那么它就和==效果一样。所以对于一个类,如果需要比较对象是否相同,一定要重写equals方法。也许有人会问字符串不是对象么,为什么我可以直接使用equals而不重写它呢?那是因为JAVA已经重写了字符串的equals方法。像String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,都已经覆盖了object类的equals()方法