欢迎光临
我们一直在努力

Java String 的 equals() 方法可能的优化-JSP教程,Java技巧及代码

建站超值云服务器,限时71元/月

jdk1.4, 1.5 的 string class 代码如下

[code]

public final class string

    implements java.io.serializable, comparable<string>, charsequence

{

    /** the value is used for character storage. */

    private final char value[];

 

 

 

    /** the offset is the first index of the storage that is used. */

    private final int offset;

 

 

 

    /** the count is the number of characters in the string. */

    private final int count;

[/code]

 

 

 

[code]

    /**

     * initializes a newly created <code>string</code> object so that it

     * represents the same sequence of characters as the argument; in other

     * words, the newly created string is a copy of the argument string. unless

     * an explicit copy of <code>original</code> is needed, use of this

     * constructor is unnecessary since strings are immutable.

     *

     * @param   original   a <code>string</code>.

     */

    public string(string original) {

            int size = original.count;

            char[] originalvalue = original.value;

            char[] v;

            if (originalvalue.length > size) {

                // the array representing the string is bigger than the new

                // string itself.  perhaps this constructor is being called

                // in order to trim the baggage, so make a copy of the array.

                v = new char[size];

                system.arraycopy(originalvalue, original.offset, v, 0, size);

            } else {

                // the array representing the string is the same

                // size as the string, so no point in making a copy.

                v = originalvalue;

            }

            this.offset = 0;

            this.count = size;

            this.value = v;

    }

[/code]

从这段构造函数中,我们可以看出,不同reference的string之间有可能共享相同的 char[]。

 

 

 

[code]

    /**

     * compares this string to the specified object.

     * the result is <code>true</code> if and only if the argument is not

     * <code>null</code> and is a <code>string</code> object that represents

     * the same sequence of characters as this object.

     *

     * @param   anobject   the object to compare this <code>string</code>

     *                     against.

     * @return  <code>true</code> if the <code>string </code>are equal;

     *          <code>false</code> otherwise.

     * @see     java.lang.string#compareto(java.lang.string)

     * @see     java.lang.string#equalsignorecase(java.lang.string)

     */

    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;

    }

[/code]

但是,equals 方法似乎忽略了这个可能。没有直接对两者的char[]的reference进行比较。

按照我的想法,应该加入这么一段。

 

 

 

[code]

            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;

 

 

 

                        ////{{

                        if(i == j && v1 == v2) return true; // note: this line is added by me

                        ////}}

 

 

 

                        while (n– != 0) {

                            if (v1[i++] != v2[j++])

                                    return false;

                        }

[/code]

 

 

 

这样就能够对应共享 char[] 的情况,能够加快比较速度。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » Java String 的 equals() 方法可能的优化-JSP教程,Java技巧及代码
分享到: 更多 (0)

相关推荐

  • 暂无文章