Ссылочный тип Содержит массив символов: - Если входят в LATIN-1, то byte - Если нет - char Строки неизменяемые - любое изменение это новая строка Хранятся в String Pool Если такая же есть в String Pool - то новая не создается (интернирование строк) ## Интернирование ```Java String s1 = "Hello World"; String s2 = "Hello " + "World"; // s1 == s2 - на этапе создания компилятор все понял и не стал засорять стринг пул String s3 = new String("Hello World"); // специально выделили место под новую строку // s1 != s3 s3 = s3.intern(); // s1 == s3 ``` При создании компилятор может додуматься не создавать одинаковые строки несколько раз, но если изменить динамически, то все меняется ```Java String s4 = "Hello"; s4 += " World"; // s4 != s1, но s4.equals(s1) - true s4 = s4.intern(); // s4 == s1 ``` ## Конкатенация Склеивание строк - `+` Типы приводятся к строке ```Java "Hello" + " " + "world" // Hello world "Hello" + 5 + 10 // Hello510 "Hello" + (5 + 10) // Hello15 5 + 10 + "Hello" + 5 + 10 // 15Hello510 ``` ## StringBuilder Хранит массив char и позволяет легко менять строку, пример паттерна [[Builder]] ```Java StringBuilder sb = new StringBuilder("Hello"); sb.append("!"); String res = sb.toString(); // полезные методы reverse(), append(), insert(index, arg), delete(start, end), deleteCharAt(index), ``` Полезные методы: - `reverse()` - разворачивает цепочку - `append(arg)` - добавляет в конец - `insert(index, arg)` - добавляет по указанному индексу - `delete(start, end)` - удаляет от start до end, end не включительно - `deleteCharAt(index)` - удаляет символ на индексе - `replace(start, end, str)` - заменяет - `charAt(index)` - символ по индексу - `setCharAt(index, ch)` - заменяет по указанному индексу - `substring(start, end)` - возвращает подстроку - `length()` - возвращает длину - `setLength(newLength)` - обрезает или дополняет символы ## Полезные методы строк - `charAt(index)` - символ на определенном индексе - `toCharArray()` - получить массив символов - `new String(char[] arr)` - можно создать из массива символов - `substring(start, end)` - подстрока `[start,end)` - `length()` - длина - `split(str)` - сплит по строке - `String.join(delimiter, elements)` - соединение массива по символу