Ответ 1
String.length()
- количество кодовых единиц UTF-16, необходимых для представления строки. То есть, это число значений char
, которые используются для представления строки (при этом она равна toCharArray().length
). Для западных языков это обычно совпадает с количеством символов Юникода (кодовых точек) в строке. Значения будут разными в любое время, когда используются UTF-16 суррогатные пары. Такие пары необходимы только для кодирования символов вне BMP и редко используются в большинстве письменная форма.
String.getBytes().length
- количество байтов, необходимых для представления вашей строки в кодировке по умолчанию платформы. Например, если кодировка по умолчанию была UTF-16 (редко), это было бы ровно 2x значение, возвращаемое String.length()
. Чаще всего, ваша кодировка платформы будет многобайтовой кодировкой, такой как UTF-8.
Это означает, что связь между этими двумя длинами сложнее. Для строк ASCII два вызова почти всегда дают одинаковый результат (за пределами необычных кодировок по умолчанию, которые не кодируют подмножество ASCII в 1 байт). Вне строк ASCII String.getBytes().length
, вероятно, будет длиннее, поскольку он подсчитывает байты, необходимые для представления строки, тогда как length()
подсчитывает 2-байтовые кодовые единицы.
Что более подходит?
Обычно вы будете использовать String.length()
совместно с другими строковыми методами, которые принимают смещения в строку. Например, чтобы получить последний символ, вы должны использовать str.charAt(str.length()-1)
. Вы использовали бы только getBytes().length
, если по какой-то причине вы имели дело с кодировкой массива байтов, возвращаемой getBytes
.