Строки - это, по сути, неизменяемые обертки вокруг char[]
, с множеством полезных служебных методов.
Итак, чтобы проверить, равны ли две строки, вы просто проверяете, имеют ли они char
массивы одинакового размера и с одинаковым содержимым.
Используя класс Arrays
, который имеет полезные методы для работы с массивами, упрощенная реализация String
может выглядеть так:
public final class String {
private char[] value;
public String(char[] value) {
this.value = value.clone();
}
@Override
public boolean equals(Object obj) {
if (! (obj instanceof String))
return false;
String other = (String) obj;
return Arrays.equals(this.value, other.value);
}
@Override
public int hashCode() {
return Arrays.hashCode(this.value);
}
public char[] toCharArray() {
return this.value.clone();
}
public String substring(int beginIndex, int endIndex) {
return new String(Arrays.copyOfRange(this.value, beginIndex, endIndex));
}
// more utility methods
}
Реальный класс String
более сложен, в зависимости от версии Java, по-разному.
например. в более ранних версиях char[]
мог совместно использоваться несколькими String
объектами, например, substring()
не нужно будет копировать массив.
В более поздних версиях оптимизации были изменены, чтобы хранить символы в byte
( LATIN1 ) массивах, если это возможно, вместо char
( UTF- 16 ) массивов, чтобы сэкономить место.
Эти различные оптимизации, конечно, усложнят внутренний код служебных методов String
, что может вас смущать, когда вы смотрите на исходный код JDK.