前言:在Java语言中,集合是出镜率非常大的一个模块,那么简单看看喽
1.1 Set和Map
Set代表一种无序的、元素不可重复的集合。
Map则代表是一种key-value对组成的集合,Map集合类似于传统的关联数组。
表面上看它们之间的关系的相似性很少,实则Map和Set之间有着莫大的关联,可以这样说Map集合实则是Set集合的扩展。
1.2 Set和Map之间的关系
先看看Set集合的继承体系,再来看Map集合的类继承体系:
从上图灰色阴影部分可以看出Map和Set的集合实现类除了后面Set和Map部分不一样,前面的类或接口的名称以及其继承结构完全一样。是偶然吗?答案绝对不是。
相信你使用过map和set,那么应该注意到一个细节,map的key拿出来是不是跟set是相似的:不允许重复;map便利的时候key是无序的,对应map中的keyset()方法。
反过来,这个是map集合的示意图:
并且在map中value是紧跟key的,那么我们把value跟key绑在一块的时候如下图:
是不是我们可以把map看成一个set结构。
1.3下面我会用一段小程序来说明Set为何与Map这么相似了。
包含key-value的entry实现代码:
package com.ngu4k.test.collection;
import java.io.Serializable;
import java.util.Map.Entry;
public class SimpleEntry<K,V> implements Entry<K,V>,Serializable{
private static final long serialVersionUID = -4352059623055803486L;
private final K key;
private V value;
//定义两个如下构造器
public SimpleEntry(K key,V value)
{
this.key = key;
this.value = value;
}
public SimpleEntry(Entry<? extends K,? extends V> entry)
{
this.key = entry.getKey();
this.value = entry.getValue();
}
//获取key
public K getKey()
{
return key;
}
//获取value
public V getValue()
{
return value;
}
//改变该key-value对的value值
public V setValue(V value)
{
V oldValue = this.value;
this.value = value;
return oldValue;
}
//根据key比较两个对象是否相等
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;
}
}
package com.ngu4k.test.collection.map;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import com.ngu4k.test.collection.SimpleEntry;
/**
* Set到Map的简单实现
* @author ikouer
* @param <K>
* @param <V>
*/
public class Set2Map<K,V> extends HashSet<SimpleEntry<K,V>>{
private static final long serialVersionUID = 1596710712757978024L;
//清空Set2Map中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(K 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)
{
this.add(new SimpleEntry<K,V>(key,value));
return value;
}
//把一个Map集合添加到Set2Map集合中
public void putAll(Map<? extends K,? extends V> om)
{
for(K key : om.keySet())
{
this.add(new SimpleEntry<K,V>(key,om.get(key)));
}
}
//根据指定的key移除对应的key-value
public V remove(K key)
{
for(Iterator<SimpleEntry<K,V>> it = this.iterator(); it.hasNext();){
SimpleEntry<K,V> se = it.next();
if(se.getKey().equals(key))
{
V rv = se.getValue();
it.remove();
return rv;
}
}
return null;
}
//获取集合大小
public int size(){
return super.size();
}
//测试该Set2Map的功能:
public static void main(String[] args) {
Set2Map<String,Integer> smap = new Set2Map<String,Integer>();
//将key-value放入集合
smap.put("语文", 88);
smap.put("数学", 99);
smap.put("英语", 102);
System.out.println(smap);
System.out.println(smap.size());
//执行移除对称key的entry
smap.remove("数学");
System.out.println("删除key为\"数学\"的Entry之后:"+smap);
//获取key为语文的value值
System.out.println("key为\"语文\"的value值:"+smap.get("语文"));
//判断是否包含key
System.out.println("是否包含key为\"英语\"的entry:"+smap.containsKey("英语"));
//判断是否包含value
System.out.println("是否包含value为102:"+smap.containsValue(102));
//执行clear方法
smap.clear();
System.out.println("执行完clear()方法之后的集合:"+smap);
}
}
通过以上两段代码,我们创造出来的Set2Map就可以实现大部分的map功能了。我们看数据结构可以看出来这是一个hashmap,并且是由hashset实现的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。