JDKソース学習(1)-string
2801 ワード
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence{
...
}
Stringはfinalに修飾され,Stringクラスは継承できないことが決定される.
2.Stringクラスの属性:
private final char value[];
valueはfinalを使用して修飾されるため、Stringオブジェクトの作成後の値は変更されません.
すべてのプロパティはprivateタイプであり、setメソッドは実装されていないため、Stringのプロパティは変更できません.
private int hashprivate static final long serialVersionUID = -6849794470754667710L;
private static final ObjectStreamField[] serialPersistentFields =
new ObjectStreamField[0];
3.コンストラクタ
ここでは、以下のような特殊なものをいくつか説明します.
1)符号化フォーマットがあり、初期化値はbytes[]である.次のように
public String(byte bytes[], int offset, int length, Charset charset) {
...
}
ここでcharsetはStringタイプの符号化値とすることができる.
4.isEmptyはStringの判定方法
public boolean isEmpty() {
return value.length == 0;
}
valueが0であるか否かを判断するboolean値を直接返します.
5.codePointAt Stringのある位置の文字を返すasciiコードの10進数値
public int codePointAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return Character.codePointAtImpl(value, index, value.length);
}
Character.codePointAtImplメソッドのソースコードは
static int codePointAtImpl(char[] a, int index, int limit) {
char c1 = a[index];
if (isHighSurrogate(c1) && ++index < limit) {
char c2 = a[index];
if (isLowSurrogate(c2)) {
return toCodePoint(c1, c2);
}
}
return c1;
}
java.lang.Character.isHighSurrogate(char ch)は、与えられたchar値がUnicode高エージェントエントリコードユニットであると判断する.アドバンスドプロキシアイテムコードユニットとも呼ばれます).
この値は文字そのものではなく、UTF-16で符号化された補足の文字の表現に用いられる.
java.lang.Character.isLowSurrogate(char ch)は、与えられたchar値がUnicode低エージェントコードユニット(末尾エージェントコードユニットとも呼ばれる)であるかどうかを決定する.
これらの値は、自身の文字を表すものではないが、補完文字を表すUTF-16符号化に用いられる.
6.equals
このメソッドはObjectクラスのメソッド書き換えであり,コードは以下の通りである.
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}