`
k_lb
  • 浏览: 799911 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

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[] 的情况,能够加快比较速度。

分享到:
评论

相关推荐

    Java基础知识点总结.docx

    equals()方法和hashCode()方法 270 数据结构 273 Array方法类汇总 304 Java数组与集合小结 305 递归 309 对象的序列化 310 Java两种线程类:Thread和Runnable 315 Java锁小结 321 java.util.concurrent.locks包下...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题07.==和equals的区别.mp4 │ Java面试题08.String.mp4 │ Java面试题09.讲一下java中的集合.mp4 │ Java面试题10.ArrayList LinkedList.mp4 │ Java面试题11.HashMap和HashTable的区别.mp4 │ Java面试...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题07.==和equals的区别 Java面试题08.String Java面试题09.讲一下java中的集合 Java面试题10.ArrayList 和LinkedList的区别 Java面试题11.HashMap和HashTable的区别 Java面试题12.实现一个拷贝文件的工具类...

    java 面试题 总结

    java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,...

    java面试宝典

    String 有没有length()这个方法? 9 16、在JAVA 中,如何跳出当前的多重嵌套循环? 9 17、构造器Constructor 是否可被override? 9 18、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对...

    Java面试题-基础和集合.docx

    其中,讨论了Java为什么不支持多继承、==和equals的区别、方法重载的条件、String为何设计成不可变、包装类的应用场景、Integer的高速缓存机制等多个方面。 通过面试题的逐一解答,读者可以了解到Java语言的一些...

    Java面试宝典-经典

    11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math....

    Java面试宝典2010版

    11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math....

    java面试题大全(2012版)

    11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math....

    Java面试宝典2020修订版V1.0.1.doc

    21、数组中有没有length()方法,String中有没有length()方法? 18 23、final, finally, finalize的区别。 18 24、‘==’和equals的区别? 18 25、JAVA中Object类中有哪些常用方法? 19 26、heap和stack有什么区别...

    涵盖了90%以上的面试题

    同一个.java文件中是否可以有多个main方法 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 如何在main方法执行前输出”hello world” java程序的初始化顺序 请说出作用域public,private,...

    JAVA面向对象详细资料

    23.1 常用方法:boolean equals(Object) 33 23.2 常用方法:String toString() 34 24 继承整理 34 25 面向对象三大特性:多态(核心) 34 25.1 多态的前提? 35 25.2 什么是多态? 35 25.3 父类的引用指向子类实例...

    Java常见面试题208道.docx

    10.String 类的常用方法都有那些? 11.抽象类必须要有抽象方法吗? 12.普通类和抽象类有哪些区别? 13.抽象类能使用 final 修饰吗? 14.接口和抽象类有什么区别? 15.java 中 IO 流分为几种? 16.BIO、NIO、AIO 有...

    超级有影响力霸气的Java面试题大全文档

    java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 9、说出Servlet的生命周期,并说出Servlet和CGI的区别。  Servlet被服务器实例化后,容器运行其init方法...

    最新Java面试宝典pdf版

    11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math....

    Java面试笔试资料大全

    11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math....

    java面试宝典2012

    11、"=="和equals方法究竟有什么区别? 12 12、静态变量和实例变量的区别? 13 13、是否可以从一个static方法内部发出对非static方法的调用? 13 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math....

Global site tag (gtag.js) - Google Analytics