Как строка представлена ​​в Java внутри? - PullRequest
6 голосов
/ 16 декабря 2011

Я знаю, что строка C abc внутренне будет abc\0 в C, это то же самое с Java?

Ответы [ 7 ]

11 голосов
/ 16 декабря 2011

Нет, это не то же самое в Java.Там нет нулевого терминатора.Строки Java - это объекты, а не указатели на массивы символов.Он поддерживает длину вместе с символами Unicode, поэтому нет необходимости искать нулевой терминатор.

Здесь не нужно спрашивать: посмотрите на источник для String.java в файле src.zipпоставляется с вашим JDK.Вот начало этого:

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;

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;
}
8 голосов
/ 16 декабря 2011

Нет, C-строки представляют собой массив символов и, следовательно, с ними не связано никакой длины.Побочным эффектом этого решения является то, что для определения длины строки необходимо выполнить итерацию по ней, чтобы найти \0, который не столь эффективен для переноса длины вокруг.для их символов и нести длину смещения и длину строки.Это означает, что определение длины строки довольно эффективно.

Источник .

2 голосов
/ 16 декабря 2011

Строки Java не заканчиваются нулем, как строки C. Это потому, что Java хранит длины строк. Вы можете получить длину с помощью String.length().

2 голосов
/ 16 декабря 2011

Нет.Нулевые терминаторы используются в C, потому что это проще, чем передавать указатель и размер.В Java размер всегда известен, поэтому нулевой терминатор не нужен.Кроме того, в Java нет завершающих символов (вставка \0 будет частью буквальной строки).

2 голосов
/ 16 декабря 2011

Строка на языке C - это массив типа char, где, как и в Java, это класс, и он представляет собой коллекцию символов Юникода .

1 голос
/ 16 декабря 2011

Класс String реализован на Java. См. Пример реализации OpenJDK .

Класс OpenJDK 7 String содержит массив типа char[] для хранения самой строки, а также смещение (указывающее первую использованную позицию в char[]), длину строки и хеш-код строки.

Он также имеет два статических поля: идентификатор версии для целей сериализации и ObjectStreamField[] из-за специального регистра относительно потока вывода сериализации (по крайней мере, в OpenJDK 7).

0 голосов
/ 16 декабря 2011

Насколько я знаю, в Java String хранится как объект в разделе кучи как подкласс Object.Нет необходимости использовать '\ 0' для указания только символов или строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...