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