快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

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]











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
















返回类别: 教程
上一教程: Java的double类型探索.
下一教程: Java多线程程序设计

您可以阅读与"Java String 的 equals() 方式可能的优化"相关的教程:
· Java性能的优化(上)
· (代码级)Java性能的优化
· Java代码优化--尽可能地使用stack(栈)变量(方式内部的局部变量)
· Java程序的性能优化StringBuffer与Vector
· Java 性能优化技巧集锦 (2)
    微笑服务 优质保证 索取样品