String字符串比较equals遇到的坑

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;
}

问题终于解决了。从这件小事中我们可以归纳出解决问题的一个捷径,就是从源码入手,刚开始肯定很痛苦,因为源码太复杂了,只要耐着性子好好看下去,多少会有点收获的,我的英语水平有限,所以我看的时候先看他的说明文档,遇到不认识的单词就用有道屏幕取词(真的很很有帮助)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值