中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > 综合文章
Java String 的 equals() 方法可能的优化
作者:未知 时间:2005-07-27 22:37 出处:CSDN 责编:chinaitpower
              摘要:Java String 的 equals() 方法可能的优化

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]

从这段构造函数中,我们可以看出,不同ReferenceString之间有可能共享相同的 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[] 的情况,能够加快比较速度。


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有