start и заканчивающуюся перед позицией end исходной строки.
Поначалу представление строк объектами необычно и кажется слишком громоздким, но, привыкнув, вы оцените удобство работы с классами, а не с массивами символов.
Конечно, можно занести текст в массив символов типа char или даже в массив байтов типа byte, но тогда вы не сможете использовать готовые методы работы с текстовыми строками.
Зачем в язык введены три класса для хранения строк? В объектах класса String хранятся строки-константы неизменной длины и содержания, так сказать, отлитые в бронзе. Это значительно ускоряет обработку строк и позволяет экономить память. Компилятор создает только один экземпляр строки класса String и направляет все ссылки на него. Длину строк, хранящихся в объектах классов StringBuilder и StringBuffer, можно менять, вставляя и добавляя строки и символы, удаляя подстроки или сцепляя несколько строк в одну. Во многих случаях, когда надо изменить длину строки типа String, компилятор Java неявно преобразует ее к типу StringBuilder или StringBuffer, меняет длину, потом преобразует обратно в тип String. Например, следующее действие:
String s = "Это" + " одна " + "строка";
компилятор выполнит примерно так:
String s = new StringBuffern.appendC^To'^.appendC одна ")
.append("строка").toString();
Будет создан объект класса StringBuffer или класса StringBuilder, в него методом append ( ) последовательно будут добавлены строки "Это", " одна ", "строка", и получившийся объект класса StringBuffer или StringBuilder будет приведен к типу String методом toString ( ).
Напомним, что символы в строках хранятся в кодировке Unicode, в которой каждый символ занимает два байта. Тип каждого символа — char.
Класс
Перед работой со строкой ее следует создать, как и объект всякого класса. Это можно сделать разными способами.
Самый простой способ создать строку — это организовать ссылку типа String на строку-константу:
String s1 = "Это строка.";
Если константа длинная, можно записать ее в нескольких строках текстового редактора, связывая их операцией сцепления:
String s2 = "Это длинная строка типа String, " +
"записанная в двух строках исходного текста";
Не забывайте о разнице между пустой строкой String s = "", не содержащей ни одного символа, и пустой ссылкой String s = null, не указывающей ни на какую строку и не являющейся объектом.
Самый правильный способ создать объект с точки зрения ООП — это вызвать его конструктор в операции new. Класс String предоставляет вам более десяти конструкторов:
□ String () — создается объект с пустой строкой;
□ String (String str) — конструктор копирования: из одного объекта создается его точная копия, поэтому данный конструктор используется редко;
□ String (StringBuffer str) -преобразованная копия объекта класса StringBuffer;
□ String(StringBuilder str) — преобразованная копия объекта класса StringBuilder;
□ String(byte[] byteArray) — объект создается из массива байтов byteArray;
□ String (char [ ] charArray) — объект создается из массива charArray символов Unicode;
□ String(byte[ ] byteArray, int offset, int count) — объект создается из части массива байтов byteArray, начинающейся с индекса offset и содержащей count байтов;
□ String (char [ ] charArray, int offset, int count) — то же, но массив состоит из символов Unicode;
□ String (int [ ] intArray, int offset, int count) -то же, но массив состоит из символов
Unicode, записанных в массив целого типа, что позволяет использовать символы Unicode, занимающие больше двух байтов;
□ String(byte [ ] byteArray, String encoding) — символы, записанные в массиве байтов, задаются в Unicode-строке с учетом кодировки encoding;
□ String(byte[] byteArray, int offset, int count, String encoding) — то же самое, но только для части массива;
□ String(byte [ ] byteArray, Charset charset) — символы, записанные в массиве байтов, задаются в Unicode-строке с учетом кодировки, заданной объектом charset;
□ String(byte[] byteArray, int offset, int count, Charset charset) — то же самое, но только для части массива.
При неправильном задании индексов offset, count или кодировки encoding возникает исключительная ситуация.
Конструкторы, использующие массив байтов byteArray, предназначены для создания Unicode-строки из массива байтовых ASCII-кодировок символов. Такая ситуация возникает при чтении ASCII-файлов, извлечении информации из базы данных или при передаче информации по сети.
В самом простом случае компилятор для получения двухбайтовых символов Unicode добавит к каждому байту старший нулевой байт. Получится диапазон '\u0000' — '\u00FF' кодировки Unicode, соответствующий кодам Latinl. Тексты, записанные кириллицей, будут выведены неправильно.