Map集合
![](https://i-blog.csdnimg.cn/blog_migrate/428e8f6b78b9f471cc4e412e08211953.png)
1.Map的介绍
1.概述:是双列集合的顶级接口
2.元素特点:
元素都是由key(键),value(值)组成 -> 键值对
2.HashMap的介绍和使用
1.概述:HashMap是Map的实现类
2.特点:
a.key唯一,value可重复 -> 如果key重复了,会发生value覆盖
b.无序
c.无索引
d.线程不安全
e.可以存null键null值
3.数据结构:
哈希表
4.方法:
V put(K key, V value) -> 添加元素,返回的是
V remove(Object key) ->根据key删除键值对,返回的是被删除的value
V get(Object key) -> 根据key获取value
boolean containsKey(Object key) -> 判断集合中是否包含指定的key
Collection<V> values() -> 获取集合中所有的value,转存到Collection集合中
Set<K> keySet()->将Map中的key获取出来,转存到Set集合中
Set<Map.Entry<K,V>> entrySet()->获取Map集合中的键值对,转存到Set集合中
public class Demo01HashMap {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
String value1 = map.put("猪八", "嫦娥");
System.out.println(value1);
String value2 = map.put("猪八", "高翠兰");
System.out.println(value2);
System.out.println(map);
map.put("后裔","嫦娥");
map.put("二郎神","嫦娥");
map.put("唐僧","女儿国国王");
map.put("涛哥","金莲");
map.put(null,null);
System.out.println(map);
String value3 = map.remove("涛哥");
System.out.println(value3);
System.out.println(map);
System.out.println(map.get("唐僧"));
System.out.println(map.containsKey("二郎神"));
Collection<String> collection = map.values();
System.out.println(collection);
}
}
1.概述:LinkedHashMap extends HashMap
2.特点:
a.key唯一,value可重复 -> 如果key重复了,会发生value覆盖
b.有序
c.无索引
d.线程不安全
e.可以存null键null值
3.数据结构:
哈希表+双向链表
4.使用:和HashMap一样
public class Demo02LinkedHashMap {
public static void main(String[] args) {
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("八戒","嫦娥");
map.put("涛哥","金莲");
map.put("涛哥","三上");
map.put("唐僧","女儿国国王");
System.out.println(map);
}
}
3.HashMap的两种遍历方式
3.1.方式1:获取key,根据key再获取value
Set<K> keySet()->将Map中的key获取出来,转存到Set集合中
public class Demo03HashMap {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("猪八", "嫦娥");
map.put("猪八", "高翠兰");
map.put("后裔","嫦娥");
map.put("二郎神","嫦娥");
map.put("唐僧","女儿国国王");
map.put("涛哥","金莲");
Set<String> set = map.keySet();
for (String key : set) {
System.out.println(key+".."+map.get(key));
}
}
}
3.2.方式2:同时获取key和value
![](https://i-blog.csdnimg.cn/blog_migrate/86d0c6fbc4008076bf49024bbc5536c6.png)
Set<Map.Entry<K,V>> entrySet()->获取Map集合中的键值对,转存到Set集合中
public class Demo04HashMap {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("猪八", "嫦娥");
map.put("猪八", "高翠兰");
map.put("后裔","嫦娥");
map.put("二郎神","嫦娥");
map.put("唐僧","女儿国国王");
map.put("涛哥","金莲");
Set<Map.Entry<String, String>> set = map.entrySet();
for (Map.Entry<String, String> entry : set) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"..."+value);
}
}
}
1.Map存储自定义对象时如何去重复
public class Person {
private String name;
private Integer age;
public Person() {
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name) && Objects.equals(age, person.age);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
public class Demo05HashMap {
public static void main(String[] args) {
HashMap<Person, String> map = new HashMap<>();
map.put(new Person("涛哥",18),"河北省");
map.put(new Person("三上",26),"日本");
map.put(new Person("涛哥",18),"北京市");
System.out.println(map);
}
}
如果key为自定义类型,去重复的话,重写hashCode和equals方法,去重复过程和set一样一样的
因为set集合的元素到了底层都是保存到了map的key位置上
2.Map的练习
需求:用Map集合统计字符串中每一个字符出现的次数
步骤:
1.创建Scanner和HashMap
2.遍历字符串,将每一个字符获取出来
3.判断,map中是否包含遍历出来的字符 -> containsKey
4.如果不包含,证明此字符第一次出现,直接将此字符和1存储到map中
5.如果包含,根据字符获取对应的value,让value++
6.将此字符和改变后的value重新保存到map集合中
7.输出
![](https://i-blog.csdnimg.cn/blog_migrate/e694720bcecf26acd7b60303d0fb59d7.png)
public class Demo06HashMap {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HashMap<String, Integer> map = new HashMap<>();
String data = sc.next();
char[] chars = data.toCharArray();
for (char aChar : chars) {
String key = aChar+"";
if (!map.containsKey(key)){
map.put(key,1);
}else{
Integer value = map.get(key);
value++;
map.put(key,value);
}
}
System.out.println(map);
}
}
3.斗地主_Map版本
![](https://i-blog.csdnimg.cn/blog_migrate/44d124be35872205e58a626d918d0d36.png)
public class Demo07Poker {
public static void main(String[] args) {
String[] color = "♠-♥-♣-♦".split("-");
String[] number = "2-3-4-5-6-7-8-9-10-J-Q-K-A".split("-");
HashMap<Integer, String> poker = new HashMap<>();
ArrayList<Integer> list = new ArrayList<>();
list.add(0);
list.add(1);
int key = 2;
for (String num : number) {
for (String huaSe : color) {
String pokerNumber = huaSe+num;
poker.put(key,pokerNumber);
list.add(key);
key++;
}
}
poker.put(0,"😊");
poker.put(1,"☺");
Collections.shuffle(list);
ArrayList<Integer> p1 = new ArrayList<>();
ArrayList<Integer> p2 = new ArrayList<>();
ArrayList<Integer> p3 = new ArrayList<>();
ArrayList<Integer> dipai = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
Integer key1 = list.get(i);
if (i>=51){
dipai.add(key1);
}else if (i%3==0){
p1.add(key1);
}else if (i%3==1){
p2.add(key1);
}else if (i%3==2){
p3.add(key1);
}
}
Collections.sort(p1);
Collections.sort(p2);
Collections.sort(p3);
Collections.sort(dipai);
lookPoker("涛哥",p1,poker);
lookPoker("三上",p2,poker);
lookPoker("金莲",p3,poker);
lookPoker("大郎",dipai,poker);
}
private static void lookPoker(String name, ArrayList<Integer> list, HashMap<Integer, String> map) {
System.out.print(name+":");
for (Integer key : list) {
String value = map.get(key);
System.out.print(value+" ");
}
System.out.println();
}
}