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