java--常用API之Map接口

集合继承体系的面向对象思想

  接口:用来明确所有集合中该具有的功能,相当于在定义集合功能标准;

  抽象类:把多个集合中功能实现方式相同的方法,抽取到抽象类实现,具体集合不再遍写,继承使用即可;

  具体类:继承抽象类,实现接口,重写所有抽象方法,达到具备指定功能的集合。

  每个具体集合类,根据自身的数据存储结构方式,对接口中的功能方法,进行不同方式的实现。

Map接口概述:

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

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

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

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

  Map中常用的集合为HashMap集合、LinkedHashMap集合。

 Map接口中常用集合概述

HashMap集合、LinkedHashMap集合:

HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。

        由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。

           通过链表结构可以保证元素的存取顺序一致;

           通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

 注意:Map接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。

           两个泛型变量<K,V>的数据类型可以相同,也可以不同。

 Map接口中的常用方法

  put方法:将指定的键与值对应起来,并添加到集合中

  方法返回值为键所对应的值

使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;

使用put方法时,若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),

并把指定键所对应的值,替换成指定的新值。

get方法:获取指定键(key)所对应的值(value)

remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value)。

 代码实现:

复制代码
 1 package com.oracle.map;
 2 
 3 import java.util.HashMap;
 4 import java.util.Iterator;
 5 import java.util.Map;
 6 import java.util.Set;
 7 
 8 public class Demo01 {
 9 
10     public static void main(String[] args) {
11         HashMap<Integer,String> map=new HashMap<Integer,String>();
12         map.put(1, "aaa");
13         map.put(2, "bbb");
14         map.put(3, "aaa");
15         map.put(3, "ccc");
16         /*System.out.println(map.get(3));
17         System.out.println(map.remove(2));*/
18         //1.键找值keySet()
19         //获取所有键所对应的set集合
20         /*Set<Integer> set=map.keySet();
21         //遍历所有的键
22         Iterator<Integer> it=set.iterator();
23         while(it.hasNext()){
24             //获取键
25             int key=it.next();
26             //通过键找值
27             String value=map.get(key);
28             System.out.println(key+"...."+value);
29         }*/
30         //2.获取结婚证entrySet()
31         //获取结婚证集合
32         Set<Map.Entry<Integer, String>> set=map.entrySet();
33         //增强for遍历结婚证集合 获取到每一个结婚证对象
34         for(Map.Entry<Integer, String> entry:set){
35             //通过每一个结婚证对象获取key和value
36             int key=entry.getKey();
37             String value=entry.getValue();
38             System.out.println(key+"....."+value);
39         }
40 
41     }
42 
43 }
复制代码

 Map集合遍历键找值方式

键找值方式:即通过元素中的键,获取键所对应的值

    1.获取Map集合中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键

2.遍历键的Set集合,得到每一个键

3.根据键,获取键所对应的值

HashMap存储自定义类型键值:

  HashMap:

  特点:

                 是Map集合的子集合

                 底层采用哈希表结构

                 HashMap集合中的key不能重复,通过重写hashCode() 与 equals()方法来保证键的唯一。

                 不能保证元素存与取的顺序完全一致

  LinkedHashMap:

  特点:

是HashMap集合的子集合

底层采用哈希表+链表结构

LinkedHashMap集合中的key不能重复,通过重写hashCode() 与 equals()方法来保证键的唯一。

集合嵌套:

复制代码
 1 package com.oracle.map;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 import java.util.Set;
 6 
 7 //HashMap<String, HashMap<String,String>>
 8 //基地Oracle
 9 //Java0601
10 //        1   熊大
11 //        2   熊二
12 //Java0328
13 //        1   张维
14 //        2    王荣臣
15 public class Demo03 {
16     public static void main(String[] args) {
17         //基地oracle
18         HashMap<String, HashMap<String,String>> oracle
19                         =new HashMap<String, HashMap<String,String>>();
20         //班级class
21          HashMap<String,String> java0601=new  HashMap<String,String>();
22          java0601.put("1", "熊大");
23          java0601.put("2", "熊二");
24          HashMap<String,String> java0328=new  HashMap<String,String>();
25          java0328.put("1", "张维");
26          java0328.put("2", "王荣臣");     
27         //基地oracle
28          oracle.put("java0601", java0601);
29          oracle.put("java0328", java0328);
30          //keySet(oracle);
31          entry(oracle);
32     }
33     //第一种方式:keySet()
34     public static void keySet(HashMap<String, HashMap<String,String>> oracle){
35         //先获取所有班级String所对应的key
36         Set<String> classname=oracle.keySet();
37         for(String c:classname){
38             //根据班级名称,获取所有学生信息所在的map
39              HashMap<String,String> students=oracle.get(c);
40              //获取所有学生的序号
41              Set<String> numbers=students.keySet();
42              for(String num:numbers){
43                  //根据每个同学的学号获取姓名
44                  String stuname=students.get(num);
45                  System.out.println(c+"...."+num+"..."+stuname);
46              }
47         }
48     }
49     //第二种方式,通过entrySet()
50     public static void entry(HashMap<String, HashMap<String,String>> oracle){
51         //获取第一个结婚证
52         Set<Map.Entry<String, HashMap<String,String>>> classname=oracle.entrySet();
53         //
54         for(Map.Entry<String, HashMap<String,String>> c:classname){
55             //获取班级名称
56             String cname=c.getKey();
57             //获取学生信息的map
58              HashMap<String,String> students=c.getValue();
59              //获取第二个结婚证集合
60              Set<Map.Entry<String, String>> stu=students.entrySet();
61              //遍历结婚证集合 得到每一个结婚证
62              for(Map.Entry<String, String> s:stu){
63                  String num=s.getKey();
64                  String name=s.getValue();
65                  System.out.println(cname+"..."+num+"..."+name);
66                  
67              }
68             
69         }
70     }
71 }
复制代码

Entry键值对对象:

 Entry是Map接口中提供的一个静态内部嵌套接口。

  entrySet()方法:用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。

 

 静态导入

  Collections中的方法:

                   public static <T> void sort(List<T> list) 排序

                   public static void shuffle(List<?> list) 集合中的元素存储位置随机打乱

代码实现:

复制代码
 1 import static java.lang.System.out;
 2 public class Demo01 {
 3 
 4     public static void main(String[] args) {
 5         System.out.println("aaa");
 6         out.println("aaa");
 7 
 8     }
 9 
10 }
复制代码

可变参数:int...a

复制代码
 1 public class Demo02 {
 2 
 3     public static void main(String[] args) {
 4         //写方法:计算几个数的求和
 5         add(4,5,6,7,8,9,23,44,55);
 6     }
 7     //可变参数int...a  相当于一个数组int[]  a
 8     //必须放在参数列表最后  一次只能传一个
 9     public static void add(int b,int...a){
10         int sum=0;
11         for(int i:a){
12             sum+=i;            
13         }
14         System.out.println(a.length);
15         System.out.println(sum);
16     }
17 
18 }
复制代码

sort、shuffle方法代码实现

复制代码
 1     public static void main(String[] args) {
 2         // 给List集合打乱顺序
 3         ArrayList<Integer> list=new ArrayList<Integer>();
 4         list.add(123);
 5         list.add(2);
 6         list.add(33);
 7         list.add(44);
 8         list.add(56);
 9         list.add(633);
10         list.add(72);
11         System.out.println(list);
12         //打乱
13     /*    Collections.shuffle(list);
14         System.out.println(list);*/
15         //对集合进行排序
16         Collections.sort(list);
17         System.out.println(list);
18     }
19 }
复制代码

斗地主案例:

复制代码
 1 import java.util.ArrayList;
 2 import java.util.Collections;
 3 import java.util.HashMap;
 4 
 5 
 6 public class DouDiZhu {
 7     private static ArrayList<Integer> bottom;
 8 
 9     public static void main(String[] args) {
10         //1.定义扑克牌Map
11         HashMap<Integer,String> pooker=new HashMap<Integer,String>();
12         //2.定义装扑克牌编号的ArrayList
13         ArrayList<Integer> pookernumber=new ArrayList<Integer>();
14         //3.定义花色数组
15         String[] color={"♥","♣","♦","♠"};
16         //4.数字数组
17         String[] number={"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
18         //组合牌
19         int index=2;
20         for(String num:number){
21             for(String col:color){
22                 pooker.put(index, col+num);
23                 pookernumber.add(index);
24                 index++;
25             }
26         }
27         //手动封装大小王
28         pooker.put(0, "大☻");
29         pookernumber.add(0);
30         pooker.put(1, "小☺");
31         pookernumber.add(1);
32         //洗牌
33         Collections.shuffle(pookernumber);
34         //发牌
35         ArrayList<Integer> player1=new ArrayList<Integer>();
36         ArrayList<Integer> player2=new ArrayList<Integer>();
37         ArrayList<Integer> player3=new ArrayList<Integer>();
38         ArrayList<Integer> bottom=new ArrayList<Integer>();
39         
40         for(int i=0;i<pookernumber.size();i++){
41             if(i<3){
42                 bottom.add(pookernumber.get(i));
43             }else if(i%3==0){
44                 player1.add(pookernumber.get(i));
45             }else if(i%3==1){
46                 player2.add(pookernumber.get(i));
47             }else if(i%3==2){
48                 player3.add(pookernumber.get(i));
49             }
50         }
51         //对玩家及底牌进行排序
52         Collections.sort(player1);
53         Collections.sort(player2);
54         Collections.sort(player3);
55         Collections.sort(bottom);
56         //看牌
57         look("薛之谦",pooker,player1);
58         look("刘德华",pooker,player2);
59         look("王祖蓝",pooker,player3);
60         look("底牌",pooker,bottom);
61     }
62     public static void look(String name,HashMap<Integer,String> pooker,ArrayList<Integer> player){
63         System.out.print(name+":");
64         for(int num:player){
65             System.out.print(pooker.get(num)+" ");
66         }
67         System.out.println();
68     }
69 }
复制代码

 

原文地址:https://www.cnblogs.com/-dashu/p/9429441.html