在使用
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方法.