在使用
Guava系列并阅读其文档时,我一直在阅读术语视图.
我已经寻找一个解释在这个背景下是什么意见,以及它是否在番石榴以外使用的术语.这是经常使用here.这个来自Guava的type有它的名字.
我的猜测是,集合的视图是具有相同数据但结构不同的另一集合;例如,当我从java.util.HashSet中添加条目到java.util.LinkedHashSet时,后者将是前者的视图.那是对的吗?
有人可以把我连接到接受的视图定义的链接,如果有一个?
谢谢.
解决方法
另一个对象的视图根本不包含自己的数据.所有的操作都是按照另一个对象的操作来实现的.
例如,Map的keySet()视图可能具有如下所示的实现:
- 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允许您使用List API访问正常数组; Map.keySet()允许您访问地图的键,就好像它是一个完全普通的Set – 所有这些,而不复制数据或创建另一个数据结构.
一般来说,使用视图而不是制作副本的优点是效率.例如,如果您有一个数组,并且需要获取一个获取列表的方法,那么您不会创建一个新的ArrayList和数据的整个副本–Arrays.asList视图只需要一个额外的内存,并通过访问原始数组来实现所有的List方法.