前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java集合之间的关系及实现细节(1)Set与Map

java集合之间的关系及实现细节(1)Set与Map

原创
作者头像
用户8870853
修改2021-07-27 11:07:50
3030
修改2021-07-27 11:07:50
举报
文章被收录于专栏:用户8870853的专栏

前言:在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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档