AbstractMap
来源:互联网 发布:打扮家 知乎 编辑:程序博客网 时间:2024/05/01 19:06
原文链接
- 查询操作
- 修改操作
- 批量操作
- 比较和哈希
AbstractMap对Map接口做了通用的实现,其他Map的实现类可以继承AbstractMap来减少重复编码。
查询操作
返回map的大小:
public int size() { return entrySet().size();}
判断是否为空:
public boolean isEmpty() { return size() == 0;}
判断是否包含指定的值:
//迭代entrySet来查找public boolean containsValue(Object value) { Iterator<Entry<K,V>> i = entrySet().iterator(); //查找value为null的值 if (value==null) { while (i.hasNext()) { Entry<K,V> e = i.next(); if (e.getValue()==null) return true; } } else { //value不为null的时候,使用equals方法判断 while (i.hasNext()) { Entry<K,V> e = i.next(); if (value.equals(e.getValue())) return true; } } return false;}
查找是否包含指定的key:
//实现跟containsValue类似public boolean containsKey(Object key) {}
根据指定的key获取value:
//实现跟containsValue类似,只不过在这里返回的是匹配的valuepublic V get(Object key){}
修改操作
//put方法不支持,不做实现public V put(K key, V value) { throw new UnsupportedOperationException();}
根据指定的key删除对应的entrySet:
public V remove(Object key) { //获得迭代器 Iterator<Entry<K,V>> i = entrySet().iterator(); //存储根据key找到的entry Entry<K,V> correctEntry = null; //key为null if (key==null) { //如果已经找到过一次,就不再继续找了 while (correctEntry==null && i.hasNext()) { Entry<K,V> e = i.next(); if (e.getKey()==null) correctEntry = e; } } else { while (correctEntry==null && i.hasNext()) { Entry<K,V> e = i.next(); if (key.equals(e.getKey())) correctEntry = e; } } //将当前的entry删除,返回原来的值 V oldValue = null; if (correctEntry !=null) { oldValue = correctEntry.getValue(); i.remove(); } return oldValue;}
批量操作
把指定的Map中所有映射复制到当前的Map中去:
public void putAll(Map<? extends K, ? extends V> m) { //遍历指定的Map,挨个put for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) put(e.getKey(), e.getValue());}
清空Map:
public void clear() { entrySet().clear();}
//key集合transient volatile Set<K> keySet = null;//value集合transient volatile Collection<V> values = null;
返回key的集合,set集合只在第一次调用该方法的时候创建。不是线程安全的,不保证多次请求的结果都是一样的。
public Set<K> keySet() { //只在keySet为空的时候才做处理 if (keySet == null) { keySet = new AbstractSet<K>() { public Iterator<K> iterator() { return new Iterator<K>() { private Iterator<Entry<K,V>> 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); } }; } return keySet;}
返回values集合,实现跟keySet类似:
public Collection<V> values() {}
比较和哈希
public boolean equals(Object o) { //给定的对象是当前对象,返回true if (o == this) return true; //非map类型的,返回false if (!(o instanceof Map)) return false; Map<K,V> m = (Map<K,V>) o; //大小不一样,返回false if (m.size() != size()) return false; //迭代判断每个entrySet try { Iterator<Entry<K,V>> i = entrySet().iterator(); while (i.hasNext()) { Entry<K,V> e = i.next(); K key = e.getKey(); V value = e.getValue(); if (value == null) { if (!(m.get(key)==null && m.containsKey(key))) return false; } else { if (!value.equals(m.get(key))) return false; } } } catch (ClassCastException unused) { return false; } catch (NullPointerException unused) { return false; } return true;}
//哈希值为每个entrySet的哈希值相加public int hashCode() { int h = 0; Iterator<Entry<K,V>> i = entrySet().iterator(); while (i.hasNext()) h += i.next().hashCode(); return h;}
public String toString() {}
克隆:
//只做浅拷贝,key和value集合不做克隆protected Object clone() throws CloneNotSupportedException { AbstractMap<K,V> result = (AbstractMap<K,V>)super.clone(); result.keySet = null; result.values = null; return result;}
从1.6开始新增的
public static class SimpleEntry<K,V>
public static class SimpleImmutableEntry<K,V>
上面两个Simple是对Map中interface Entry<K,V>
的实现,SimpleImmutableEntry不允许setValue。
0 0
- AbstractMap
- AbstractMap
- AbstractMap 源代码
- AbstractMap equals方法分析
- Map和AbstractMap
- Java集合之AbstractMap
- Map和AbstractMap
- 享元模式-AbstractMap结构
- JDK源码阅读之AbstractMap
- jdk源码分析之AbstractMap
- AbstractMap抽象类源码解析
- java.util.AbstractMap<K,V>
- java集合系列14 AbstractMap
- java 集合框架 Map-AbstractMap
- 一个效率低下的Map实现:AbstractMap
- JDK源码阅读之AbstractMap类
- Map深入学习(二)AbstractMap
- Java 集合深入理解(15):AbstractMap
- Android保存图片到本地
- Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析
- css透明背景如何兼容各个浏览器
- oracle 11g dataguard 升级为maximize protection
- Android Fragment 真正的完全解析(上)
- AbstractMap
- Qt,Qt Creator,minGW,VS关系
- 服务器启动的时候,如何加载spring?
- datapump 导出数据时无法创建job ORA-31626,ORA-31633,ORA-01031
- SVN服务器搭建和使用(三)
- Kafka源码深度解析-序列10 -Server入门-Zookeeper与集群管理原理
- Spring学习之SpringMVC框架快速搭建实现用户登录功能
- MYSQL数据库CMD命令笔记整理
- OC中的富文本