理解 "==" 与 "equals( )"
1、java 的 “ == ”
1.1、基本数据类型
双方都是基本数据类型的数值的时候 == 比较的是双方的数值
System.out.println( 10 == 10);
System.out.println( 10 == 11);
双方数值相同为 true 不同 为 false
1.2、引用数据类型
双方都是 字符串(引用)的时候比较的是双方的 内存地址
String i1 = new String("张三");
String i2 = new String("张三");
System.out.println(i1 == i2);
因为 i1 与 i2 所指向堆对象的内存地址不同所以为 false
2、java 的 equals()方法
equals( ) 是 java.lang 包下 Object 类里面的一个方法
Object 类里面的 equals 方法 源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
可以看见源码中使用的是 “==” ,由此可以看出 Object 里面的 equals 方法其实底层比较的是内存地址,需要把 equals 方法重写才能比较内容
- 如下,API 帮助文档中表示 equals 方法推荐覆盖
2.1、比较字符串
因为 String 类中的 equals 方法已经被 sun 公司覆盖重写,所以比较的是双方的内容
sun公司 重写的 String 类中的 equals 方法如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
先别管能不能看得懂String类的equals方法,只需要 equals 方法其实最底层 Object 类里面还是使用的 “==” ,比较的是内存地址,之所以可用使用 equals 方法来判断双方字符串的内容,是因为 String 类里面的equals 方法已经被 sun 公司给重写了,所以比较的是双方字符串的内容 ,如下:
String i1 = new String("张三");
String i2 = new String("张三");
System.out.println(i1.equals(i2));
因为使用了 String 类里面的 equals 方法进行比较
3、小结
可以理解为:
纯属技术分享
如有错误请及时指出
希望对你能有帮助
|