java equals() 函数_java string 的 equals() 方法可能的优化

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

[code]

public final class String

implements java.io.Serializable, Comparable, 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 String 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 original is needed, use of this

* constructor is unnecessary since Strings are immutable.

*

* @paramoriginala String.

*/

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 true if and only if the argument is not

* null and is a String object that represents

* the same sequence of characters as this object.

*

* @paramanObjectthe object to compare this String

*against.

* @returntrue if the String are equal;

*false otherwise.

* @seejava.lang.String#compareTo(java.lang.String)

* @seejava.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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值