有一些统一属性,比如这个属性是绑定在类里面的,也不需要重新创建对象。比方说Map.keySet()方法,好像是每次调用都返回一个新的对象,但是实际上只有一个对象返回。
因为该对象是紧紧跟随map对象的,所以不需要每次调用方法都要创建新的实例。
但是这里就存在一个问题,当客户拿到Set对象的时候,对其进行操作,这样就是该对象流离在Map对象之外,会对其关联的对象进行污染。
比如,客户拿到keyset之后进行了删除操作,HashMap中的链表和value属性并没有相应的改变。
如果我们不把keyset直接给客户,而是给一个副本就不存在这个问题,但是这样就存在内存开销问题,如果客户有几百万个key,开销就比较大。
鉴于几乎没人会拿到keyset进行写操作,所以Java的做法是返回一个内部类KeySet
当客户使用keyset做删除操作的时候,联动会调用HashMap的removeNode操作,会进行相应的关联操作。