Строки

From AsIsWiki
Revision as of 10:03, 4 April 2015 by Alex (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
Форум

Назад | Оглавление | Дальше


Contents

Класс String

В Java нет встроенного типа для строк. Стандартная библиотека языка содержит класс String.

Каждая строка, помещенная в кавычки, представляет собой экземпляр класса String:

String e = "";  // пустая строка

String greeting = "Hello";


Кодовые точки и кодовые единицы

Java-строки состоят из значений типа char.

Тип char задает кодовые единицы, представляющие кодовые точки Unicode в кодоровке UTF-16.

Наиболее распространенные символы Unicode представляются одной кодовой единицей.

Дополнительные символы задаются парами кодовых единиц.

Метод length() возвращает число кодовых единиц строки в кодировке UTF-16:

String greeting = "Hello";

int n = greeting.length();  // n = 5;

Реальное число кодовых точек определяется так:

int cpCount = greeting.codePointCount(0, greeting.length());

Метод s.charAt(n) возвращает кодовую единицу в позиции n [0 .. s.length() - 1]:

char first = greeting.charAt(0);  // first = 'H'

char last = greeting.charAt(4);   // last = 'o'

Получение i-ой кодовой точки:

int index = greeting.offsetByCodePoints(0, i);

int cp = greeting.codePointAt(index);

Тип char представляет низкоуровневую обработку символов.

Низкоуровневые операции часто приводят к недоразумениям. Например, в строке, состоящей из двух символов (двухкодовый + однокодовый), требуется вернуть второй символ:

char ch = s.charAt(1);  // первый символ находится в позиции 0

Данный вызов вернет второй код двухкодового символа, а не второй символ, как требовалось.

Следующий код позволяет последовательно перебрать все символы строки:

int cp = s.codePointAt(i);

if (Character.isSupplementaryCodePoint(cp)) {
    i += 2;
} else {
    i++;
}

Метод codePointAt() определяет, является ли кодовая единица первой или второй частью дополнительного символа, и всегда возвращает корректный результат.

Просмотр строки в обратном направлении:

i--;

int cp = s.codePointAt(i);

if (Character.isSupplementaryCodePoint(cp)) {
    i--;
}


Подстроки

Метод substring() класса String выделяет подстроку заданной стоки:

String greeting = "Hello";

String s = greeting.substring(0, 2);  // s = "He"

Строка s.substring(a, b) всегда содержит b - a кодовых единиц.


Изменение строк

Объекты класса String немодифицируемые (immutable). Поэтому, в классе String нет методов вставки и удаления символов. Все изменения строки выполняются путем конкатенации подстрок. Например, требуется изменить строку "Hello" на "Help!":

String s = "Hello";

s = s.substring(0, 3) + "p!";  // s = "Help!"

Можно изменить содержимое переменной s, и заставить ее ссылаться на другую строку.

Неизменяемые строки имеют одно большое преимущество: компилятор может делать строки совместно используемыми. При копировании строки, оригинал и копия содержат одну и ту же последовательность символов. Логично не дублировать строку, а поместить в переменные ссылку на одну и ту же область памяти. Разработчики Java решили, что эффективность совместного использования памяти дороже сложностей с редактированием строк путем конкатенации подстрок.

Для повышения эффективности сборки символов (поступающих из файла или клавиатуры) в строку, предусмотрен класс StringBuffer.

Каждый раз, при смене значения строковой переменной, система "сборки мусора" удаляет из памяти уже не нужные символы.


Конкатенация

String s1 = "Конь";

String s2 = "як";

String s = s1 + s2;  // s == Коньяк

При конкатенации строки со значением, отличным от строкового, это значение преобразуется в строку:

int house = 38;

String address = "Petrovka " + house;  // address == "Petrovka 38"

Это свойство широко используется в операторах вывода:

System.out.println("Ответ: " + answer);


Проверка совпадения строк

Метод equals() сравнивает две строки, и возвращает true или false, в зависимости от результата:

s.equals(t)

В качестве s и t могут быть использованы как переменные, так и константы:

"Hello!".equals(greeting)

Следующий метод позволяет игнорировать регистр букв при проверке:

"Hello!".equalsIgnoreCase("hello")

Для проверки строк на равенство нельзя применять оператор "==", т.к. он сравнит не строки, а ссылки на эти строки.

Дополнительно, в Java имеется метод compareTo() (аналог strcmp() в языке С):

if (greeting.compareTo("Help") == 0) {
    ...
}


Интерактивная документация по API

Файл jdk-6-doc.zip качаем с сайта http://www.oracle.com/technetwork/java/index.html

После распаковки архива API-дока будет здесь: docs/api/index.html

Аналогичную доку можно смотреть прямо в сети: http://docs.oracle.com/javase/6/docs/api/

Верхний левый фрейм отображает имена всех доступных пакетов.

Нижний левый фрейм содержит все классы.

Для тренировки находим класс String, и просматриваем все его методы.

Находим метод compareToIgnoreCase, и смотрим его описание.


Справочник

java.lang.String

char charAt(int index)

Возвращает символ из позиции index. Использовать только при необходимости 
доступа к низкоуровневым кодовым единицам.
int codePointAt(int index)

Возвращает кодовую точку, 
начало или конец которой находится в позиции index
int offsetByCodePoints(int startIndex, int cpCount)

Возвращает индекс кодовой точки, 
которая определяется переменной cpCount относительно startIndex
int compareTo(String other)

Возвращает:
  0 - если строки равны
 -1 - если сравниваемая строка лексикографически меньше строки other
 +1 - иначе
boolean endsWith(String suffix)

Возвращает true, если строка заканчивается подстрокой suffix
boolean equals(Object other)

Возвращает true, если сравниваемая строка равна строке other
boolean equalsIgnoreCase(String other)

Возвращает true, если сравниваемая строка равна строке other,
без учета регистра.
int indexOf(String str)

int indexOf(String str, int fromIndex)

int indexOf(int cp)

int indexOf(int cp, int fromIndex)

Возвращает индекс первой подстроки str или кодовой точки cp
Поиск выполняется с позиции 0 или fromIndex
Если подстрока или кодовая точка не найдены, то результат -1
int lastIndexOf(String str)

int lastIndexOf(String str, int fromIndex)

int lastIndexOf(int cp)

int lastIndexOf(int cp, int fromIndex)

Возвращает индекс последней подстроки str или кодовой точки cp
Поиск выполняется с позиции 0 или fromIndex
Если подстрока или кодовая точка не найдены, то результат -1
int length()  // возвращает длину строки
int codePointCount(int startIndex, int endIndex)

Возвращает количество кодовых точек между startIndex и endIndex - 1
Каждый дополнительный символ описывается двумя кодовыми точками
String replace(CharSequence oldString, CharSequence newString)

Возвращает строку, в которой все подстроки oldString заменены на newString
В качестве CharSequence могут выступать объекты String или StringBuilder
boolean startWith(String prefix)

Возвращает true, если строка начинается с подстроки prefix
String substring(int beginIndex)

String substring(int beginIndex, int endIndex)

Возвращает подстроку из символов от beginIndex до конца строки 
или до endIndex - 1
String toLowerCase()  // преобразует все символы строки в нижний регистр

String toUpperCase()  // преобразует все символы строки в верхний регистр

String trim()         // удаляет все пробелы в начале и конце строки



Форум

Назад | Оглавление | Дальше

Personal tools
Namespaces

Variants
Actions
Navigation
Tools