另一个对象的 视图 根本不包含其自己的数据。它的所有操作都是根据对另一个对象的操作来实现的。
例如,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)提供
List该阵列的视图。
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使您可以使用
ListAPI访问普通数组;
Map.keySet()使您可以
Map像完全完美一样访问a的键
Set-所有这些都
无需 复制数据或创建另一个数据结构。
通常,使用视图而不是进行复制的优点是效率。例如,如果您有一个数组,并且需要将其传递到采用的方法,则
List您无需创建新
ArrayList的数据副本和完整的数据副本-
Arrays.asList视图仅占用恒定的额外内存,并且仅实现所有
List通过访问原始数组的方法。



