1.Map介绍
Map接口下的集合于collection接口下的集合存储数据的方式是不一样的,Map中是以键值对的方式存在的。示例如下:
Map以k-v的形式存在
-
map中不能有重复的键,但是值可以重复。每一个键只能对应与自己相对应的一个值
2.Map的常用子类
-
HashMap:存储市局结构使用的是哈希表结构,元素存取顺序不能保证一致,由于hashMap需要保证键的唯一,所以一般重写键的hashCode()方法,equals()方法。
-
LinkedHashMap:HashMap下的子类,存储数据结构是哈希表+链表结构,通过链表结构可以保证存取数据的有序性,通过hash表的方式可以确保键的唯一性,不需要重写hashCode方法和equals方法。
3.Map中常用方法
Map中常用的方法有以下几个:
-
public V put(K key,V value):
将指定的键与值提添加到map -
public V remove(Object key):
将指定的键以及对应的value从map中删除,返回被删除的元素 -
public V get(Object key)
:根据指定的键,在Map集合中获取对应的值。 -
public Set<K> keySet()
: 获取Map集合中所有的键,存储到Set集合。 -
public Set<Map.Entry<K,V>> entrySet()
: 获取到Map集合中所有的键值对对象的集合(Set集合)。
代码示例:
1 public static void main(String[] args) { 2 HashMap<Integer,String> map = new HashMap<>(); 3 //在map中加入元素 4 map.put(1,"熊大"); 5 map.put(2,"熊二"); 6 map.put(3,"光头强"); 7 System.out.println(map); 8 9 //remove 10 String remove = map.remove(2); 11 System.out.println(remove);//熊二 12 13 //get 14 String s = map.get(3); 15 System.out.println(s);//光头强 16 }
注意:使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。
4.Map的遍历
方式1:通过map的键来查找值
1 public static void main(String[] args) { 2 HashMap<Integer,String> map = new HashMap<>(); 3 //在map中加入元素 4 map.put(1,"熊大"); 5 map.put(2,"熊二"); 6 map.put(3,"光头强"); 7 8 //获取key的集合 9 Set<Integer> set = map.keySet(); 10 //遍历key集合 11 for (Integer key : set) {//key就是map集合的key 12 //打印key对应的value 13 System.out.println(key+":"+map.get(key)); 14 } 15 }
方法二:通过Entry来获取对象
1 public static void main(String[] args) { 2 HashMap<Integer,String> map = new HashMap<>(); 3 4 //在map中加入元素 5 map.put(1,"熊大"); 6 map.put(2,"熊二"); 7 map.put(3,"光头强"); 8 9 //获取entry对象 10 Set<Map.Entry<Integer, String>> entries = map.entrySet(); 11 //遍历entry对象 12 for (Map.Entry<Integer, String> entry : entries) { 13 Integer key = entry.getKey(); 14 String value = entry.getValue(); 15 16 System.out.println(key+":"+value); 17 } 18 }
5.Map集合小练习
获取一个字符串中每个字母出现的次数
1 public static void main(String[] args) { 2 String s = "you-are-my-shine,baby"; 3 //用字符数组中的每个字符作为K,出现次数作为V 4 HashMap<Character, Integer> map = new HashMap<>(); 5 6 //遍历字符串 7 for (int i = 0; i <s.length() ; i++) { 8 //转换为字符 9 char k = s.charAt(i); 10 //判断是否包含字符 11 //不包含说明是第一次put 12 if (!map.containsKey(k)){ 13 map.put(k,1); 14 }else { 15 //包含,先获取已经有的次数,然后++,put进去 16 Integer v = map.get(k); 17 map.put(k,++v); 18 } 19 } 20 System.out.println(map); 21 }