Map集合

在Map集合中保存的数据为一组数据,其中:一个数据为key,另外一个数据为value。而key和value具备对应的关系,在集合中它们属于一组(一对)数据。而每个key只能对应唯一的一个value值并且所有的key不能重复。 但是其中的value值是可以重复的。

  • Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。

  • Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。

  • Collection中的集合称为单列集合,Map中的集合称为双列集合。

  • 需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

通过查看Map接口描述,看到Map有多个子类,这里我们主要讲解常用的两个集合:

​ HashMap集合

​ LinkedHashMap集合。

  • HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,因此需要重写键的hashCode()方法、equals()方法。

  • LinkedHashMap<K,V>:存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

Map接口中定义了很多方法,常用的如下:

  • public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。如果键值存在则覆盖。

  • public V remove(Object key): 把指定的键和对应的值在集合中删除,返回被删除元素的值。

  • public V get(Object key) 根据指定的键,在Map集合中获取对应的值。

Map接口的方法演示

 1 public class MapDemo {
 2     public static void main(String[] args) {
 3         //创建 map对象
 4         HashMap<String, String>  map = new HashMap<String, String>();
 5 
 6         //添加元素到集合
 7         map.put("黄晓明", "杨颖");
 8         map.put("文章", "马伊琍");
 9         map.put("邓超", "孙俪");
10         System.out.println(map);
11 
12         //String remove(String key)
13         System.out.println(map.remove("邓超"));
14         System.out.println(map);
15 
16         // 想要查看 黄晓明的媳妇 是谁
17         System.out.println(map.get("黄晓明"));
18         System.out.println(map.get("邓超"));    
19     }
20 }

键找值方式

public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。

 1 public class MapDemo01 {
 2     public static void main(String[] args) {
 3         //创建Map集合对象 
 4         HashMap<String, String> map = new HashMap<String,String>();
 5         //添加元素到集合 
 6         map.put("胡歌", "霍建华");
 7         map.put("郭德纲", "于谦");
 8         map.put("薛之谦", "大张伟");
 9 
10         //获取所有的键  获取键集
11         Set<String> keys = map.keySet();
12         // 遍历键集 得到 每一个键
13         for (String key : keys) {
14               //key  就是键
15             //获取对应值
16             String value = map.get(key);
17             System.out.println(key+"的CP是:"+value);
18         }  
19     }
20 }

Entry键值对对象

public Set<Map.Entry<K,V>> entrySet(): 获取集合中所有的键值对对象,保存到Set集合中。

我们已经知道,Map中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在Map中是一一对应关系,这一对对象又称做Map中的一个Entry(项)Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:

  • public K getKey():获取Entry对象中的键。

  • public V getValue():获取Entry对象中的值。

 1 public class MapDemo02 {
 2     public static void main(String[] args) {
 3         // 创建Map集合对象 
 4         HashMap<String, String> map = new HashMap<String,String>();
 5         // 添加元素到集合 
 6         map.put("胡歌", "霍建华");
 7         map.put("郭德纲", "于谦");
 8         map.put("薛之谦", "大张伟");
 9 
10         // 获取 所有的 entry对象  entrySet
11         Set<Entry<String,String>> entrySet = map.entrySet();
12 
13         // 遍历得到每一个entry对象
14         for ( Entry<String, String> entry : entrySet) {
15                // 解析 
16             String key = entry.getKey();
17             String value = entry.getValue();  
18             System.out.println(key+"的CP是:"+value);
19         }
20     }
21 }

 

LinkedHashMap

在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。在保证key值对象唯一的前提下,还能保证元素的存取顺序。

 1 public class LinkedHashMapDemo {
 2     public static void main(String[] args) {
 3         LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
 4         map.put("邓超", "孙俪");
 5         map.put("李晨", "范冰冰");
 6         map.put("刘德华", "朱丽倩");
 7         Set<Entry<String, String>> entrySet = map.entrySet();
 8         for (Entry<String, String> entry : entrySet) {
 9             System.out.println(entry.getKey() + "  " + entry.getValue());
10         }
11     }
12 }

Map集合练习

需求:

  计算一个字符串中每个字符出现次数。

分析:

  1. 获取一个字符串对象

  2. 创建一个Map集合,键代表字符,值代表次数。

  3. 遍历字符串得到每个字符。

  4. 判断Map中是否有该键。

  5. 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值进行++,再次存储。

  6. 打印最终结果

 1 public class MapTest {
 2 public static void main(String[] args) {
 3         //友情提示
 4         System.out.println("请录入一个字符串:");
 5         String line = new Scanner(System.in).nextLine();
 6         // 定义 每个字符出现次数的方法
 7         findChar(line);
 8     }
 9     public static void findChar(String line) {
10         //1:创建一个集合 存储  字符 以及其出现的次数
11         HashMap<Character, Integer> map = new HashMap<Character, Integer>();
12         //2:遍历字符串
13         for (int i = 0; i < line.length(); i++) {
14             char c = line.charAt(i);
15             //判断 该字符 是否在键集中
16             if (!map.containsKey(c)) {//说明这个字符没有出现过
17                 //那就是第一次
18                 map.put(c, 1);
19             } else {
20                 //先获取之前的次数
21                 Integer count = map.get(c);
22                 //count++;
23                 //再次存入  更新
24                 map.put(c, ++count);
25             }
26         }
27         System.out.println(map);
28     }
29 }

排序集合TreeMap了解

如果保存到Map集合中的key值数据需要排序,则可以使用TreeMap集合。集合内部会自动完成key值对象的排序动作。如果想自定义排序方式,可以在创建集合对象时传递一个比价器对象。

  TreeMap():使用自然顺序对key值进行排序。

  TreeMap(Comparator comparator):创建对象时,传递比较器对象。按比较器的比较方式排序。

 1 public class Demo {
 2     public static void main(String[] args) {
 3         // 创建集合对象,key值按照自然顺序排序
 4         TreeMap<String, String> map1 = new TreeMap<>();
 5         // 给集合中保存元素
 6         map1.put( "affd", "123" );
 7         map1.put( "fff", "456" );
 8         map1.put( "ABC", "789" );
 9         System.out.println( "map1 = " + map1);
10 
11         // 创建集合对象,并传递比较器,按照指定的方式比较
12         TreeMap<String, String> map2 = new TreeMap<>(new Comparator<String>() {
13             public int compare(String o1, String o2) {
14                 // 按照长度比较 , 相同长度不保存
15                 return o1.length() - o2.length();
16             }
17         });
18         // 给集合中保存元素
19         map2.put( "affd", "123" );
20         map2.put( "fff", "456" );
21         map2.put( "ABC", "789" );
22         System.out.println( "map2 = " + map2 );
23     }
24 }

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!