集合继承体系的面向对象思想
接口:用来明确所有集合中该具有的功能,相当于在定义集合功能标准;
抽象类:把多个集合中功能实现方式相同的方法,抽取到抽象类实现,具体集合不再遍写,继承使用即可;
具体类:继承抽象类,实现接口,重写所有抽象方法,达到具备指定功能的集合。
每个具体集合类,根据自身的数据存储结构方式,对接口中的功能方法,进行不同方式的实现。
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 }