程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java String 的 equals() 方法可能的優化

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

編輯:關於JAVA

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.

*

* @param original a 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.

*

* @param anObject the object to compare this String

* against.

* @return true if the String are equal;

false 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[] 的情況,能夠加快比較速度。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved