Java集合研究一:Set与Map

来源:互联网 发布:佛教的软件 编辑:程序博客网 时间:2024/06/06 01:05

Set代表一种无序集合,集合元素不可重复;Map代表一种多个key-value对组成的集合

从Set和Map的继承体系图看,如果从名称分析,Set和Map有着千丝万缕的联系。并且从JDK中提供的Map接口中,你会发现提供了这样一个方法: Set<K> keySet();这就说明了,如果抛开Map中的value,那么Map中的所有key的实际上就是一个Set集合,而且我们查询的时候常常是通过key来查找value,那么我们可以将value和key绑定在一起,将value看成是key的附属物,那么你会惊奇的发现,其实Map就是一个Set集合,因此我们可以认定Map是Set的扩展,是一种特殊的Set集合。下面将尝试用Set扩展成Map

import java.util.HashSet;import java.util.Iterator;import java.util.Map;public class SimpleEntry <K,V> implements Map.Entry<K,V>,java.io.Serializable{private final K key;private V value;public SimpleEntry(K key, V value){this.key = key;this.value = value;}public SimpleEntry(Map.Entry<? extends K, ? extends V> entry){this.key = entry.getKey();}//获取Keypublic K getKey(){return this.key;}//获取valuepublic V getValue(){return this.value;}//改变key-value的value值public V setValue(V value){V oldValue = this.value;this.value = value;return oldValue;}//根据key比较两个SimpleEntry是否相等public boolean equals(Object o){if(o == this){return true;}if(o.getClass() == SimpleEntry.class){SimpleEntry se = (SimpleEntry)o;return se.getKey().equals(getKey());}return false;}//根据key计算hashCodepublic int hashCode(){return key == null ? 0 : key.hashCode();}public String toString(){return key + "=" + value;}}    //继承HashSet实现一个Map   public class SetToMap<K, V> extends HashSet<SimpleEntry<K, V>>{//实现清空所有key-value对的方法public void clear(){super.clear();}//判断是否包含某个keypublic boolean containsKey(K key){return super.contains(new SimpleEntry<K, V>(key, null));}    //判断是否包含某个valuepublic boolean containsValue(V value){for(SimpleEntry<K, V> se : this){if(se.getValue().equals(value));return true;}return false;}//根据指定key取出对应的valuepublic V get(Object key){for(SimpleEntry<K, V> se :this){if(se.getKey().equals(key)){return se.getValue();}}return null;}//将指定key-value对放入集合中public V put(K key, V value){add(new SimpleEntry<K ,V>(key, value));return value;}//将另一Map的key-value对放入该Map中public void putAll(Map<? extends K, ? extends V> m){for(K key : m.keySet()){add(new SimpleEntry<K, V>(key, m.get(key)));}}//根据指定key删除key-value对public V removeEntry(Object key){for(Iterator<SimpleEntry<K, V>> it = this.iterator(); it.hasNext(); ){SimpleEntry<K, V> en = (SimpleEntry<K, V>) it.next();if(en.getKey().equals(key)){V v = en.getValue();it.remove();return v;}}return null;}//获取该Map中包含多少个key-value对public int size(){return super.size();}}


0 0