我们知道,每个类都一个equals方法,或者是从基类Object那里继承过来的,或者是自己实现的,而且实现多样。
这里来看一下String这个在java里使用最多且没有之一的类里的equals方法是如何实现这个equals方法的。
首先上一小段代码:
String a = new String("adf");
String b = new String("adf");
boolean equals = a.equals(b);
System.err.println(equals);
这要在我看String这个类的equals方法源码之前,还真不能给出一个确定的答案。那么就从其源码来一探究竟,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;
}
首先可以看到,在第一个条件判断语句中是先判断比较对象与其本身内存地址指向是否一致,显然我们是new出来的两个“值”为“adf”的对象,二者在堆内存中被开辟有两块不同的空间,那么 a 和 b 的指向自然就不相同了(图示如下)。
继续上边源码分析,在第二个条件判断中,会以底层数组方式来比较二者(a以{‘a’, 'd’, 'f'}b以{‘a’, 'd’, 'f'}方式存储),自然为true。
有一点需要声明的是,在可以使用String strName = "...";方式表示一个字符串的时候尽量不要使用new的方式创建,这种情况在频繁运行该代码片的时候极其占用CPU时间。