String字符串比较equals遇到的坑

本文详细解析了Java中String.equals()方法的工作原理及其使用时可能遇到的问题,通过实例展示了如何解决字符串比较时的困惑,并介绍了从源码入手解决问题的方法,包括使用String.trim()方法去除字符串中的空格。

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

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

### Java 中使用 `equals` 方法进行字符串比较Java 编程语言中,为了正确地比较两个字符串的内容是否相等,推荐使用 `String` 类提供的 `equals()` 和 `equalsIgnoreCase()` 方法[^1]。 #### 基本语法 对于简单的字符串常量或变量之间的内容对比: ```java // 创建字符串实例并调用 equals() 方法 public class StringCompareExample { public static void main(String[] args) { String str1 = "Hello"; String str2 = new String("Hello"); boolean result = str1.equals(str2); System.out.println(result); // 输出 true 表明这两个字符串内容一致 // 忽略大小写的比较 boolean ignoreCaseResult = str1.equalsIgnoreCase("hello"); System.out.println(ignoreCaseResult); // 同样输出 true } } ``` 上述代码展示了如何利用 `equals()` 来判断两串字符是否完全匹配以及通过 `equalsIgnoreCase()` 实现不区分大小写的比较操作[^2]。 #### 注意事项 - **避免直接使用 `==` 运算符** 尽管可以工作于某些场景下(当涉及的是同一个字面量创建出来的字符串),但是通常情况下它只用于检测引用指向同一内存位置的对象而不是它们的实际值。因此,在大多数时候应该优先考虑采用 `equals()` 函数来完成逻辑上的等于测试[^3]。 - **处理可能为空的情况** 如果任一参与比较的操作数可能是 null,则应先验证再执行实际的比较动作以免抛出 NullPointerException 异常。一种安全的做法如下所示: ```java if (str != null && str.equals(targetStr)) { // 执行后续业务逻辑... } else { // 处理未找到目标字符串的情形 } ``` 或者更简洁的方式是让静态工具类如 Apache Commons Lang 的 StringUtils 提供的帮助函数来做这项检查: ```java import org.apache.commons.lang3.StringUtils; ... boolean isMatched = StringUtils.equals(str, targetStr); ``` 这种做法不仅提高了代码的安全性和可读性,同时也减少了潜在错误的发生几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值