Ответ 1
Является ли замена символа в String нулевым символом даже на Java? Я знаю, что '\ 0' завершит c-строку.
Это зависит от того, как вы определяете, что работает. Он заменяет все вхождения целевого символа на '\0'
? Абсолютно!
String s = "food".replace('o', '\0');
System.out.println(s.indexOf('\0')); // "1"
System.out.println(s.indexOf('d')); // "3"
System.out.println(s.length()); // "4"
System.out.println(s.hashCode() == 'f'*31*31*31 + 'd'); // "true"
Кажется, все работает отлично! indexOf
может найти его, он считается частью длины, а его значение для вычисления хэш-кода равно 0; все указано в JLS/API.
Это НЕ работает, если вы ожидаете, что замена символа нулевым символом каким-то образом удалит этот символ из строки. Конечно, это не так. Нулевой символ по-прежнему является символом!
String s = Character.toString('\0');
System.out.println(s.length()); // "1"
assert s.charAt(0) == 0;
Он также НЕ работает, если вы ожидаете, что нулевой символ завершит строку. Это видно из приведенных выше фрагментов, но также четко указано в JLS (10.9. Массив символов не является строкой):
В языке программирования Java, в отличие от C, массив
char
не являетсяString
, и ни один изString
, ни массив изchar
не заканчиваются символом "\ u0000" (символ NUL).
Будет ли это виновником фанковых персонажей?
Теперь мы говорим о совершенно другой вещи, то есть о том, как строка отображается на экране. Правда есть, даже "Привет мир!" будет выглядеть фанки, если вы используете шрифт dingbats. Строка из Юникода может выглядеть фанкой в одном языке, но не в другом. Даже правильно отображаемая строка юникода, содержащая, скажем, китайские символы, может все еще выглядеть фанкой для кого-то из, скажем, из Гренландии.
Тем не менее, нулевой символ, вероятно, будет выглядеть фанки независимо; обычно это не символ, который вы хотите отобразить. Тем не менее, поскольку нулевой символ не является ограничителем строк, Java более чем способен обрабатывать его так или иначе.
Теперь, чтобы решить, что мы предполагаем, это предполагаемый эффект, т.е. удалить весь период из строки, самым простым решением является использование перегрузки replace(CharSequence, CharSequence)
.
System.out.println("A.E.I.O.U".replace(".", "")); // AEIOU
Здесь также упоминается решение replaceAll
, но оно работает с регулярным выражением, поэтому вам нужно избежать метасимвола точки и, вероятно, будет медленнее.