JavaSE|Map、HashMap、LinkedHashMap、TreeMap 亦凉 2022-04-21 15:12 297阅读 0赞 ### JavaSE|Map、HashMap、LinkedHashMap、TreeMap ### * Map * * Map 与 Collection 集合的不同 * Map集合的功能概述 * Map集合的遍历 * HashMap * LinkedHashMap * TreeMap * 面试题 # Map # public interface Map<K,V> 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 ## Map 与 Collection 集合的不同 ## * Map是双列的,Collection是单列的 * Map的键唯一,Collection的子体系Set是唯一的 * Map集合的数据结构只针对键有效,跟值无关;Collection集合的数据结构是针对元素有效。 ## Map集合的功能概述 ## 1. 添加功能 **V put(K key, V value)** 添加元素。 如果键是第一次存储,就直接存储元素,返回null; 如果键不是第一次存储,就用值把以前的值替换掉,并把值返回。 2. 删除功能 **void clear()** 移除所有键值对元素 **V remove(Object key)** 根据键删除键值对元素,并把值返回。 如果该键存在,删除键值对,并返回对应值; 如果该键不存在,返回null。 3. 判断功能 boolean containsKey(Object key):判断集合是否包含指定的键 boolean containsValue(Object Value):判断集合是否包含指定的值 boolean isEmpty():判断集合是否为空 4. 获取功能 Set<Map.Entry<K,V>> entrySet() V get(Object key):根据键获取值 Set<K> keySet():获取集合中所有键的集合 Collection<V> values():获取集合中所有值的集合 5. 长度功能 int size():返回集合中的键值对的对数 ## Map集合的遍历 ## **法一:键找值** 1. 获取所有的键 2. 遍历键的集合,获取得到每一个键 3. 根据键去找值 **法二:键值对对象找键和值** 1. 获取所有键值对对象的集合 2. 遍历键值对对象的集合,得到每一个键值对对象 3. 根据键值对对象获取键和值 ![两种遍历方式比较][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rhcmxpbmd3b29kMjAxMw_size_16_color_FFFFFF_t_70] Map<String ,String> map = new HashMap<String ,String>(); map.put("杨过", "小龙女"); map.put("郭靖", "黄蓉"); map.put("杨康", "穆念慈"); map.put("陈玄风", "梅超风"); Set<String> set = map.keySet(); for(String key: set){ String value = map.get(key); System.out.println(key + "---" + value); } System.out.println("---------------"); Set<Map.Entry<String, String>> sme = map.entrySet(); for(Map.Entry<String, String> me: sme){ System.out.println(me.getKey() + "---" + me.getValue()); } # HashMap # 基于哈希表的 Map 接口的实现。 哈希表的作用是用来保证键的唯一性。 # LinkedHashMap # Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。 由哈希表保证键的唯一性,由链表保证键的有序(存储和取出顺序一致) # TreeMap # 键是红黑树结构,可以保证键的排序和唯一性 # 面试题 # **1.HashMap和Hashtable的区别** 分析: public class **Hashtable<K,V>** extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable 此类实现一个哈希表,该哈希表将键映射到相应的值。任何**非 null 对象**都可以用作键或值。 从Java 2 平台 v1.2起,此类就被改进以实现 Map 接口,使它成为 Java Collections Framework 中的一个成员。不像新的 collection 实现,Hashtable 是同步的 。 public class **HashMap<K,V>** extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并**允许使用 null 值和 null 键**。(除了**非同步**和**允许使用 null** 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 答案: Hashtable:线程安全,效率低,不允许null键和null值。 HashMap:线程不安全,效率高,允许null键和null值。 // HashMap<String, String> hm = new HashMap<String, String>(); Hashtable<String, String> hm = new Hashtable<String, String>(); hm.put("it001", "hello"); // hm.put(null, "world"); //NullPointerException // hm.put("java", null); // NullPointerException System.out.println(hm); 2.List,Set,Map等接口是否都继承自Map接口? List,Set不是继承自Map接口,它们继承自Collection接口。 Map接口本身就是一个顶层接口。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rhcmxpbmd3b29kMjAxMw_size_16_color_FFFFFF_t_70]: /images/20220414/cedfc5455e2b450cb905974d98efbb87.png
还没有评论,来说两句吧...