标签:style blog color java 使用 strong ar 问题 div
一、问题引入
Java测试两个变量是否相等有两种方式:==运算符和equals方法。
但是这二者完全一样吗?考虑下面程序:
1 public class TestEqual
2 {
3 public static void main(String[] args)
4 {
5 int it = 65;
6 float f1 = 65.0F;
7 System.out.println("65和65.0是否相等? " + (it == f1));
8 char ch = ‘A‘;
9 System.out.println("65和‘A‘是否相等? " + (it == ch));
10
11 String str1 = new String("hello");
12 String str2 = new String("hello");
13 System.out.println("str1和str2是否相等? " + (str1 == str2));
14 System.out.println("str1和是equals str2? " + (str1.equals(str2)));
15 }
16 }
输出:
65和65.0是否相等? true
65和‘A‘是否相等? true
str1和str2是否相等? false
str1和是equals str2? true
由程序结果可以看出:
对于代码13行的判断,显然“不是很合理”,因为直觉上,二者就是一样的啊,这就是我们经常遇到的判断两个引用变量是否相等时,并不严格要求两个引用变量指向同一个对象,如上面程序中的两个字符串变量,只要二者引用的字符串对象里包含的字符序列相同即可认为相等,此时就需要用到equals方法,上述代码最后一行就是如此,结果返回true.
二、再看equals
equals方法是Object类提供的一个实例方法,因此所有引用变量都可调用该方法来判断与其他引用变量是否相等。
真相是残酷的:其实在判断两个引用变量(不是基本类型的变量哦,其实equals是不能够用来判断基本类型变量的)是否相等的时候,equals方法与==是一样的,即只有两个引用变量指向同一个对象时才会返回true. 这……上面的情况怎么解释?
众所周知,所有类都是Object类的子类,所以所有子类都可以重载父类的方法,其实String重写了父类Object类中的equals方法,自己整了一个标准:只要两个字符串包含的字符序列相同就返回true,否则false.( 学了C++的孩子可能会说,我重载==运算符,不重载equals方法,不可以吗,遗憾的是Java是没有运算符重载的)。
很容易看出来,因为Object类提供的equals方法本质上与==一样,这就导致,这个方法没有太大的实际意义,若果像==运算符那样严格的标准比较引用变量,估计实际中很少有两个引用变量会相等,所以这个方法(如果需要的话)常常在我们建立一个类时,就会重写该方法,自己定义一套合理的相等判断标准即可。
标签:style blog color java 使用 strong ar 问题 div
原文地址:http://www.cnblogs.com/90zeng/p/Java_equals.html