String字符串比较equals遇到的坑
java中一切皆对象,任何对象都是直接或者间接继承自object对象,object.equals()其实比较的是两个对象的地址,即若地址相等则返回true。比较特殊的就是string中重写了equals()方法,使他比较的是两个字符创的内容。我们来看看以下代码:
//String[] keyWord = //{"int","main","char","if","else","for","while"};
//private char[] token = new char[MAXCOUNT];
for(int n=0; n < keyWord.length; n++){
String temp = new String(token)
if(keyWord[n].equals(temp))
{
syn=n+1;
break;
}
}
在上面代码中,String.equals()始终返回false;但是通过在控制带输出却看出有相等;
是不是觉得不可思议,于是查看了String.equals()源码:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
发现最初比较的是两个字符创的长度,若长度不等,则直接返回false;
原因可能出在这个地方,于是查看了String(Char[])的构造方法
public String(char value[]) {
int size = value.length;
this.offset = 0;
this.count = size;
this.value = Arrays.copyOf(value, size);
}
为了让大家直观一点,在控制台下打出各个字符长长度
这下终于找到问题所在了,接着就是解决问题了。其实很简单,只要调用一下String.trim()方法就可以了,他的作用就是出去字符串中的空格
这里写代码片
public String trim() {
int len = count;
int st = 0;
int off = offset; /* avoid getfield opcode */
char[] val = value; /* avoid getfield opcode */
while ((st < len) && (val[off + st] <= ' ')) {
st++;
}
while ((st < len) && (val[off + len - 1] <= ' ')) {
len--;
}
return ((st > 0) || (len < count)) ? substring(st, len) : this;
}
问题终于解决了。从这件小事中我们可以归纳出解决问题的一个捷径,就是从源码入手,刚开始肯定很痛苦,因为源码太复杂了,只要耐着性子好好看下去,多少会有点收获的,我的英语水平有限,所以我看的时候先看他的说明文档,遇到不认识的单词就用有道屏幕取词(真的很很有帮助)。