请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

HashMap之KeySet分析

[复制链接]
查看: 89|回复: 0

2万

主题

2万

帖子

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
76529
发表于 2020-9-16 01:03 | 显示全部楼层 |阅读模式
本篇涵盖
1、HashMap并不是用keySet来存储key的原因及证明
2、keySet方法返回后的remove、add操作原理
一、方法作用

我的关键词 HashMap之KeySet分析  新闻咨询 1462891-20200420212141433-1983678496

概括一下
1、keySet方法返回map中包含的键的集合视图
2、集合由map支持,改变集合会影响map,反之亦然
3、集合支持删除操作,不支持添加
二、原理分析

1、HashMap源码分析

我的关键词 HashMap之KeySet分析  新闻咨询 1462891-20200420212626385-523008325

keySet方法查看keySet是否为null
不为null则直接返回,若为null则创建后返回
接下来看构造函数中做了什么
我的关键词 HashMap之KeySet分析  新闻咨询 ContractedBlock
我的关键词 HashMap之KeySet分析  新闻咨询 ExpandedBlockStart
  1. /**     * {@inheritDoc}     *     * @implSpec     * This implementation returns a set that subclasses {@link AbstractSet}.     * The subclass's iterator method returns a "wrapper object" over this     * map's entrySet() iterator.  The size method     * delegates to this map's size method and the     * contains method delegates to this map's     * containsKey method.     *     *
  2. The set is created the first time this method is called,     * and returned in response to all subsequent calls.  No synchronization     * is performed, so there is a slight chance that multiple calls to this     * method will not all return the same set.     */    public Set keySet() {        Set ks = keySet;        if (ks == null) {            ks = new AbstractSet() {                public Iterator iterator() {                    return new Iterator() {                        private Iterator i = entrySet().iterator();                        public boolean hasNext() {                            return i.hasNext();                        }                        public K next() {                            return i.next().getKey();                        }                        public void remove() {                            i.remove();                        }                    };                }                public int size() {                    return AbstractMap.this.size();                }                public boolean isEmpty() {                    return AbstractMap.this.isEmpty();                }                public void clear() {                    AbstractMap.this.clear();                }                public boolean contains(Object k) {                    return AbstractMap.this.containsKey(k);                }            };            keySet = ks;        }        return ks;    }
复制代码
keySet构造函数
代码注释中提到,创建的对象是AbstractSet的子类
并且说明了keySet集合是在第一次调用此方法时创建的
再来看KeySet这个类
我的关键词 HashMap之KeySet分析  新闻咨询 ContractedBlock
我的关键词 HashMap之KeySet分析  新闻咨询 ExpandedBlockStart
[code]final class KeySet extends AbstractSet {        public final int size()                 { return size; }        public final void clear()               { HashMap.this.clear(); }        public final Iterator iterator()     { return new KeyIterator(); }        public final boolean contains(Object o) { return containsKey(o); }        public final boolean remove(Object key) {            return removeNode(hash(key), key, null, false, true) != null;        }        public final Spliterator spliterator() {            return new KeySpliterator(HashMap.this, 0, -1, 0, 0);        }        public final void forEach(Consumer

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表