Map<k,v>双列集合
1.一个元素包含两个值(key,value)
2.两个值的数据类型可以相同,也可不同
3.key不允许重复,value可以重复
4.key(键)和value(值)是一一对应的
HasMap<k,v>:无序的集合,不允许重复
1.底层是哈希表:查询速度快
JAD1.8之前:数组+单向链表
JAD1.8之后:数组+单向链表/后黑树,(链表长度超过8),提高查询速度
LinkedHasMap<k,v>:有序的集合,不允许重复
1.底层是哈希表+链表(保证迭代顺序)
2.有序的集合,存储取出元素一致
Cat作为value
public class MapBL1 {
public static void main(String[] args) {
Map<String,Cat> map = new HashMap<>();
//Cat作为value可以重复,(同名同年龄视为同一个人)
map.put("美国",new Cat("加菲猫",3));
map.put("中国",new Cat("蓝猫",2));
map.put("美国",new Cat("肥猫",3));
map.put("英国",new Cat("波斯猫",4));
//第一种遍历方式,通过键找到值
//Set<String> set = map.keySet();
for (String key : /*set*/map.keySet()) {
Cat value = map.get(key);
System.out.println(key+"-"+value);
/*美国-Cat{name='肥猫', age=3}
中国-Cat{name='蓝猫', age=2}
英国-Cat{name='波斯猫', age=4}*/
}
}
}
Cat作为key必须重写hashCode方法和equals方法,保证key唯一
public class MapBL2 {
public static void main(String[] args) {
Map<Cat,Integer> map = new HashMap<>();
//Cat作为key必须重写hashCode方法和equals方法,保证key唯一
map.put(new Cat("加菲猫",3),2);
map.put(new Cat("蓝猫",2),1);
map.put(new Cat("加菲猫",3),3);
map.put(new Cat("波斯猫",4),4);
//第二种遍历方式,通过entrySet方法创建Set集合
Set<Map.Entry<Cat,Integer>> entrySet = map.entrySet();
for (Map.Entry<Cat,Integer> entry : entrySet) {
Cat key = entry.getKey();//获取key
Integer value = entry.getValue();//获取value
System.out.println(key+"-"+value);
/*美国-Cat{name='肥猫', age=3}
中国-Cat{name='蓝猫', age=2}
英国-Cat{name='波斯猫', age=4}*/
}
}
}
计算字符串中,每个字字符出现的次数。
//计算字符串中,每个字字符出现的次数。
public class Test01 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入字符串:");
String line = s.nextLine();
HashMap<Character,Integer> map = new HashMap<>();
for (char key : line.toCharArray()) {
if(map.containsKey(key)){
Integer value = map.get(key);
value++;
map.put(key,value);
}else {
map.put(key,1);
}
}
for(Character key: map.keySet()){
Integer value = map.get(key);
System.out.println(key+"="+value);
}
System.out.println(map);
}
}
有序斗地主案例
public class Test01 {
public static void main(String[] args) {
//存储牌的索引跟对应的牌
HashMap<Integer,String> map = new HashMap<>();
//扑克的索引
List<Integer> list = new ArrayList<>();
//花色跟牌的序列号
List<String> huase = List.of("♠", "♥", "♣", "♦");
List<String> num = List.of("2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");
int index = 0;
map.put(index,"大王");
list.add(index);
index++;
map.put(index,"小王");
list.add(index);
for (String s : num) {
for (String s1 : huase) {
map.put(index,s+s1);
list.add(index);
index++;
}
}
Collections.shuffle(list);
ArrayList<Integer> wanjia1 = new ArrayList<>();
ArrayList<Integer> wanjia2 = new ArrayList<>();
ArrayList<Integer> wanjia3 = new ArrayList<>();
ArrayList<Integer> dipai = new ArrayList<>();
//发牌
for (int i = 0; i < list.size(); i++) {
Integer in = list.get(i);
if(i>=51){
dipai.add(in);
}else if(i%3==0){
wanjia1.add(in);
}else if(i%3==1){
wanjia2.add(in);
}else if(i%3==2){
wanjia3.add(in);
}
}
//排序
Collections.sort(wanjia1);
Collections.sort(wanjia2);
Collections.sort(wanjia3);
Collections.sort(dipai);
kanpai("wanjia1",map,wanjia1);
kanpai("wanjia2",map,wanjia2);
kanpai("wanjia3",map,wanjia3);
kanpai("dipai",map,dipai);
}
//看牌方法,提高代码复用性
public static void kanpai(String name,HashMap<Integer,String> map,List<Integer> list) {
System.out.println(name+": ");
for (Integer key : list) {
String s = map.get(key);
System.out.print(s+" ");
}
System.out.println();
}
}