Нормальная модель длины строки Java
String.length()
- это , указанное как возвращающее количество char
значений («кодовых единиц») в строке. Это наиболее полезное определение длины строки Java; см. ниже.
Ваше описание 1 семантики length
, основанное на размере резервного массива / фрагмента массива, неверно. Тот факт, что значение, возвращаемое length()
, равно , также , размер базового массива или среза массива просто деталь реализации типичных библиотек классов Java. String
не нужно реализовывать таким образом. В самом деле, я думаю, что видел реализации Java String, в которых он не реализован таким образом.
Альтернативные модели длины струны.
Чтобы получить число кодовых точек Unicode в строке, используйте str.codePointCount(0, str.length())
- см. javadoc .
Чтобы получить размер (в байтах) строки в некоторой другой кодировке, используйте str.getBytes(charset).length
.
Для решения специфичных для локали проблем вы можете использовать Normalizer
, чтобы нормализовать строку в любой форме, наиболее подходящей для вашего варианта использования, а затем использовать codePointCount
, как указано выше.
Но в некоторых случаях даже это не сработает; например венгерские правила подсчета букв, которые стандарт Unicode явно не обслуживает.
Использование String.length () обычно нормально
Причина, по которой большинство приложений используют String.length()
, заключается в том, что большинство приложений не занимается подсчетом количества символов в словах, текстах и так далее ориентированным на человека способом. Например, если я сделаю это:
String s = "hi mum how are you";
int pos = s.indexOf("mum");
String textAfterMum = s.substring(pos + "mum".length());
действительно не имеет значения, что "mum".length()
не возвращает кодовые точки или что это не лингвистически правильное количество символов. Он измеряет длину строки, используя модель, которая соответствует поставленной задаче. И это работает.
Очевидно, что все становится немного сложнее, когда вы выполняете многоязычный анализ текста; например поиск слов. Но даже тогда, если вы нормализуете свой текст и параметры перед началом работы, вы можете большую часть времени безопасно кодировать в терминах «единиц кода», а не «точек кода»; то есть length()
все еще работает.
1 - Это описание было на некоторых версиях вопроса. Смотрите историю редактирования ... если у вас достаточно точек повторения.