Память представления пустой строки - PullRequest
0 голосов
/ 30 августа 2018

Как пустая строка хранится внутри памяти? Я думал о представлении пустой строки памяти и не могу понять это. Есть ли какое-то конкретное значение ASCII для него? Что такое пустая строка?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

A String объект - это Java Object, как и любой другой. Это объект с атрибутом длины, который в конечном итоге сохраняется в объекте Java как int. Пустой String имеет длину 0 и, следовательно, int == 0. В реальных реализациях объект String внутри имеет ссылку на объект char[] (массив char s).

Для пустого String эта ссылка может быть null. В теории реализация String всегда может иметь ссылку на массив, отличную от null, и использовать длину массива char s в качестве String length int, в этом случае вы Вопрос будет эквивалентен запросу о представлении в памяти пустого массива.

См. реализацию OpenJDK , например:

 private final char value[];

ссылка на массив символов

 private final int count;

- это длина String, как видно из конструктора по умолчанию, который создает пустой String:

 public String() {
    this.offset = 0;
    this.count = 0;
    this.value = new char[0];
 }

(Вам может быть интересно, почему в этой реализации есть offset. Это означает, что подстрока может использовать тот же массив символов, что и ее родительская строка, что во многих случаях уменьшает использование памяти).

0 голосов
/ 30 августа 2018
  • Пустая строка - это строка, длина которой равна 0. Она такая же, как строка, длина которой больше 0, поскольку все они выделен блок памяти для хранения переменной.
  • Все строки доступны только для чтения, то есть блок памяти может не изменяться после инициализации. В некотором коде мы можем увидеть

    str1 = str1 + str2

    , но на самом деле str1 не изменяется из-за правила копирования при записи. Система перераспределяет новый блок памяти для сохранения нового результата и изменяет указатель str1 на новый.

  • По сути, строка является массивом; пустая строка - это просто массив символов без элементов, длина равна 0, но нет разницы между пустой строкой или непустой строкой. У них обоих есть адрес памяти, указатель.

  • Если вы знаете строковый индикатор в C / C ++, это просто указатель на символ *, он всегда заканчивается символом '\0'. Когда вы читаете строку, будет цикл для перемещения указателя char * с первого адреса на следующий, пока он не достигнет '\0'. Таким образом, пустая строка в Java - это просто указатель char *, за которым сразу следует '\0'.

...