Как и во всех языках программирования, для определения порядка
выполнения операторов лучше всего использовать скобки. Однако в языке
Java существует иерархия операций, показанная в табл. 3.4.
Таблица 3.4. Приоритеты операторов.
Если скобки не используются, операторы выполняются в указанном
иерархическом порядке. Операторы, находящиеся на одном уровне
иерархии, выполняются слева направо, за исключением операторов, имеющих
правую ассоциативность, как показано в таблице.
В отличие от языков С и C++, язык Java не имеет оператора "запятая".
Однако в операторе for в качестве первого и третьего оператора можно
использовать список выражений, разделенных запятой.
Строки
Строки— это последовательности символов, например "Hello". В языке
Java нет встроенного типа для строк. Вместо этого стандартная
библиотека языка Java содержит встроенный класс String. Каждая строка,
заключенная в кавычки, представляет собой экземпляр класса String.
String e — ""; // Пустая строка. String greeting = "Hello";
Конкатенация
Язык Java, как и большинство языков программирования, дает
возможность использовать знак + для объединения (конкатенации) двух
строк.
String expletive = "Вставка"; String PG13 = "удаленная"; String message = expletive + PG13;
Код, приведенный выше, присваивает переменной message строку "Вставкаудаленная". (Обратите внимание на отсутствие пробела между словами: знак + объединяет две строки точно в указанном порядке.)
При конкатенации строки со значением, которое строкой не является, это значение преобразовывается в строку. Например, код int age = 13; String rating = "PG" + age; присваивает переменной rating строку "PG13".
Это свойство широко используется в операторах вывода; например, оператор System, out .println ("Ответ равен " + answer); выводит на печать все, что требуется (причем вставляет пробел после слова "равен").
Подстроки
С помощью метода substring класса String можно выделить подстроку из заданной строки. Например, код String greeting = "Hello"; String s = greeting.substring(0, 4); образует строку, состоящую из символов "Hell".
В языке Java символы в строке подсчитываются довольно своеобразно:
первый символ строки занимает нулевую позицию, как и в языках С и C++.
(В языке С для этого существовала техническая причина. Однако сейчас ее
уже нет, осталось лишь неудобство.)
Например, символ 'Н' в строке 'Hello' занимает нулевую позицию, а символ 'о'— четвертую. Второй параметр метода substring задает первую позицию, которую вы не хотите копировать.
Допустим, что мы хотим скопировать символы из позиций 0, 1, 2 и 3 (от
позиции 0 до позиции 3 включительно), т.е. метод substring будет
копировать символы из позиций от 0 до 4 исключительно.
Такой способ имеет определенное преимущество: легко вычислить длину подстроки. Строка s . substring (a, b) всегда состоит из b-а символов. Например, подстрока «Hell» имеет длину 4-0 = 4.
Редактирование строки
Для определения длины строки нужно использовать метод length, например: String greeting = "Hello"; int n = greeting. length () ; // Длина строки равна 5.
Поскольку тип char означает символ в формате Unicode, класс String
означает последовательность символов в кодировке Unicode. Из строки
можно выделить отдельный символ.
Вызов метода s . charAt (n) возвращает символ в кодировке Unicode,
находящийся в позиции n, где число n лежит в диапазоне от 0 до s ,
length () - 1например: char last = greeting. charAt (4) ; // Четвертый символ — 'о'.
Однако класс String не дает методов, позволяющих изменить символ в
заданной строке. Так, вы не сможете просто изменить последнюю позицию в
строке greeting, поместив в нее восклицательный знак, чтобы
преобразовать строку greeting в строку "Hell ! ",
Если вы программировали на языке С, это может вызвать у вас чувство беспомощности.
Как же модифицировать строку? В языке Java это достаточно просто
сделать: выделите подстроку, которую вы хотите оставить без изменения, и
конкатенируйте ее с символами, которые вы хотите поставить в нужные
позиции: greeting = greeting.substring(0,4) + "!";
С помощью такого оператора вы можете присвоить переменной greeting строку "Hell!".
Поскольку, программируя на языке Java, вы не можете изменять
отдельные символы в строке, документация ссылается на объекты класса
String как на неизменные. Число 3 всегда равно 3, а строка "Hello"
всегда содержит символы 'Н', 'е', 'l', '1' и 'o'. Изменить эти
значения невозможно. Однако, как мы только что убедились, можно
изменить содержимое строковой переменной greeting и заставить ее
ссылаться на другую строку так же, как числовой переменной, в которой
хранится число 3, можно присвоить 4.
Не происходит ли при этом большой потери эффективности? Кажется,
было бы намного проще изменять символы, чем создавать новую строку
заново. Возможно, это и так. Действительно, неэффективно создавать
новую строку, образованную с помощью конкатенации строк "Hell" и "!".
Однако неизменяемые строки имеют одно большое преимущество: компилятор может делать строки совместно используемыми.
Чтобы понять этот принцип, представьте, что в некотором совместно
используемом пуле находятся разные строки. Строковые переменные
указывают на некоторые ячейки в этом пуле. При копировании строковой
переменной и оригинал, и копия состоят из одинаковых символов,
ссылаясь на одну и ту же область памяти. Кроме того, разработчики
языка Java решили, что эффективность совместного использования памяти
перевешивает неэффективность редактирования строк путем выделения
подстрок и конкатенации.
Посмотрите на свою программу; мы подозреваем, что большую часть
времени вы проводите, не изменяя строки, а сравнивая их. Разумеется,
бывают случаи, когда непосредственные манипуляции со строками более
эффективны. (Одна из таких ситуаций возникает, когда нужно образовать
строку из отдельных символов, поступающих из файла или клавиатуры.)
Для этих ситуаций язык Java предусматривает отдельный класс
StringBuffer. Если эффективность обработки строк для вас неважна (как
это часто случается во многих приложениях на языке Java), можете
проигнорировать класс StringBuffer и просто использовать класс String.
|