Ильдар Хабибуллин - Java 7 [Наиболее полное руководство]
- Название:Java 7 [Наиболее полное руководство]
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2012
- ISBN:978-5-9775-0735-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Ильдар Хабибуллин - Java 7 [Наиболее полное руководство] краткое содержание
Java 7 [Наиболее полное руководство] - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Зачем в язык введены три класса для хранения строк? В объектах класса 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 на строку-константу:
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' — '\u 00FF' кодировки Unicode, соответствующий кодам Latinl. Тексты, записанные кириллицей, будут выведены неправильно.
Если же на компьютере сделаны местные установки, как говорят на жаргоне "установлена локаль" (locale) (в MS Windows это выполняется утилитой Regional Options (Язык и стандарты) в окне Control Panel (Панель управления)), то компилятор, прочитав эти установки, создаст символы Unicode, соответствующие местной кодовой странице. В русифицированном варианте MS Windows это обычно кодовая страница CP1251.
Если исходный массив с кириллическим ASCII-текстом был в кодировке CP1251, то строка Java будет создана правильно. Кириллица попадет в свой диапазон '\u0400'— '\u04FF' кодировки Unicode.
Но у кириллицы есть еще по меньшей мере четыре кодировки:
□ в MS-DOS применяется кодировка CP866;
□ в UNIX обычно применяется кодировка KOI8-R;
□ на компьютерах Apple Macintosh используется кодировка MacCyrillic;
□ есть еще и международная кодировка кириллицы ISO8859-5.
Например, байт 11100011(0xE3 — в шестнадцатеричной форме) в кодировке CP1251 представляет кириллическую букву г, в кодировке CP866 — букву у, в кодировке KOI8-R — букву ц, в ISO8859-5 — букву у, в MacCyrillic — букву г.
Если исходный кириллический ASCII-текст был в одной из этих кодировок, а местная кодировка — CP1251, то Unicode-символы строки Java не будут соответствовать кириллице.
В этих случаях применяются последние четыре конструктора, в которых параметром encoding или charset указывается, какую кодовую таблицу использовать конструктору при создании строки.
class StringTest{
null, | winLikeUNIX = | null |
null, | dosLikeUNIX = | null |
null, | unixLikeUNIX = | null |
public static void main(String[] args){ String winLikeWin = null, winLikeDOS String dosLikeWin = null, dosLikeDOS String unixLikeWin = null, unixLikeDOS String msg = null; byte[] byteCp1251 = {
Читать дальшеИнтервал:
Закладка: