2013-09-19 5 views
10

Я читал термин просмотр несколько раз при использовании Guava сборников и чтение его документации.Что представляет собой коллекция?

Я искал объяснение того, что такое взгляд в этом контексте и является ли это термин, используемый за пределами Гуавы. Это довольно часто используется here. Это type от Guava имеет от своего имени.

Я предполагаю, что представление коллекции - это еще одна коллекция с теми же данными, но структурированная по-разному; например, когда я добавляю записи от java.util.HashSet к java.util.LinkedHashSet, последний будет иметь вид первого. Это верно?

Может ли кто-нибудь связать меня со ссылкой на принятое определение вид, если он есть?

Спасибо.

+1

Нет, я не думаю, что это правильно. Если вы говорите 'LinkedHashSet lhs = new LinkedHashSet (hs)' где 'hs' является' HashSet', 'lhs' будет иметь те же ссылки на элементы, что и' hs', *, но * это будет его собственная структура данных. Если вы удалите элемент из 'lhs', он будет ** не ** влиять на' hs' и наоборот. Так что это разные коллекции. Но если вы используете 'Collections.unmodifiableSet', тогда вы получите представление, относящееся к той же коллекции. – ajb

ответ

17

A вид другого объекта вообще не содержит собственных данных. Все его операции выполняются с точки зрения операций над другим объектом.

Например, keySet() вид Map может иметь реализацию, которая выглядит примерно так:

class KeySet implements Set<K> { 
    private final Map<K, V> map; 

    public boolean contains(Object o) { 
    return map.containsKey(o); 
    } 

    ... 
} 

В частности, всякий раз, когда вы изменяете объект подкладочный вашего зрения - здесь, то MapспиныkeySet() - вид отражает те же изменения. Например, если вы вызываете map.remove(key), то keySet.contains(key) вернет false, не делая никаких действий.

В качестве альтернативы, Arrays.asList(array) предоставляет видэтого массива.

String[] strings = {"a", "b", "c"}; 
List<String> list = Arrays.asList(strings); 
System.out.println(list.get(0)); // "a" 
strings[0] = "d"; 
System.out.println(list.get(0)); // "d" 
list.set(0, "e"); 
System.out.println(strings[0]); // "e" 

мнение это просто еще один способ взглянуть на данные в исходном объекте бэк - Arrays.asList позволяет использовать List API для доступа обычный массив; Map.keySet() позволяет получить доступ к клавишам Map, как если бы он был совершенно обычным Set - все без копирование данных или создание другой структуры данных.

Как правило, преимуществом использования представления вместо создания копии является эффективность. Например, если у вас есть массив, и вам нужно получить его с помощью метода, который принимает List, вы не создаете новый ArrayList и всю копию данных - вид Arrays.asList занимает только постоянную дополнительную память, и просто реализует все методы List, обращаясь к исходному массиву.

+0

Понимаю, спасибо. Существует ли «официальный» источник этого термина (например, с шаблонами проектирования и бандой четырех)? –

+0

@mareser: Я бы держал пари, что это происходит из [баз данных] (http://en.wikipedia.org/wiki/View_ (SQL)). – maaartinus

5

A вид в этом контексте представляет собой коллекцию, подкрепленную другой коллекцией (или массивом), которая сама использует память с постоянным объемом (то есть память не зависит от размера коллекции резервных копий). Операции, применяемые к представлению, делегируются в коллекцию (или массив) поддержки. Конечно, это определение можно расширить только за коллекциями, но ваш вопрос, по-видимому, относится именно к ним.

Например, Arrays.asList() возвращает «вид списка указанного массива». Он не копирует элементы в новый список, а создает список, который содержит ссылку на массив и работает на основе этого.

Другим примером является Collections.unmodifiableList(), который возвращает «немодифицируемое представление указанного списка». Другими словами, он возвращает список, содержащий ссылку на указанный список, которому делегируются все операции. В этом случае возвращенный список не позволяет вам каким-либо образом его изменять, поэтому вместо делегирования методов, ответственных за изменение списка, он генерирует исключение, когда вместо этого вызывается такие методы.

Смежные вопросы