Изменить стиль страницы

Сцепление (или объединение) двух символьных строк обеспечивает оператор +. Например, в приведенной ниже последовательности операторов присваивания переменная str4 инициализируется символьной строкой "OneTwoThree".String strl = "One";String str2 = "Two";String str3 = "Three";String str4 = strl + str2 + str3;Массивы символьных строк

Подобно другим типам данных, символьные строки можно объединять в массивы.

Ниже приведен характерный тому пример.// Использование массивов символьных строк,class StringArrays { public static void main(String args[]) { // Массив символьных строк. String strs[] = { "This", "is", "a", "test." }; System.out.println("Original array: "); for(String s : strs) System.out.print (s + " "); System.out.println("\n"); // изменить символьную строку strs[l] = "was"; strs[3] = "test, too!"; System.out.println("Modified array: "); for(String s : strs) System.out.print(s + " "); }}

Выполнение этого фрагмента кода дает следующий результат:Original array:This is a test.Modified array:This was a test, too!Постоянство строк

Как ни странно, содержимое объекта типа string не подлежит изменению. Это означает, что однажды созданную последовательность символов изменить нельзя. Но данное ограничение способствует более эффективной реализации символьных строк. Поэтому этот, на первый взгляд, очевидный недостаток на самом деле превращается в преимущество. Так, если требуется строка в качестве разновидности уже имеющейся строки, для этой цели следует создать новую строку, содержащую все необходимые изменения. А поскольку неиспользуемые строковые объекты автоматически собираются в “мусор”, то о дальнейшей судьбе ненужных строк можно даже не беспокоиться. Следует, однако, иметь в виду, что переменные ссылки на строки (т.е. объекты типа String) подлежат изменению, а следовательно, могут ссылаться на другой объект. Но содержимое самого объекта типа String не меняется после его создания.

Для того чтобы стало понятнее, почему постоянство строк не является помехой, воспользуемся еще одним методом обращения со строками из класса String. Это метод substring (), возвращающий новую строку, содержащую часть вызывающей строки. В итоге создается новый строковый объект, содержащий выбранную подстроку, тогда как исходная строка не меняется, а следовательно, соблюдается принцип постоянства строк. Ниже приведена рассматриваемая здесь общая форма объявления метода substring().string substring(int начальный_индекс, int конечный_индекс)

где начальныйиндекс обозначает начало извлекаемой подстроки, а конечныйиндекс — ее окончание. Ниже приведен пример программы, демонстрирующий применение метода substringO и принцип постоянства строк.// Применение метода substringO.class SubStr { public static void main(String args[]) { String orgstr = "Java makes the Web move."; // сформировать подстроку // Здесь создается новая строка, содержащая нужную подстроку. String substr = orgstr.substring(5, 18); System.out.println("orgstr: " + orgstr); System.out.println("substr: " + substr); }}

Результат выполнения данной программы выглядит следующим образом:orgstr: Java makes the Web move,substr: makes the Web

Как видите, исходная строка orgstr остается без изменения, а новая строка substr содержит сформированную подстроку.Применение строк для управления оператором switch

Как пояснялось в главе 3, до появления версии JDK 7 для управления оператором switch приходилось пользоваться константами типа int или char. Это препятствовало применению оператора switch в тех случаях, когда одно из выполняемых действий выбирается из содержимого символьной строки. В качестве выхода из этого положения зачастую приходилось обращаться к многоступенчатой конструкции if-else-if. И хотя эта конструкция семантически правильна, для организации подобного выбора более естественным было бы применение оператора switch. К счастью, этот недостаток был исправлен. После выпуска комплекта JDK 7 появилась возможность пользоваться объектами типа String для управления оператором switch. И во многих случаях это способствует написанию более удобочитаемого и рационально организованного кода.

Ниже приведен краткий пример программы, демонстрирующий управление оператором switch с помощью объектов типа String.// Использование символьной строки для управления оператором switch,class StringSwitch { public static void main(String args[]) { String command = "cancel"; switch(command) { case "connect": System.out.println("Connecting"); break; case "cancel": System.out.println("Canceling"); break; case "disconnect": System.out.println("Disconnecting"); break; default: System.out.println("Command Error!"); break; } }}

Как и следовало ожидать, выполнение этой программы приводит к следующему результату:Canceling

Символьная строка, содержащаяся в переменной command, а в данном примере это строка "cancel" (отмена), проверяется на совпадение с символьными константами в ветвях case оператора switch. Если совпадение обнаружено, как это имеет место во второй ветви case, выполняется кодовая последовательность, связанная с данной последовательностью действий.

Использование символьных строк в операторе switch может оказаться очень удобным и позволяет сделать код более удобочитаемым. В частности, применение оператора switch, управляемого строками, является более совершенным решением по сравнению с равнозначной последовательностью операторов if/else. Но переход по символьным строкам обходится дороже с точки зрения потребляемых вычислительных ресурсов, чем переход по целочисленным значениям. Поэтому организовывать переход по символьным строкам рекомендуется лишь в тех случаях, когда управление данными уже происходит в строковой форме. Иными словами, пользоваться символьными строками в операторе switch без особой надобности не следует.Употребление аргументов командной строки

А теперь, когда представлен класс String, можно пояснить назначение параметра args метода main () в исходном коде большинства всех рассмотренных ранее примеров программ. Многие программы получают параметры, задаваемые в командной строке. Это так называемы аргументы командной строки. Они представляют собой данные, указываемые непосредственно после имени запускаемой на выполнение программы. Для того чтобы получить доступ к аргументам командной строки из программы на Java, достаточно обратиться к массиву объектов типа String, который передается методу main (). Рассмотрим в качестве примера программу, отображающую параметры командной строки. Ее исходный код приведен ниже.// Отображение всех данных, указываемых в командной строке,class CLDemo { public static void main(String args[]) { System.out.println("There are " + args.length + " command-line arguments."); System.out.println("They are: "); for(int i=0; i<args.length; i++) System.out.println("arg[" + i + "] : " + args[i]); }}

Допустим, программа CLDemo была запущена на выполнение из командной строки следующим образом:java CLDemo one two three

Тогда ее выполнение приведет к следующему результату:There are 3 command-line arguments.They are:arg[0]: onearg[1]: twoarg[2]: three

Обратите внимание на то, что первый аргумент содержится в строке, представляющей собой элемент массива с индексом 0. Для доступа ко второму аргументу следует воспользоваться индексом 1 и т.д.

Для того чтобы стало понятнее, как пользоваться аргументами командной строки, рассмотрим приведенный ниже пример программы. Эта программа принимает из командной строки один аргумент, определяющий имя абонента, а затем производит поиск имени в двумерном массиве символьных строк. Если имя найдено, программа отображает телефонный номер обнаруженного абонента.// Простейший автоматизированный телефонный справочник. /class Phone { public static void main(String args[]) { String numbers[][] = { { "Tom", "555-3322" }, { "Mary", "555-8976" }, { "Jon", "555-1037" }, { "Rachel", "555-1400" } }; int i; // Для того чтобы воспользоваться программой, // ей нужно передать один аргумент командной строки. if(args.length != 1) System.out.println("Usage: java Phone <name>"); else { for(i=0; i<numbers.length; i++) { if(numbers[i][0].equals(args[0])) { System.out.println(numbers[i][0] + ": " + numbers[i][1]); break; } } if(i == numbers.length) System.out.println("Name not found."); } }}