java – 什么是集合的视图?

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

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...