Есть ли сценарий, где массив символов лучше, чем строки в Java - PullRequest
0 голосов
/ 22 сентября 2018

Я чувствую, что строки могут заменить массив символов во всех сценариях.Даже с учетом характеристики неизменяемости строк, объявление строк в соответствующей области видимости и функция сборки мусора в java должны помочь нам избежать утечек памяти.Я хочу знать, есть ли какой-нибудь угловой случай, когда символьный массив должен использоваться вместо строк в Java.

Ответы [ 4 ]

0 голосов
/ 22 сентября 2018

Вам не нужно смотреть намного дальше, чем на методы в базовом API JDK, которые используют char[].

Например, this (java.io.Reader):

 public int read(char[] cbuf)
     throws IOException

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

Параметры:

  • cbuf - Буфер назначения
  • Возвращает: Количество прочитанных символов или -1, если достигнут конец потока
  • Броски: IOException - Если возникает ошибка ввода-вывода

Вместо возврата String они просят вас передать char[] для использования в качестве буфера для записи результата.Причина в эффективности.

0 голосов
/ 22 сентября 2018

Возможно, вы знаете, что String неизменен и как Substring может вызвать утечку памяти в Java.Поскольку строки являются неизменяемыми в Java, если вы храните пароль в виде обычного текста, он будет доступен в памяти до тех пор, пока сборщик мусора не очистит его, и поскольку строки используются в пуле строк для повторного использования, существует довольно высокая вероятность того, что он будет оставаться в памяти в течение длительного времени,которые представляют угрозу безопасности.Поскольку любой, кто имеет доступ к дампу памяти, может найти пароль в виде открытого текста.Поскольку строки являются неизменяемыми, содержимое строк не может быть изменено, потому что любое изменение приведет к появлению новой строки, в то время как если вы используете char [], вы все равно можете установить все его элементы как пустые или нулевые.Таким образом, хранение пароля в массиве символов явно снижает риск кражи пароля.

0 голосов
/ 22 сентября 2018

Символьные массивы имеют небольшое преимущество по сравнению с простыми строками, когда речь идет о хранении конфиденциальных данных.Об этом много ресурсов, например, этот вопрос: Почему для паролей предпочитается char [], а не String? ответом самого Джона Скита ).

В целом, это сводится к двум вещам:

  • Вы очень мало влияете на то, как долго String остается в памяти.Из-за этого вы можете утечь конфиденциальные данные через дамп памяти.
  • Случайная утечка конфиденциальных данных в журналах приложений, поскольку простой текст гораздо вероятнее с простыми строками

Дополнительные сведения:

0 голосов
/ 22 сентября 2018

String - это класс, а не тип сборки.Скорее всего, он делает то, что делает, используя массив char внизу, но нет никакой гарантии.«Нам все равно, как это реализовано».У него есть методы, которые имеют смысл для строк, например, сравнение строк.Сравнение массивовХм.Не имеет смысла делать это.Вы можете проверить, равны ли они точно, но меньше или больше, чем ...

Назад в точку.Один сценарий - вы хотите работать с символами, а не со строкой.Например, у вас есть буквы алфавита и вы хотите их отсортировать.Или оценки в системе AF, и вы хотите отсортировать их.Обычно там, где имеет смысл использовать символы, которые не связаны, чтобы иметь какое-то значение вместе (например, в строке сообщения или текстовом сообщении).Вам бы вообще не нужно было сортировать символы текстового сообщения сейчас, не так ли?Итак, вы используете массив.Для сортировки вы можете воспользоваться, например, методом Arrays.sort (), хотя я не думаю, что есть метод, который делает это для строк.Возможно 3 часть библиотеки.

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

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