论坛首页 Java企业应用论坛

关于一段代码的疑惑

浏览 6273 次
精华帖 (0) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间:2011-09-28  

今天需要写一段关于输入字符串的check的代码,突然想到equalIrgoreCase貌似功能上比equals更强大,但是为啥很多时候都只用equals 而不用equalIrgoreCase呢?所以就去看了下源代码,结果发现了String类中的一点额外的东西。

 

源代码如下:

 /**
     * Compares this string to the specified {@code CharSequence}.  The result
     * is {@code true} if and only if this {@code String} represents the same
     * sequence of char values as the specified sequence.
     *
     * @param  cs
     *         The sequence to compare this {@code String} against
     *
     * @return  {@code true} if this {@code String} represents the same
     *          sequence of char values as the specified sequence, {@code
     *          false} otherwise
     *
     * @since  1.5
     */
    public boolean contentEquals(CharSequence cs) {
        if (count != cs.length())
            return false;
        // Argument is a StringBuffer, StringBuilder
        if (cs instanceof AbstractStringBuilder) {
            char v1[] = value;
            char v2[] = ((AbstractStringBuilder)cs).getValue();
            int i = offset;
            int j = 0;
            int n = count;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
        }
        // Argument is a String
        if (cs.equals(this))
            return true;
        // Argument is a generic CharSequence
        char v1[] = value;
        int i = offset;
        int j = 0;
        int n = count;
        while (n-- != 0) {
            if (v1[i++] != cs.charAt(j++))
                return false;
        }
        return true;
    }

  我很想知道为什么当

 if (cs instanceof AbstractStringBuilder)
{
     ...
}

 成立的时候,为啥结尾不直接返回true呢?如果传入的参数是一个StringBuffer or StringBuilder,则需要遍历两次,这是为什么呢?我感觉添加一个return true 更合理一些,不是吗?如:

 // Argument is a StringBuffer, StringBuilder
        if (cs instanceof AbstractStringBuilder) {
            char v1[] = value;
            char v2[] = ((AbstractStringBuilder)cs).getValue();
            int i = offset;
            int j = 0;
            int n = count;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
        return true;
        }
 
   发表时间:2011-09-28  
请查看最新jdk源码。
0 请登录后投票
   发表时间:2011-09-28  
我看了jdk1.6.0_22的src还是一样的
0 请登录后投票
   发表时间:2011-09-28  
chen_yongkai 写道
我看了jdk1.6.0_22的src还是一样的

不好意思,都怪我发帖没说清楚,我这代码是1.6update 24的。
楼上说最新应该是1.7吧,可惜我没装,谁装了发个出来看看啊
0 请登录后投票
   发表时间:2011-09-29  
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Client VM (build 21.0-b17, mixed mode, sharing)

    public boolean contentEquals(CharSequence cs) {
        if (count != cs.length())
            return false;
        // Argument is a StringBuffer, StringBuilder
        if (cs instanceof AbstractStringBuilder) {
            char v1[] = value;
            char v2[] = ((AbstractStringBuilder)cs).getValue();
            int i = offset;
            int j = 0;
            int n = count;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
        // Argument is a String
        if (cs.equals(this))
            return true;
        // Argument is a generic CharSequence
        char v1[] = value;
        int i = offset;
        int j = 0;
        int n = count;
        while (n-- != 0) {
            if (v1[i++] != cs.charAt(j++))
                return false;
        }
        return true;
    }
0 请登录后投票
   发表时间:2011-09-29  
你应该好好看看它的逻辑。楼主你那样设置了不觉得会有问题吗?
0 请登录后投票
   发表时间:2011-09-29  
额,看来这的确是个问题啊,原来1.7中已经改过来了啊,看来有时间要装个玩玩,哎,再装的话我机器里就3个版本了

关于:
xql80329 写道
你应该好好看看它的逻辑。楼主你那样设置了不觉得会有问题吗?

我不认为我改的有啥问题,请你看看你楼上发的1.7的代码
0 请登录后投票
   发表时间:2011-09-29  
哎,java的内存映射文件Bug,Sun是不准备改了
0 请登录后投票
   发表时间:2011-09-29  
guyuanwuxin 写道
哎,java的内存映射文件Bug,Sun是不准备改了


没 "肾" 了.已经是甲骨文了.
0 请登录后投票
   发表时间:2011-09-29  
要是1.7那么改,用下面的方式更直接。
public boolean contentEquals(CharSequence cs) {
if (count != cs.length())  
        return false;
  if(cs.toString().equals(this))
     return true;
  }else{
     return false;
  }
}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics