Брюс Эккель - Философия Java3
- Название:Философия Java3
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Брюс Эккель - Философия Java3 краткое содержание
Философия Java3 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
//: hoiding/AsListInference.java // Arrays.asListO makes its best guess about type, import java.util.*;
class Snow {}
class Powder extends Snow {} class Light extends Powder {} class Heavy extends Powder {} class Crusty extends Snow {} class Slush extends Snow {}
public class AsListInference {
public static void main(String[] args) { List snowl = Arrays.asList(
new CrustyO. new SlushO. new PowderO);
// He компилируется-// List snow2 = Arrays.asList( // new LightO. new HeavyO); // Сообщение компилятора: //found java.util.List // required, java util List
II Collections.addAllО работает нормально:
List snow3 = new ArrayList():
Col 1 ecti ons. addAl 1 (snow3, new LightO. new HeavyO);
II Передача информации посредством уточнения // типа аргумента
List snow4 = Arrays asList( new LightO, new HeavyO),
}
} ///:-
При попытке создания snow2, Arrays.asList() создает List вместо List , тогда как Collections.addAll() работает нормально, потому что целевой тип определяется первым аргументом. Как видно из создания snow4, в вызов Arrays.asList() можно вставить «подсказку», которая сообщает компилятору фактический тип объекта List, производимого Arrays.asList().
С контейнерами Map дело обстоит сложнее, и стандартная библиотека Java не предоставляет средств их автоматической инициализации, кроме как по содержимому другого объекта Map.
Вывод содержимого контейнеров
Для получения печатного представления массива необходимо использовать метод Arrays.toString, но контейнеры отлично выводятся и без посторонней помощи. Следующий пример демонстрирует использование основных типов контейнеров:
II: ell:Printi ngContai ners.java II Вывод контейнеров по умолчанию import java.util.*;
import static net.mindview.util.Print.*;
public class PrintingContainers {
static Collection fill(Collection collection) { collection. addC'rat"): collection.addC'cat"); collection.adde'dog"): col lection.add("dog"); return collection;
}
static Map fill(Map map) {
map. put ("rat", "Fuzzy"); продолжение &
map.put("cat". "Rags"), тар.put("dog". "Bosco"); map.put("dog", "Spot"); return map;
}
public static void main(String[] args) {
pri nt(fi11(new ArrayLi st())); print(fill(new LinkedList())); pri nt(fi11(new HashSet())); pri nt(fi11(new TreeSet())); pri nt(fi11(new Li nkedHashSet())); pri nt(fi11(new HashMap())); print(fill(new TreeMap())); print(fi11(new LinkedHashMap()));
}
} /* Output: [rat, cat, dog, dog] [rat, cat. dog, dog] [dog, cat, rat] [cat, dog, rat] [rat. cat. dog]
{dog=Spot. cat=Rags, rat=Fuzzy} {cat=Rags, dog=Spot, rat=Fuzzy} {rat=Fuzzy, cat=Rags, dog=Spot} *///:-
Как уже было упомянуто, в библиотеке контейнеров Java существует две основные категории, различающиеся прежде всего тем, сколько в одной ячейке контейнера «помещается» элементов. Коллекции (Collection) содержат только один элемент в каждой ячейке. К этой категории относятся список (List), где в определенной последовательности хранится группа элементов, множество (Set), в которое можно добавлять только по одному элементу определенного типа, и очередь (Queue). В контейнерах Map (карта) хранятся два объекта: ключ и связанное с ним значение.
Из выходных данных программы видно, что вывод по умолчанию (обеспечиваемый методом toStringO каждого контейнера) дает вполне приличные результаты. Содержимое Collection выводится в квадратных скобках, с разделением элементов запятыми. Содержимое Map заключается в фигурные скобки, ключи и значения разделяются знаком равенства (ключи слева, значения справа).
Контейнеры ArrayList и LinkedList принадлежат к семейству List, и из выходных данных видно, что элементы в них хранятся в порядке вставки. Они различаются не только скоростью выполнения тех или иных операций, но и тем, что LinkedList содержит больше операций, чем ArrayList.
HashSet, TreeSet и LinkedHashSet относятся к семейству Set. Из выходных данных видно, что в множествах Set каждый элемент хранится только в одном экземпляре, а разные реализации Set используют разный порядок хранения элементов. В HashSet порядок элементов определяется по довольно сложному алгоритму — пока достаточно знать, что этот алгоритм обеспечивает минимальное время выборки элементов, но порядок следования элементов на первый взгляд выглядит хаотично. Если порядок хранения для вас важен, используйте контейнер TreeSet, в котором объекты хранятся отсортированными по возрастанию в порядке сравнения, или LinkedHashSet с хранением элементов в порядке добавления.
Карта (Map) позволяет искать объекты по ключу , как несложная база данных. Объект, ассоциированный с ключом, называется значением . (Карты также называют ассоциативными массивами.)
В нашем примере используются три основные разновидности Map: HashMap, TreeMap и LinkedHashMap. Как и HashSet, HashMap обеспечивает максимальную скорость выборки, а порядок хранения его элементов не очевиден. TreeMap хранит ключи отсортированными по возрастанию, a LinkedHashMap хранит ключи в порядке вставки, но обеспечивает скорость поиска HashMap.
List
Контейнеры List гарантируют определенный порядок следования элементов. Интерфейс List дополняет Collection несколькими методами, обеспечивающими вставку и удаление элементов в середине списка. Существует две основные разновидности List:
• Базовый контейнер ArrayList, оптимизированный для произвольного доступа к элементам, но с относительно медленнными операциями вставки (удаления) элементов в середине списка.
• Контейнер LinkedList, оптимизированный для последовательного доступа, с быстрыми операциями вставки (удаления) в середине списка ;Произвольный доступ к элементам LinkedList выполняется относительно медленно, но по широте возможностей он превосходит ArrayList.
В следующем примере используется библиотека typenfo.pets из главы «Информация о типе». Она содержит иерархию классов домашних животных Pet, а также ряд вспомогательных средств для случайного построения объектов Pet. Пока достаточно знать, что (1) библиотека содержит класс Pet и производные типы, и (2) статический метод Pets.arrayList() возвращает контейнер ArrayList, заполненный случайно выбранными объектами Pet.
//• hoi ding/ListFeatures.java import typeinfo.pets.*; import java.util.*;
import static net mindview util.Print.*:
public class ListFeatures {
public static void main(String[] args) { Random rand = new Random(47); List pets = Pets.arrayList(7); printC'l: " + pets); Hamster h = new HamsterO; pets.add(h); // Автоматическое изменение размера print("2: " + pets); print("3: " + pets.contains(h)); pets.remove(h); // Удаление объекта
Pet p = pets.get(2); продолжение &
print("4: " + р + " " + pets.indexOf(p));
Pet cymric = new CymricO;
print("5: " + pets.indexOf(cymric));
print("6: " + pets.remove(cymric));
// Точно заданный объект:
print("7: " + pets.remove(p));
print("8: " + pets);
pets.add(3. new MouseO); // Вставка no индексу
print("9: " + pets);
List sub = pets.subListd, 4);
printC'subList: " + sub);
print("10: " + pets.containsAll(sub));
Col lections.sort(sub); // Сортировка "на месте"
print("sorted subList: " + sub);
// Для containsAllО порядок неважен:
printC'll: " + pets.containsAll(sub));
Col 1ections.shuffle(sub. rand); // Случайная перестановка
print("shuffled subList: " + sub).
print("12: " + pets.containsAll(sub));
List copy = new ArrayList(pets);
sub = Arrays.asList(pets.getd). pets.get(4));
printC'sub: " + sub);
copy.retainAll(sub);
print("13: " + copy);
copy = new ArrayList(pets); // Получение новой копии copy remove(2); // Удаление по индексу print("14: " + copy);
copy.removeAll(sub); // Удаление заданных элементов print("15: " + copy);
copy.setd, new MouseO); // Замена элемента print("16: " + copy);
copy.addAll(2. sub); // Вставка в середину списка
pri nt("17: " + copy);
print("18: " + pets.isEmptyO);
pets.clearO; // Удаление всех элементов
print("19: " + pets);
print("20: " + pets isEmptyO);
pets.addAll(Pets.arrayList(4));
print("21: " + pets);
Object[] о = pets.toArrayO;
Читать дальшеИнтервал:
Закладка: