浅谈“==”与equals的关系
“==”和equale()方法,是java里常用的判断相等的两个手段。
1,“==”比较两个变量栈中的值是否相同(不论他是基本数据类型还是引用数据类型),其中包括两层意思:
(1)对于基本数据类型,因为基本数据类型的值直接存在栈中,所以比较两个基本数据类型的“值”是不是相等。
(2)对于引用数据类型,引用数据类型在栈里面所保存的是其对象在堆内存的地址,所以,所比较的是两个引用是不是指向同个实例对象。
概括:基本数据类型比较其值是否相同,引用数据类型比较是否指向同个东西。
2,equals方法
(1)Object中该方法其实就在使用“==”操作,本质一样,功能一样。他们是一样的功能来的。任何一个直接继承自Object的对象,他里面的equals()方法执行的就是“==”的功能。
(2)很多情况下,其实我们想要得到的结果是两个对象内容是否相等,比如比较两个字符串,你更多的是想知道,他们内容是否相等,而不是是否指向了同个对象,其实Java里提供的绝大多数类库,都覆写了Object里的equals()方法,他的结果表达的是两个对象内容是否相等,而不再是是否指向同个对象。
比如:String str1 = new String("str");
String str2 = new String("str");
System.out.println(str1.equals(str2));
System.out.println(str1==str2);
打印结果:true
false
现在你就可以明白,由于不是同个对象,所以第二行返回的是false,String覆写了Object的equals()方法,所以第一行打印的true。
(3)另外我要说明一点,第一行之所以打印true,因为String覆写了equals()方法,这是Java替你做的,但是如果你自定义一个对象,equals()方法做的效果会和"=="是一样的,除非你自己去覆写equals()方法。否则,你对该对象的所有“==”操作以及equals()方法都会得到一个结果。
3,总结:
(1)对于基本数据类型,使用“==”你将得到他们两个数值是否相等。对于引用数据类型(对象),你将得到他们两个是否指向同个对象。
(2)Object类里面的equals()方法,效果就是“==”效果,所有直接继承自Object类的类,他的equals()方法,都调用的“==”。
(3)对于类似String那样的类,调用equals()方法,你将得到两个对象内容是否相等。