Конкатенация строк
Вообще, Java не разрешает применять операции к string-объектам. Однако в этом правиле есть одно исключение. Это операция +, которая связывает две строки, строя в результате string-объект с объединенной последовательностью символов. Можно также организовать цепочку из нескольких + операций. Например, следующий фрагмент связывает три строки:
String age = "9";
String s = "Ему " + age + " лет.";
System.out.println(s);
Здесь происходит конкатенация (сцепление) трех строк, в результате которой на экран выводится строка "Ему 9 лет.".
Еще одно практическое использование конкатенации — это создание очень длинных строк. Вместо ввода длинных последовательностей символов в исходный код можно разбить их на меньшие части и использовать цепочку + операций для их сцепления. Например:
// Использование конкатенации для создания длинных строк.
class ConCat {
public static void main(String args[]) {
String longStr = "Это была бы очень длинная строка, " +
"не удобная ни для ввода, ни для вывода. " +
"Но конкатенация строк " +
"устраняет этот недостаток.";
System.out.println(longStr);
}
}
Конкатенация других типов данных
Операцию конкатенации строк можно использовать с другими типами данных. Например, рассмотрим следующую, немного измененную, версию предыдущего примера:
int age = 9;
String s = "Ему " + age + " лет.";
System.out.println(s);
В этом случае переменная age — имеет int-тип, а не string, как в предыдущем фрагменте, но вывод — такой же, как прежде. Это потому, что int-значение переменной age автоматически преобразуется в ее строчное представление внутри string-объекта и затем сцепляется аналогичным способом. Компилятор преобразует операнд операции конкатенации к его строчному эквиваленту всякий раз, когда другой операнд этой операции является экземпляром (объектом) типа string.
Однако будьте внимательны, когда смешиваете другие типы операций в выражениях конкатенации строк. Вы можете получить неожиданные результаты. Рассмотрим следующий фрагмент:
String s = "четыре: " + 2 + 2;
System.out.println(s);
Этот фрагмент выводит на экран:
четыре: 22
а не
четыре: 4
как вы, вероятно, ожидали. И вот, почему. С учетом старшинства операций сначала выполняется конкатенация первого операнда ("четыре:") со строчным эквивалентом второго ("2"). Этот результат затем сцепляется со строчным эквивалентом третьего операнда (тоже "2"). Чтобы выполнить сначала целочисленное сложение, нужно использовать круглые скобки:
String s = "четыре: " + (2+2);
Теперь s содержит строку "четыре: 4".
Преобразование строк и метод toString()
Когда во время конкатенации данные преобразуются в их строчное представление, вызывается одна из перегруженных версий метода преобразования строк valueof(), определенного в классе string, valueof() перегружен для всех простых типов и для типа object. Для простых типов valueof() возвращает строку, которая содержит удобочитаемый эквивалент значения, для которого он вызывается. Для объектов valueof() вызывает метод toString(). Мы рассмотрим valueof() подробнее позже. Здесь же познакомимся с методом toString(), потому что это средство, с помощью которого вы можете определять строчное представление для объектов тех классов, которые вы создаете в своей программе.
Каждый класс реализует toString(), поскольку данный метод определен в классе object. Однако реализации toString(), заданной по умолчанию, редко достаточно. Для наиболее важных классов, которые вы создаете сами, нужно переопределять toString() и обеспечивать тем самым свои собственные строчные представления объектов. К счастью, это делается достаточно просто. Метод toString() имеет следующую общую форму:
String toString()
Реализация toString() просто возвращает объект типа string, который содержит удобочитаемую строку, описывающую объект вашего класса.
Переопределяя toString() для создаваемых вами классов, вы получаете строчные представления объектов, полностью интегрированные в среду программирования Java. Например, они могут использоваться в операторах print() и printin() и в выражениях конкатенации. Следующая программа демонстрирует это, переопределяя toString() для Вох-классов:
// Переопределение toString() для Вох-классов.
class Box {
double width;
double height;
double depth;
Box(double w, double h, double d) {
width = w;
height = h;
depth = d; }
public String toString () {
return "Размеры Box-объекта: " + width + " x " + depth + " x " + height + ".";
}
}
class toStringDemo {
public static void main(String args [] ) {
Box b = new Box(10, 12, 14);
String s = "Box b: " + b; // конкатенация Box-объекта
System.out.println(b); // преобразование Box-объекта в строку
System.out.println(s);
}
}
Вывод этой программы:
Размеры Box-объекта: 10 х 14 х 12.
Box b: Размеры Box-объекта: 10 х 14 х 12.
Обратите внимание, что метод toString() вызывается автоматически, когда Box-объект используется в выражении конкатенации или в обращении к println().
Извлечение символов
Класс String предоставляет несколько способов извлечения символов из объекта типа String. Хотя символы, которые составляют строку String-объекта, не могут быть индексированы, как в символьном массиве, многие из String-методов используют индекс (порядковый номер или позицию) символа в строке для выполнения своих операций. Подобно массивам, индекс строки начинается с нуля.
Метод charAt()
Для извлечения одиночного символа из string-объекта вы можете прямо сослаться на индивидуальный символ через метод charAt(). Он имеет следующую общую форму:
char charAt(int where)
где параметр where — индекс (номер) символа, который вы хотите получить. Значение where должно определять позицию искомого символа в строке и не может быть отрицательным. charAt() возвращает символ, находящийся в указанной позиции строки. Например, фрагмент:
char ch;
ch = "abc".charAt(1);
назначает символьное значение "b" переменной ch.
Метод getChars()
Если нужно извлечь больше одного символа, то можно использовать метод getChars(). Он имеет следующую общую форму:
void getChars(int sourceStart, int sourceEnd, char targets[], int targetStart)
Здесь sourceStart указывает индекс начала подстроки; sourceEnd указывает индекс, который на 1 больше индекса конца желательной подстроки. Таким образом подстрока содержит символы в позициях от sourceStart до sourceEnd - 1. Массив, который будет принимать символы, указывается параметром target[]. Позиция в target, начиная с которой будет скопирована подстрока, передается через параметр targetstart. Позаботьтесь, чтобы размер массива target был достаточно большим, чтобы вместить все символы указанной подстроки. Следующая программа демонстрирует getChars():
class GetCharsDemo {
public static void main(String args[]) {
String s = "This is a demo of the getChars method.";
int start = 10;
int end = 14;
char buf[] = new char[end - start];
s.getChars(start, end, buf, 0);
System.out.println(buf);
}
}
Вывод этой программы:
demo
