Java基础——Map总结

Map 概述:
Map 用于有映射关系的数据,以 key-value 的形式保存。key 和 value 可以是任何类型的数据。
1、key:
key 是不允许重复的,意思就是同一个 Map 对象的任何两个 key 通过 equals 方法比较后应该返回false。如果我们把一个 Map 集合中所有的 key 放在一起看,它们就组成了一个 Set 集合(所有的 key 是没有顺序的,而且 key 是不可以重复的)。而且我们可以通过 keySet()方法获取 Map 集合中由 key 组成的 Set 集合。
Map 和 Set 的关系是很密切的。如果把 value 当成 key 的附属的话,仅仅看 key,我们就可以把 Map 当成 Set 了。事实上,Map 内部封装了一个内部类:Entry。由 Entry 来封装 key-value,而计算 Entry 存储时只考虑 Entry 封装的 key。其实 Java源码中,是先实现了 Map ,然后通过包装一个所有 value 都为 null 的 Map 来实现 Set 集合。

2、value:
如果我们把 Map 集合中的所有 value 放在一起看,它们又类似于一个 List:value之间可以重复,每个 value 可以通过索引(key)来查找。我们可以通过索引来取出 value。只不过这个时候索引值不再是整数,而是任意类型都可以。
下面的示例展示了 Map 集合的基本功能:

我们通过 put 方法添加键值对,添加数据的时候,value 值是可以重复的;添加 key-value 时,如果 key 重复,新的 value 会覆盖原来的 value,而且此方法会返回原来的 value 值。map 集合可以检查集合中是否存在指定的 key 或者指定的 value;我们可以使用 map 的 keySet 方法获取 key 的 set 集合,然后遍历这个 set 集合,循环取出 value 值;我们可以根据 key 去删除这个 key-value 对。

HashMap 和 Hashtable :
HashMap 、Hashtable 是 Map 接口典型的实现类,不过 Hashtable 出现的比较早,比 Map 还要早。
不同点:
1、Hashtable 是一个线程安全的类,HashMap 是线程不安全的类,所以 HashMap 的性能好一点,但如果多个线程操作 Map 集合,可以考虑使用 Hashtable。
2、Hashtable 不允许使用 null 作为 key 或者 value,若果存入 null 将会引发 NullPointExecption;但是 HashMap 可以使用 null 作为 key 或者 value。但是也只能存入一个 key 为 null 的键值对,因为 key 是不可以重复的,可以存入无数个 value 为 null 的键值对。我们看下例子:

我们先后存入两队键值对都为 null 的元素,再存入 key 为 one,value 为 null 的元素,然后打印输出集合元素内容可以看到:只有两对键值对 null-null 和 one-null。
类似点:
1、我们知道,HashSet 集合存入元素时,判断两个元素是否相等的依据是: hashCode 方法的返回值是否相同,两个对象通过 equals 方法对比返回 true。而HashMap 对于存入的 key 也是相同的依据:hashCode 方法的返回值要相等,equals 方法返回 true。那如何判断 两个value 是否相等呢?依据比较简单,只需要两个对象通过 equals 方法返回 true 即可。我们可以通过下面示例看一下:

上例中,类 F 有一个属性 count,如果 count 相等,则 hashCode 返回值相等,equals 方法返回true。类 G 重写 equals 方法,无论何时都返回 true。测试代码中,我们查询 map 中是否存在 value 值为任意类 G 对象的元素。我们得到的结果是存在,因为类 G equals 方法返回 true。当我们查询是否含有 count 值为20的 F 对象时,因为count相等,hashCode 返回值相等,equals 返回true,所以,得到的结果也是存在。不过这里,我们要注意一个问题,HashMap 调用 containsValue(Object value) 方法时,方法内调用的是传入参数的 equals 方法,而 Hashtable 调用 containsValue 方法时,方法内调用的是 Hashtable 内 value 对象的 equals 方法。我们看一下两个类的源码就清楚了:


2、与 HashSet 类似,我们尽量不要修改作为 key 值的元素对象,因为这会出现无法准确访问的问题,我们看下面的例子:

例子中,我们先存入两对 key-value,然后取出其中一个 key 为 10000 的数据并修改成 39723,然后我们删除 key=39723的数据,删除后,我们发现 map 集合里还存在一条我们之前修改过的数据,之后我们执行查询操作后发现,无论查询 key=10000的数据还是 key=39723的数据,结果都是 null。所以,我们使用过程中尽量不要修改 key 对象。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值