一.关系操作符“==”到底比较的是什么?
下面这个句话是摘自《Java编程思想》一书中的原话:
“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。
==比较的是值,无论是基本类型还是引用类型,比较的都是值
通过代码结合
public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int n=3; int m=3; System.out.println(n==m); String str=new String("hello"); String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1==str2); str1 = str; str2 = str; System.out.println(str1==str2); } }
输出结果是:true false true
因为当==比较的两个对象是基本类型时,直接比较两个对象的值
而当==比较的是两个引用对象时,比较的是两个引用对象指向堆中真正的对象的地址
str1和str2是两个引用对象,他们保存的是真正对象的地址,每当new出一个对象时,地址是不一样的,所以str1不等于str2
str1=str,str2=str:是相当于把str所引用的对象的地址赋给了他们,所以此时比较值时是一样的
二:分析equals的源码
equals是根类Obeject中的方法。源代码如下:
public boolean equals(Object obj) { return (this == obj); }
由此可以看出object的equals比较其实就是在内部调用了==进行比较,也是比较值,即比较真正对象的地址;
不同的子类,可以重写此方法,进行两个对象的equals的判断。
String类源码中重写的equals方法如下,
1 public boolean equals(Object anObject) { 2 if (this == anObject) { 3 return true; 4 } 5 if (anObject instanceof String) { 6 String anotherString = (String) anObject; 7 int n = value.length; 8 if (n == anotherString.value.length) { 9 char v1[] = value; 10 char v2[] = anotherString.value; 11 int i = 0; 12 while (n-- != 0) { 13 if (v1[i] != v2[i]) 14 return false; 15 i++; 16 } 17 return true; 18 } 19 } 20 return false; 21 }
从上面的代码中可以看到,
(1)String类中的equals首先比较地址,如果是同一个对象的引用,可知对象相等,返回true。
(2)若果不是同一个对象,equals方法挨个比较两个字符串对象内的字符,只有完全相等才返回true,否则返回false。
参考:https://www.cnblogs.com/xudong-bupt/p/3960177.html
浙公网安备 33010602011771号