Для управления элементами эти классы используют методы интерфейсов Collection и List:
– add(E o) – добавление элемента в конец;
– add(int index, E element) – вставка элемента в указанную позицию;
– remove(int index) – удаление элемента в указанной позиции;
– remove(Object o) – удаление первого вхождения объекта в списке;
– clear() – удаление всех элементов;
– isEmpty() – определяет, содержит ли список элементы;
– size() – число элементов;
– set(int index, E element) – заменить элемент в указанной позиции новым;
– get(int index) – получить элемент по указанному индексу;
– contains(Object o) – определение, содержится ли указанный объект в списке элементов;
– lastIndexOf(Object o) – поиск последнего вхождения элемента, возвращается индекс элемента или -1;
– indexOf(Object o) – поиск первого вхождения элемента, возвращается индекс элемента или -1;
– toArray() – возвращает копию в виде статического массива;
– toArray(T[] a) – сохраняет элементы в указанный массив.
Пример работы с динамическим массивом целых чисел:
package tsn01.arraylist;
import java.util.ArrayList;
public class TSN01_ArrayList {
public static void main(String[] args) {
// Работа с динамическим массивом чисел
ArrayList<Integer> i = new ArrayList<>(); // Создание динамического массива целых чисел
i.add(3); // Добавление значения
i.add(new Integer(3)); // Добавление значения
if (i.get(0)==i.get(1)) { System.out.println("Эта строчка не напечатается…"); }
if (i.get(0).equals(i.get(1))) { System.out.println("3=3"); }
i.add(12+5); // Добавление значения
System.out.println("Размер массива: " + i.size());
System.out.println("Элементы массива: " + i.get(0).intValue() + ", " + i.get(1)+ ", " + i.get(2));
}
}
Результат работы программы:
3=3
Размер массива: 3
Элементы массива: 3, 3, 17
Пример работы с динамическим массивом строк:
package tsn01.arraylist;
import java.util.ArrayList;
public class TSN01_ArrayList {
public static void main(String[] args) {
// Работа с динамическим массивом строк
ArrayList<String> pozdr = new ArrayList<>(); // Массив пожеланий
ArrayList<String> fam = new ArrayList<>(); // Массив фамилий
// Добавление поздравления в массив
pozdr.add("Удачи"); pozdr.add("Здоровья"); pozdr.add("Денег");
// добавление фамилии в массив
fam.add("Петров"); fam.add("Сидоров"); fam.add("Иванов");
// Проверка количества поздравлений
if (fam.size() > pozdr.size()) { return; }
for (int i = 0; i < fam.size(); i++) {
// Генерируем случайное число в диапазоне от 0 до длины массива поздравлений
int p = (int) Math.floor(Math.random() * pozdr.size());
// Генерация поздравления
System.out.println("Уважаемый " + fam.get(i)
+ "! Поздравляем Вас с этим прекрасным праздником, и желаем Вам "
+ pozdr.get(p).toString().toLowerCase() + "!");
pozdr.remove(p); // Удаляем элемент с индексом р из массива поздравлений
} }
}
1.8 Работа со строками
В Java имеется три типа строк: String, StringBuilder и StringBuffer. Статические строки «String» – обычные строки в Java, в которых нельзя изменить символы и их количество после создания строки.
Динамические строки «StringBuilder» – изменяемые строки для использования в однопоточных программах. В однопоточном использовании StringBuilder практически всегда в 1.2-1.5 раза быстрее, чем StringBuffer.
Динамические строки StringBuffer – изменяемые строки для использования в многопоточных программах. Самый медленный тип, но потокобезопасный.
Переменные типа динамических строк могут менять свои значения и длину во время выполнения программы.
Статические строки. Обычные строки в Java описываются классом String и являются статическими, т.е. в существующей строке нельзя изменить символы и их количество.
Кроме стандартного создания оператором new, строки могут быть созданы напрямую из строковой литералы. При этом в целях оптимизации, объекты созданные таким образом дополнительно сохраняются в отдельной области – строковый пул.
String s1 = "d" // строка будет сохранена в пуле
// строка не будет сохранена в пуле и будет уничтожена сборщиком мусора
String s2 = new String("a");
Один из плюсов разделения строк на статические и динамические – это повышение безопасности там, где строки используются в качестве аргументов (например, открытие баз данных, интернет соединений, механизм загрузки классов).
Операция сцепления. Для строк доступна операция +, позволяющая соединить несколько строк в одну. Если один из операндов не строка, то он автоматически преобразуется в строку. Для объектов в этих целях используется метод toString.
При каждой операции внутренне используется объект динамической строки StringBuilder или StringBuffer. Поэтому для собирания строки из нескольких все равно оптимальней использовать сразу один StringBuilder/StringBuffer.
Выделение подстроки. Есть замечание относительно метода substring – возвращаемая строка использует тот же байтовый массив, что и исходная. Например, вы загрузили строку А из файла в 1мб. Что-то там нашли и выделили в отдельную строку Б длиной в 3 символа. Строка Б в реальности тоже занимает те же 1мб.
String s ="very .... long string from file";
String sub1 = s.substring(2,4); // совместно использует ту же память что и s
String sub2 = new String(s.substring(2,4)); // этот объект использует отдельный массив на 4 символа
Основные методы. Рассмотрим основные методы String:
– equals(Object anObject) – проверяет, идентична ли строка указанному объекту;
– compareTo(String anotherString) – лексиграфическое сравнение строк;
– compareToIgnoreCase(String str) – лексиграфическое сравнение строк без учета регистра символов;
– concat(String str) – возвращает соединение двух строк;
– contains(CharSequence s) – проверяет, входит ли указанная последовательность символов в строку;
– isEmpty() – возвращает true, если длина строки равна 0;
– indexOf(String str) – поиск первого вхождения указанной подстроки;
– replace(CharSequence target, CharSequence replacement) – замена одной подстроки другой;
– substring(int beginIndex, int endIndex) – возвратить подстроку как строку;
– toLowerCase() – преобразовать строку в нижний регистр;
– toUpperCase() – преобразовать строку в верхний регистр;
– trim() – отсечь на концах строки пустые символы;
– length() – определение длины строки;
– valueOf(a) – статические методы преобразования различных типов в строку;
– charAt(int index) – возвращает символ по указанному индексу;
– regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) – тест на идентичность участков строк, можно указать учет регистра символов;
– regionMatches(int toffset, String other, int ooffset, int len) – тест на идентичность участков строк;
– endsWith(String suffix) – проверяет, завершается ли строка указанным суффиксом;
– startsWith(String prefix) – проверяет, начинается ли строка с указанного префикса;
– startsWith(String prefix, int toffset) – проверяет, начинается ли строка в указанной позиции с указанного префикса;