В чем особенности класса String в Kotlin
Что проверяют
Знаете ли вы, чем строки в Kotlin отличаются от Java на практике, а не только то, что они неизменяемые. Для Android вопрос часто уходит в сравнение строк, работу с null и в то, откуда в приложении берутся тексты для пользователя.
Как отвечать
- неизменяемость: на JVM и в Android
kotlin.Stringкомпилируется вjava.lang.String. Любая операция создаёт новую строку, поэтому в цикле собирают черезbuildString { }илиStringBuilder; - сравнение:
==вызываетequalsи сравнивает содержимое,===сравнивает ссылки. Без учёта регистра:equals(other, ignoreCase = true); - null-безопасность:
StringиString?это разные типы, отсюдаisNullOrEmpty(),isNullOrBlank(),orEmpty(); - шаблоны:
"$name"и"${user.age + 1}"вместо конкатенации; - raw-строки: в тройных кавычках экранирование не работает, отступы убирают
trimIndent()илиtrimMargin(); - расширения из
kotlin.text:substringBefore,removePrefix,padStart,toIntOrNull. Регистр меняютuppercase()иlowercase(): старыеtoUpperCase()иtoLowerCase()устарели, а новые не зависят от локали устройства; CharSequence:s[0]возвращаетChar,lengthсчитает единицы UTF-16, поэтому эмодзи занимает два символа и больше.
Отдельно стоит split. В Kotlin "a,b,,".split(",") вернёт четыре элемента, включая пустые хвосты, а Java их отбросила бы. К тому же строковый аргумент Kotlin трактует как литерал, для регулярного выражения нужен Regex.
Для Android добавьте: текст для пользователя берут из strings.xml через getString(R.string.greeting, name) или stringResource в Compose, числа через plurals. Шаблон в коде годится для логов, но не для интерфейса, иначе не будет локализации.
Где спотыкаются
Сравнивают через ===. Литералы интернируются, поэтому в простом примере ответ совпадёт, а на строке из сети или из substring уже нет.
Считают, что split работает как в Java. Разница в пустых хвостах и регулярных выражениях ломает парсинг, перенесённый с Java.
Собирают строку в цикле через +=. На длинных данных это лишние аллокации и работа для сборщика мусора.