Java String 的 equals() 方法可能的优化

优化

JDK1.4, 1.5 的 String Class 代码如下

以下内容为程序代码

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;

 

 

 

以下内容为程序代码

    /**

     * 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;

    }

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

 

 

 

以下内容为程序代码

    /**

     * 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;

    }

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

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

 

 

 

以下内容为程序代码

            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;

                        }

 

 

 

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

时间: 2025-01-19 13:48:01

Java String 的 equals() 方法可能的优化的相关文章

对象-java中重写equals方法为什么不直接在里面比较hashcode()?

问题描述 java中重写equals方法为什么不直接在里面比较hashcode()? 看书上说只要重写在一个类中重写equals方法,那就一定要重写hashcode方法,因为两个对象只要equals返回值为true,那么他俩的hashcode就一定相同. 那为什么不可以提前先写好hashcode函数,然后在equals函数里面直接来一行if(this.hashcode() == otherObject.hashcode()) return true;else return false;就行了?

java String的intern方法_java

首先我们应该清楚的是JDK1.6和JDK1.7中String类的intern方法还是有差别的:   JDK1.6中的intern:    调用intern方法的时候首先会去常量池中查看是否存在与当前String值相同的值,如果存在的话,则直接返回常量池中这个String值的引用:如果不存在的话,则会将原先堆中的该字符串拷贝一份到常量池中.   JDK1.7中的intern:    调用intern方法的时候首先会去常量池中查看是否存在与当前String值相同的值,如果存在的话,则直接返回常量池中

JAVA中重写equals()方法的同时要重写hashcode()方法

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码.如下:(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true (2)当obj1.ha

如何在Java中避免equals方法的隐藏陷阱

译者注 :你可能会觉得Java很简单,Object的equals实现也会非常简单,但是事实并不是你想象的这样,耐心的读完本文,你会发现你对Java了解的是如此的少.如果这篇文章是一份Java程序员的入职笔试,那么不知道有多少人会掉落到这样的陷阱中. 摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继承类作为面向对象语言中的等价关系的基础问题,要保证派生类的e

java string 转date方法如何实现_java

针对JSON 返回String 类型 两次格式化就行了,例如: Java代码 复制代码 代码如下: String s = "2012-08-25"; SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年M月d日"); try { System.out.println(sdf2.f

Java中判断对象是否相等的equals()方法使用教程_java

Object类中的equals方法用于检测一个对象是否等于另一个对象.在Object类中,这个方法判断两个对象是否具有相同的引用,如果两个对象具有相同的引用,它们一定是相等的.从这点上看,将其作为默认操作也是合乎情理的.然而,对于多数类类说,这种判断并没有什么意义,例如,采用这种方式比较两个PrintStream是否相等就完全没有意义.然而,经常需要检测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的.所以一般在自定义类中都要重写equals比较. 下面给出编写一个完美eq

对象-java的equals方法重写中的小问题

问题描述 java的equals方法重写中的小问题 public boolean equals(Object otherObject) { // a quick test to see if the objects are identical if (this == otherObject) return true; // must return false if the explicit parameter is null if (otherObject == null) return fal

java String类常量池分析及&quot;equals&quot;和&quot;==”区别详细介绍_java

java "equals"和"=="异同 首先简单说一下"equal"和"==" ==操作对于基本数据类型比较的是两个变量的值是否相等, 对于引用型变量表示的是两个变量在堆中存储的地址是否相同, 即栈中的内容是否相同 equals操作表示的两个变量是否是对同一个对象的引用, 即堆中的内容是否相同. 综上,==比较的是2个对象的地址,而equals比较的是2个对象的内容. 再简单介绍一下String类 String类 又称作不可

java必学必会之equals方法_java

一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 package cn.galc.test; public class TestEquals { public static void main(String[] args) { /** * 这里使用构造方法Cat()在堆内存里面new出了两只猫, * 这两只猫的color,weight,height都是一样的, * 但c1和c2却永远不会相等,这是因为c1和c2分别为堆内存里面两只猫的引用对象, * 里面装着可以找到这两只猫