您的位置:首页 > 编程语言 > Java开发

Java String Source code in openjdk-7

2013-06-03 13:46 585 查看
public String(char value[], int offset, int count) {

if (offset < 0) {

  throw new StringIndexOutOfBoundsException(offset);

 }

  if (count < 0) {

  throw new StringIndexOutOfBoundsException(count);

 }

  // Note: offset or count might be near -1>>>1.

  if (offset > value.length - count) {

  throw new StringIndexOutOfBoundsException(offset + count);

 }

  this.offset = 0;

  this.count = count;

  this.value = Arrays.copyOfRange(value, offset, offset+count);

 }

构造String时首先看offset是否小于0,如果不是则实用数组的复制方式从第一位开始复制count位数据。

 

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;

}

采用数组方式存储数据后逐个对比。

 

public int compareTo(String anotherString) {

int len1 = count;
int len2 = anotherString.count;
int n = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
 if (i == j) {
int k = i;
int lim = n + i;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
} else {
while (n-- != 0) {
char c1 = v1[i++];
char c2 = v2[j++];
if (c1 != c2) {
return c1 - c2;
}
}
}
return len1 - len2;
}
采用数组方式存储后逐个对比,不同的用ascii码标记。
 
public int hashCode() {
int h = hash;
if (h == 0 && count > 0) {
int off = offset;
char val[] = value;
int len = count;
 for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
用31为计算因子。
 
public int indexOf(int ch, int fromIndex) {
if (fromIndex < 0) {
fromIndex = 0;
} else if (fromIndex >= count) {
// Note: fromIndex might be near -1>>>1.
return -1;
}
 if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
// handle most cases here (ch is a BMP code point or a
// negative value (invalid code point))
final char[] value = this.value;
final int offset = this.offset;
final int max = offset + count;
for (int i = offset + fromIndex; i < max ; i++) {
if (value[i] == ch) {
return i - offset;
}
}
return -1;
} else {
return indexOfSupplementary(ch, fromIndex);
}
}
用数组存储后获取指定字符。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: