最近看string类,想到了一个问题。
string是有常量池的概念的,所以string中的属性value,如果值相同,那么不同的string对象的value数组会指向到常量池中的同一个char[]对象的。
但是string的equals方法,比较的却是两个value属性(char数组)每个元素的大小,但其实如果字符串内容相同,value是指向同一个对象的,那么比较两个string的value的地址值即可,何必要比较value的每个元素的大小呢?
源码:
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; }
我的想法:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
/*这里增加一个判断,判断两者的value值是否相等,如果相等,就不用for循环了*/
if(anotherString.value==this.value){
return true;
}
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,会这样写String str = "abc";很少会这样写String str = new String(new char[]{'a','b','c'});
所以一般的equals方法,到我新增的那一步即是true了,省略了for循环的一步。
如果看到的人有想法,欢迎一起讨论