“==”和equals方法的究竟有什么区别?
“==”:操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存所存储的数值是否相等,要比两个基本的数据或两个引用变量是否相等,只能用“==”操作符。
如果一个变量指向的数据是一个对象类型,那么,这时候就会涉及到了两块内存,其一:对象本身占用一块内存(堆内存),其二:变量也占用一块内存。例如:Object obj = new Object();变量obj是一个内存,new Object()开辟了另一个内存。此时,变量obj所对应的内存中的数值就是对象占用的那块的内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,既要看这两个变量所对应的内存中的数值是否相等,这时候就需要用“==”操作符进行比较。equals方法用于比较两个对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的对象是独立的。例如:对于下面的代码
String a = new String("foo");
String b = new String("foo");
这里如果使用表达a.equals(b),返回的是true;如果使用表达式a==b返回的false;
因为:这里的两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中的一个对象,这是两个不同的对象,它们两的首地址是不相同的,所以a和b中存储的数值是不相同的。因此,表达式a==b返回的是false,而这两个对象的内容是相同的,所以表达式a.equals(b)返回的是true.
扩展:关于String s==null 和string.equals(“”)的区别
在进行“==”或者equals()判断时,会先进行赋值
String s = null: 建立一个s对象,但是这个对象未指向任何的引用
String s =“”:建立一个s对象,而且这个对象指向了一个(“”)空的字符串
- 如果是:String s = null;之后再进行判断,那么
s==null:true
s==“”;false
e.equals(“”):这里会抛出异常,因为equals是对这个对象指向的引用做的判断,可是s没有指向任何引用。 - 如果是:String s=“”之后再进行判断
s==null:false
s==“”:true
e.equals(“”):true
下图更加直观地体现了“==”和equals()的区别
引申:hashcode
1、如果两个对象相等,那么他们一定有相同的哈希值(hash code)。
2、如果两个对象的哈希值相等,那么这两个对象有可能相等也有可能不相等。(需要再通过equals来判断)