作者:淇蒴_192 | 来源:互联网 | 2022-12-10 10:09
1> dimo414..:
" 视图 "是一种对象,其数据由不同的对象支持,但以不同的方式提供.在这种情况下,它提供了一个"视图" Map
的密钥作为Set
.这对用户和性能都有很多好处.
值得注意的是,由于它与支持类共享其数据,因此内存开销非常小 - 它不需要将所有密钥复制到一个全新的密钥中Set
.此外,用户无需担心视图与支持结构不同步 - 添加和删除将立即通过视图显示.
因为它KeySet
是一个内部类,所以它可以访问其包含类(HashMap
)的实例的字段.请注意HashMap.this
代码段中的表示法.
size()
的return size;
是一个参考HashMap
的size
字段
clear()
的HashMap.this.clear();
通话HashMap
的clear()
方法(它需要使用HashMap.this
引用地图的clear()
方法,而不是自己的)
contains()
代表HashMap
的containsKey()
方法 - 这不需要HashMap.this
因为KeySet
没有碰撞containsKey()
方法
remove()
同样代表他们HashMap
的removeNode()
如果它被声明为final static class KeySet
它将是一个静态嵌套类,它不依赖于包含类的实例(它只是一种组织相关类的方式).在这种情况下KeySet
需要一个显式HashMap
字段,并且需要将有问题的地图传递给构造函数.内部类使这隐含(这是简洁的,但有时令人困惑).
什么是告诉这个KeySet对象只保存MapKeys?
要明确的是,没有这样的指示.一个KeySet
实例传递地访问所有的领域和底层映射的方法.但是你的example(System.out.println("Key set values are: " + keyset);
)是隐式调用keyset.toString()
,(有意)没有实现它来返回map的值.因为KeySet
extends AbstractSet
(反过来又扩展AbstractCollection
).toString()
依赖于它KeySet
的iterator()
实现,它实现了地图键的迭代器,而不是它的值.