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();
}
//获取Key
public K getKey(){
return this.key;
}
//获取value
public 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计算hashCode
public 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();
}
//判断是否包含某个key
public boolean containsKey(K key){
return super.contains(new SimpleEntry<K, V>(key, null));
}
//判断是否包含某个value
public boolean containsValue(V value){
for(SimpleEntry<K, V> se : this){
if(se.getValue().equals(value));
return true;
}
return false;
}
//根据指定key取出对应的value
public 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();
}
}