Теперь, когда разновидность for-each цикла for представлена в достаточной степени, она будет еще не раз использоваться там, где это уместно, в примерах программ, представленных в остальной части книги. Символьные строки
В повседневной работе каждый программист обязательно встречается с объектами типа String. Объект типа String определяет символьную строку и поддерживает операции над ней. Во многих языках программирования символьная строка — это лишь массив символов, но в Java это совсем не так, где символьная строка, по существу, является объектом.
Возможно, вы и не заметили, но класс String фактически уже использовался в примерах программ, начиная с главы 1. При создании строкового литерала на самом деле строился объект типа String. Рассмотрим приведенный ниже оператор. System.out.println("In Java, strings are objects.");
Наличие в нем символьной строки "In Java, strings are objects." (B Java строки являются объектами) автоматически приводит к созданию объекта типа String. Таким образом, класс String незримо присутствовал в предыдущих примерах программ. В последующих разделах будет показано, как этим классом пользоваться явным образом. Однако в классе String предусмотрен обширный ряд методов, поэтому здесь будут рассмотрены лишь некоторые из них. Большую часть функциональных возможностей класса String вам предстоит изучить самостоятельно. Построение строк
Объекты типа String создаются таким же образом, как и объекты других типов. Для этой цели используется конструктор, как показано в следующем примере: String str = new String("Hello");
В данном примере создается объект str типа String, содержащий символьную строку "Hello" (Привет). Объект типа String можно создать и на основе другого объекта такого же типа. Например: String str = new String("Hello"); String str2 = new String(str);
После выполнения этих строк кода объект str2 будет также содержать символьную строку "Hello".
Ниже представлен еще один способ создания объекта типа String. String str = "Java strings are powerful.";
В данном случае объект str инициализируется последовательностью символов "Java strings are powerful." (Строки в Java эффективны).
Создав объект типа String, можете использовать его везде, где допускается строковый литерал (последовательность символов, заключенная в кавычки). Например, объект типа String можно передать в качестве параметра методу println () при его вызове, как показано в приведенном ниже примере программы. // Представление класса String, class StringDemo { public static void main(String args[]) { // объявить символьные строки разными способами String strl = new String("Java strings are objects."); String str2 = "They are constructed various ways."; String str3 = new String(str2); System.out.println(strl) ; System.out.println(str2) ; System.out.println(str3) ; } }
Выполнение этой программы дает следующий результат: Java strings are objects. They are constructed various ways. They are constructed various ways. Операции над символьными строками
Класс String содержит ряд методов, предназначенных для выполнения действий над символьными строками. Ниже описаны некоторые из них. boolean equals (str) Возвращает логическое значение true, если текущая строкасодержит ту же последовательность символов, что и параметр str int length () Возвращает длину символьной строки char charAt (index) Возвращает символ, находящийся в строке на позиции, указываемой параметром index int compareTo (String str) Возвращает отрицательное значение, если текущая строкаменьше строки str, нуль, если эти строки равны, и положительное значение, если текущая строка больше строки str int indexOf (String str) Производит в текущей строке поиск подстроки, определяемой параметром str. Возвращает индекс первого вхождения подстроки str или -1, если поиск завершается неудачно int lastlndexOf (String str) Производит в текущей строке поиск подстроки, определяемойпараметром str. Возвращает индекс последнего вхожденияподстроки str или -1, если поиск завершается неудачно
В приведенном ниже примере программы демонстрируется применение перечисленных выше методов, оперирующих символьными строками. // Некоторые операции над символьными строками, class StrOps { public static void main(String args[]) { String strl = "When it comes to Web programming, Java is #1."; String str2 = new String(strl); String str3 = "Java strings are powerful."; int result, idx; char ch; System.out.println("Length of strclass="underline" " + strl.length()); // отобразить строку strl посимвольно, for(int i=0; i < strl.length(); i++) System.out.print(strl.charAt(i)); System.out.println(); if (strl.equals(str2) ) System.out.println("strl equals str2"); else System.out.println("strl does not equal str2"); if(strl.equals(str3)) System.out.println("strl equals str3"); else System.out.println("strl does not equal str3"); result = strl.compareTo(str3); if (result == 0) System.out.println("strl and str3 are equal"); else if(result < 0) System.out.println("strl is less than str3"); else System.out.println("strl is greater than str3"); // присвоить переменной str2 новую строку str2 = "One Two Three One"; idx = str2.indexOf("One"); System.out.println("Index of first occurrence of One: " + idx); idx = str2.lastlndexOf("One"); System.out.println("Index of last occurrence of One: " + idx); } }
Выполнение этой программы дает следующий результат: Length of strclass="underline" 45 When it comes to Web programming, Java is #1. strl equals str2 strl does not equal str3 strl is greater than str3 Index of first occurrence of One: 0 Index of last occurrence of One: 14
Сцепление (или объединение) двух символьных строк обеспечивает оператор +. Например, в приведенной ниже последовательности операторов присваивания переменная 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); } }