Изучаем Java

Вы здесь: Главная >> Java-учебник >> Скобки и иерархия операторов

Обучающие курсы:

Курс обучения профессии "Программист Java"
Nota Bene!!! Обучаем на веб-разработчика!!! Спешите!!!

Скобки и иерархия операторов в языке Java



Как и во всех языках программирования, для определения порядка выполнения операторов лучше всего использовать скобки. Однако в языке 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.


Партнеры сайта