Map的初次学习
首次学习map的学习笔记,有错误还请谅解
map的层次结构
概述
java.util.Map<Key,Value>的特点:
- Map集合是一个双列集合,存放的是键值对
- Map的键不可以重复,但是值可以重复.
- Map中的key和value的类型不一定相同
- key和value一一对应
子类
HashMap集合的特点:
- 底层是哈希表 : 查询速度很快.
JDK1.8之前是数组 + 单向链表,JDK1.8之后是数组 + 单向链表/红黑树
- hashMap的集合是一个无序的集合,存取顺序可能不一致
LinkedHashMap的特点:
- 底层是哈希表 + 链表(保证元素有序,迭代顺序一致)
- 存取的顺序是一直的.
常用的方法:
- public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。
存储时,key不存在的时候,返回值为null,key存在时,使用新的value替换旧的value.,返回旧的value
所以该方法可以看做增加,也可以看做修改
- public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的
值。
key存在,返回被删除的value,key不存在,返回null
- public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
key存在,返回对应的value值,key不存在,返回null
- boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。
包含指定的key,返回true,不包含返回false
- boolean containsValue(Object value) 如果此map包含指定的值,则返回 true 。
- public Set
keySet() : 获取Map集合中所有的键,存储到Set集合中。
map集合不能直接使用迭代器进行遍历,所以可以使用keySet方法和get方法可以来进行遍历.
- Collection
values() 返回此结合中包含的值的Collection视图。 - public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。
在Map接口中有一个内部接口Entry,entry的作用是 :
当Map集合一创建,那么就会在Map集合中创建一个Entry对象,用来记录键与值(键值对对象/键与值的映射关系).
Entry中常用方法 :
- K getKey() 返回与此条目相对应的键。
- V getValue() 返回与此条目相对应的值。
- V setValue(V value) 用指定的值替换与该条目相对应的值(可选操作)。
Map如何保证key值唯一呢?
可以参考前面的HashSet,底层相同,所以原理也差不多,都是依赖于hashCode方法和equals方法.
LinkedHashMap
底层原理是 : 哈希表 + 链表(记录顺序),参考LinkedHashSet.
特点:
- 不能存取重复的key
- 存取有序
案例(斗地主将牌进行排序输出):
import java.util.*;
/**
* 斗地主案例
* 1. 组装54张扑克牌将
* 2. 54张牌顺序打乱
* 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
* 4. 查看三人各自手中的牌(按照牌的大小排序)、底牌
*
* 1. 准备牌:
* 完成数字与纸牌的映射关系:
* 使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典)。
* 2. 洗牌:
* 通过数字完成洗牌发牌
* 3. 发牌:
* 将每个人以及底牌设计为ArrayList,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。
* 存放的过程中要求数字大小与斗地主规则的大小对应。
* 将代表不同纸牌的数字分配给不同的玩家与底牌。
* 4. 看牌:
* 通过Map集合找到对应字符展示。
* @author WZLOVE
* @create 2018-07-14 14:34
*/
public class LinkedHashMapDemo {
public static void main(String[] args) {
// 准备牌
String[] arr1 = {"♠","♥","♣","♦"};
String[] arr2 = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
HashMap<Integer,String> hashMap = new HashMap<>();
int k = 0;
hashMap.put(k++,"大王");
hashMap.put(k++,"小王");
for (int i = 0; i < arr2.length; i++) {
for (int i1 = 0; i1 < arr1.length; i1++) {
hashMap.put(k++,arr1[i1] + arr2[i]);
}
}
/*for (Map.Entry<Integer, String> entry : hashMap.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}*/
// 洗牌,将键洗牌,值跟随键排列
Set<Integer> set = hashMap.keySet();
ArrayList<Integer> intList = new ArrayList<>();
for (Integer integer : set) {
intList.add(integer);
}
Collections.shuffle(intList);
// 发牌
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
ArrayList<Integer> list3 = new ArrayList<>();
ArrayList<Integer> list4 = new ArrayList<>();
for (int i = 0; i < intList.size(); i++) {
if(i >= 51){
list4.add(intList.get(i));
} else if(i % 3 == 0){
list1.add(intList.get(i));
}else if(i % 3 == 1){
list2.add(intList.get(i));
}else if(i % 3 == 2){
list3.add(intList.get(i));
}
}
list1 = sortList(list1);
list2 = sortList(list2);
list3 = sortList(list3);
list4 = sortList(list4);
print(list1,hashMap);
print(list2,hashMap);
print(list3,hashMap);
print(list4,hashMap);
}
/**
* 进行排序
* @param list 需要排序的集合
* @return 排好序的集合
*/
public static ArrayList<Integer> sortList(ArrayList<Integer> list){
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1- o2;
}
});
return list;
}
/**
* 格式化输出
* @param list 键的集合
* @param hashMap map集合
*/
public static void print(ArrayList<Integer> list,HashMap<Integer,String> hashMap){
for (int i = 0; i < list.size(); i++) {
if( i == 0 ){
System.out.print("[" + hashMap.get(list.get(i)) + ",");
} else if(i == list.size() - 1){
System.out.println(hashMap.get(list.get(i)) + "]");
} else{
System.out.print(hashMap.get(list.get(i)) + ",");
}
}
}
}