锁定老帖子 主题:关于一段代码的疑惑
精华帖 (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; } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-09-28
请查看最新jdk源码。
|
|
返回顶楼 | |
发表时间:2011-09-28
我看了jdk1.6.0_22的src还是一样的
|
|
返回顶楼 | |
发表时间:2011-09-28
chen_yongkai 写道 我看了jdk1.6.0_22的src还是一样的
不好意思,都怪我发帖没说清楚,我这代码是1.6update 24的。 楼上说最新应该是1.7吧,可惜我没装,谁装了发个出来看看啊 |
|
返回顶楼 | |
发表时间: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; } |
|
返回顶楼 | |
发表时间:2011-09-29
你应该好好看看它的逻辑。楼主你那样设置了不觉得会有问题吗?
|
|
返回顶楼 | |
发表时间:2011-09-29
额,看来这的确是个问题啊,原来1.7中已经改过来了啊,看来有时间要装个玩玩,哎,再装的话我机器里就3个版本了
关于: xql80329 写道 你应该好好看看它的逻辑。楼主你那样设置了不觉得会有问题吗?
我不认为我改的有啥问题,请你看看你楼上发的1.7的代码 |
|
返回顶楼 | |
发表时间:2011-09-29
哎,java的内存映射文件Bug,Sun是不准备改了
|
|
返回顶楼 | |
发表时间:2011-09-29
guyuanwuxin 写道 哎,java的内存映射文件Bug,Sun是不准备改了
没 "肾" 了.已经是甲骨文了. |
|
返回顶楼 | |
发表时间: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; } } |
|
返回顶楼 | |