在基本运算符中, == 扮演一个重要的角色,而跟它相似的还有个 equals()方法,这两个的区别是什么你知道么。
来看个例子
来看下面这段代码
String a = "abc"String b = "abc";String c = new String(“abc”);
下面用两种方法来比较,
boolean resultA = a == b;booolean resultB = a.equals(b);boolean resultC = a == c;
这里的结果是,
resultA == true;resultB == true;resultC == false;
比较容易产生疑惑的地方是 a 跟 c用 == 来比较的时候,为什么会是 false?如果换成 eqauls的话,
boolean resultD = a.equals(c);
resultD则是 true的。下面分析下原因。
== 和 eqauls的实质
其实,== 对比的是内存地址,而 equals()在没有重写的情况下,对于复合类型来说,也是对比的内存地址,如果对于复合类型,可以重写 eqauls方法来定义匹配的规则。
以这个原则,回到上面的例子中。
String a = "abc"String b = "abc";
当我们定义了一个 a之后,其实会在内存里开辟一块地方用来存放字符串,第二次再实例化一个 String对象时,如果缓存池中已经有字符串了,则直接让新对象引用原有的内存地址。所以如果用 == 来比较的话,因为 String不是基本类型,所以直接比较两个的内存地址的情况下是 true 的。
而为什么 resultC 是 false呢?因为当我们用 new String("abc") 来实例化新的对象的时候,即使内存池已经有 "abc" 了,因为 new 操作符的存在,还是会开辟一个内存地址来存放新的对象,所以用 == 来比较 a 跟 c 的话,结果是 false的。
equals() 是什么情况呢
equals()是 Object的一个方法,像 String这种非基本类型是可以重载 equals()来定义自己的匹配逻辑的。所以可以在上面的例子看到,虽然 c 引用了跟 a 不一样的内存地址,但是在用 eqauls来比较的情况下,因为两者的内容相同,所以结果是 true的。
下面贴下 String的 equals方法就明白了
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = length(); if (n == anotherString.length()) { int i = 0; while (n-- != 0) { if (charAt(i) != anotherString.charAt(i)) return false; i++; } return true; } } return false;}
总结
在Java中进行比较的话,如果是基本类型,用 == 就可以。但是如果是复合类型,像 String 这种,甚至于自定义类,如果想要比较的话,单纯用 == 是不行的,必须重载 equals来实现比较的逻辑。
说到这里,顺便说一个有趣的东西,
public class Demo { public static void main(String[] args) { Integer a = 128; Integer b = 128; System.out.println("result: " + (a == b)); }}
这里的结果是 false。
呵呵呵呵…明天再说为什么。