Java 中的 Map 接口
Map 接口的定义: public interface Map<K,V>
很明显这是个泛型接口, 而且接受的是两个参数: K,V.K 代表的是 Key,V 代表 Value.Map 存放的是一系列的键值对, 每个键都映射到一个值上.
Map 接口要注意的几点:
一个键只能映射到一个值
不能包含重复的键
Map 的结构是无序的, 不能够通过下标来访问
Map 接口提供三种 collection 视图, 允许以键集 (keySet), 值集(values) 或键 - 值映射关系集 (entrySet) 的形式查看某个映射的内容.
keySet 视图: Set<K> keySet()
该方法返回一个 Set 集合, 类型为 Map 键的类型 K. 该 set 受映射支持, 也就是说, 当我们更改 set 键集时, 原 hashMap 也会受到相同的更改, 这是非常可怕的一点.
当我们要对 hashMap 进行遍历时, 可通过该方法来获取 hashMap 的键集合, 从而通过迭代器来对键进行遍历以获取 Map 中存放的值.
- // 获取键集并遍历获取值
- Set keySets = hashMap.keySet();
- for (Object key : keySets) {
- hashMap.get(key);
- }
获取键集并遍历获取值
values 视图: Collection<V> values()
返回此映射中包含的值的 Collection 视图. 该 collection 受映射支持, 跟上面的 Set 相同, 在我们改变某个值的时候, hashMap 也会受到影响. 在仅需要知道值而忽略键的遍历时可以用到该方法. 遍历方式同样是使用迭代器(加强 for 循环).
entrySet 视图: Set<Map.Entry<K,V>> entrySet()
这是 Map 中最重要的一个视图, 它返回的是键值对的 set 集合, 就是说 set 中的每一个元素都是一个 Map 中的键值对. 该 set 受映射支持.
entrySet 返回一个 Set<Map.Entry<K,V>>集合, 集合中元素类型为 Map.Entry 类型, 这是 Map 接口中的一个内部接口, 在 Map 的实现类如 HashMap 等有其实现类, 代表着 Map 中的一个个节点.
entrySet 中的方法:
getKey() 返回与此项对应的键.
getValue() 返回与此项对应的值.
setValue(V value) 用指定的值替换与此项对应的值.
Map 其他的一些常用方法:
containsKey(Object key) 判断 Map 中是否包含该键
containsValue(Object value) 判断 Map 中是否存在该 value
get(Object key) 通过键来获取其在 Map 中映射的值
put(K key, V value) 添加键值对, 如果该键已存在的话, 将把原有值覆盖
putAll(Map<? extends K,? extends V> m) 添加 Map 对象中的所有键值对
remove(Object key) 通过键移除映射关系
size() 获取 Map 中存在的键值对数量
Map 的常用实现类
HashMap: 结构是哈希表, 其存放的数据是无序的, 通过哈希值和 equals 来对元素进行比较.
TreeMap: 底层结构为二叉树, 存放时将元素进行排序. 对于没有实现比较算法的对象, 需要在构造 TreeMap 时传入一个该对象的 Comparator 比较器或让该对象实现 Comparable 接口. 具体实现与 TreeSet 相同.
思考: 如何将一串字符串中的每个字母出现次数存入字典, 并找出第一个出现两次的字母
我这里采用 hashMap 来实现, 首先我们要将字母次数加入 Map 中, 字母作为键, 出现次数作为值:
- HashMap<Character, Integer> hmc = new HashMap();
- for (char c : str.toCharArray()) {
- // 如果该字母已存在于 Map 中, 则将其次数 (值) 加一, 否则添加该键, 值为 1
- if (hmc.containsKey(c)) {
- int count = hmc.get(c);
- hmc.put(c, ++count);
- } else {
- hmc.put(c, 1);
- }
- }
其次我们需要找到值为 2 的键值对, 获取该键值对的键 (字母) 在字符串中第一次出现的位置(indexOf), 并通过一个中间变量来存储. 接着我们以打擂台的形式取得第一次出现位置最小的键, 就是我们要找的那个字母啦:
- Set set = hmc.entrySet(); // 获取键值对集
- int index = -1; // 要找的字母的位置
- for (Object object : set) {
- Entry node = (Entry)object; // 键值对集中的元素, 即 Entry 节点
- char key = (char) node.getKey(); // 获取键(字母)
- if((int)node.getValue()==2) {
- int num = str.indexOf(key); // 该键 (字母) 在字符串中第一次出现的位置
- if(index==-1 || str.indexOf(key)<index){ // 打擂台, 谁小取谁
- index = str.indexOf(key);
- }
- }
- }
来源: https://www.cnblogs.com/JuanF/p/9332497.html