-----<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一."=="和equals的实质
在JAVA中利用"=="比较变量时,系统使用变量在"栈"中所存的值作为比较的依据。基本数据类型在"栈"中存的是其内容值,而对象类在"栈"中存的是地址,这些地址指向"堆"中的对象。 java.lang包中的Object类有public boolean equals(Object obj)方法,它比较两个对象是否相等。其它对象 的equals方法仅当被比较的两个引用指向的对象内容相同时,对象的equals()方法返回true。
1.==操作符。专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相当,只能用==操作符。
Java的基本数据类型为(char,byte,short,int,long,float,double,boolean)。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(对内存),变量本身也占用一块内存,例如 Object obj = new Object()变量obj是一个内存,new Object()是一个内存,此时,变量所对应的内存中存储的数据就是对象占用的那块内存的首地址。对于指向对象内存的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
2.构造器形成的差别。对于String和Integer来说,由于他们特有的创建对象的方式。使用构造器和不使用构造器得到一个对象,==方法比较所产生的结果是不同的。
String str1 = “abc”; String str2 = "abc"; 此时str1==str2得到结果为true。String str = new String("abc"); String str = new String("abc");此时 str1==str2得到的结果为false。Integer a = 1; Integer b = 1;此时a==b的结果是true。Integer a = new Integer(1); Integer b = new Integer(1);此时a==b得到的结果为false。
通过这一点其实我们也能够更加容易理解==对内存的实际操作,实际执行的是近似于基本类型比较。
3.equals方法String对象和字符串连接池:
引号内包含文本是String类特有创建对象的方式.但是"=="返回的结果是true,为什么呢?因为在JVM内,存在字符串池,其中保存着很多 String对象,并且可以被共享使用,因此它提高了效率.字符串池由String类维护,我们可以调用intern()方法来访问字符串池。当运用引号内包含文本创建对象时,所创建的对象是加入到字符串池里面的.如果要创建下一个字符串对象,JVM首先会到字符串池中寻找,是否存在对应的字符串对象,如果存在,则返回一个己存在对象的对象的引用给要创建的对象引用.如果不存在,才会创建一个新的对象,并返回一个新对象的对象引用给要创建的对象引用.以上这段话理解起来可能比较拗口.用代码理解就是str2和str1是两个对象引用,并指向了同一个对象.所以'=='返回的是true.
equals方法。用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
例如,对于下面的代码:
String a=new String("abc");
String b=new String("abc");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,他们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b即返回false,而这两个对象中内容是相同的,所以,表达式a.equals(b)将返回true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否相等,许多人稍不注意就使用==进行比较了,这是错误的,有大量这样的错误。记住,字符串的比较基本都是使用equals方法。
如果一个类没有定义equals方法。它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
- boolean equals(Object o){
- return this==o;
- }
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承的)就是使用==操作符,也是比较两个变量指向的对象是否是同一个对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可以认为两个对象的内容是相同的。
二.分析代码总结
- <span style="white-space:pre"> </span>class sss
- <span style="white-space:pre"> </span>{
- public static void main(String[] args)
- {
- Student stu5 = new Student();
- stu5.name = "张三";
- stu5.age = 20;
- Student stu6 = new Student();
- stu6.name = "张三";
- stu6.age = 20;
- Student stu7 = stu5;
- System.out.println("stu5 == stu6 : " + (stu5 == stu6));//false
- System.out.println("stu5.equals(stu6) : " + (stu5.equals(stu6)));//没重写equals:false:重写equals()后:true
- System.out.println("stu5 == stu7 : " + (stu5 == stu7));//true
- System.out.println("stu5.equals(stu7) : " + (stu5.equals(stu7)));//true
- String a = "abc";
- <span style="white-space:pre"> </span>String b = "abc";
- <span style="white-space:pre"> </span>String c = new String("abc");
- <span style="white-space:pre"> </span>String d = new String("abc");
- <span style="white-space:pre"> </span>if(a == b){
- <span style="white-space:pre"> </span>System.out.println("abc对象相等"); //实际结果
- <span style="white-space:pre"> </span>}else{
- <span style="white-space:pre"> </span>System.out.println("abc对象不相等");
- <span style="white-space:pre"> </span>}
- <span style="white-space:pre"> </span>if(a.equals(b)){
- <span style="white-space:pre"> </span>System.out.println("ab相等"); //实际结果
- <span style="white-space:pre"> </span>}else{
- <span style="white-space:pre"> </span>System.out.println("ab不相等");
- <span style="white-space:pre"> </span>}
- <span style="white-space:pre"> </span>if(c.equals(d)){
- <span style="white-space:pre"> </span>System.out.println("cd相等"); //实际结果,重写
- <span style="white-space:pre"> </span>}else{
- <span style="white-space:pre"> </span>System.out.println("cd不相等");
- <span style="white-space:pre"> </span>}
- <span style="white-space:pre"> </span>if(c == d){
- <span style="white-space:pre"> </span>System.out.println("cd对象相等");
- <span style="white-space:pre"> </span>}else{
- <span style="white-space:pre"> </span>System.out.println("cd对象不相等"); //实际结果
- <span style="white-space:pre"> </span>}
- <span style="white-space:pre"> </span>}
- <span style="white-space:pre"> </span>}
- <span style="white-space:pre"> </span>class Student
- <span style="white-space:pre"> </span>{
- <span style="white-space:pre"> </span>String name;
- <span style="white-space:pre"> </span>int age;
- <span style="white-space:pre"> </span>}