Map集合
Posted hbwyh-myworld
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Map集合相关的知识,希望对你有一定的参考价值。
第一章 Map集合
1.1概述:
1).特点:
1).Map内部采用“键值对”的形式存储;
2).在一个Map内,“键”是唯一的;值可以重复;每个键只能对应一个值。
3).键和值可以是任何对象;
4).可以通过“键”获取对应的“值”;
1.2 常用子类:
Map(接口):双列集合:
|--HashMap(子类):键是“哈希表”结构:
|--LinkedHashMap(子类):键是“链表、哈希表”结构;
1.3 Map接口中定义的常用方法:
注意:Key和Value只能存放引用类型。
1).添加、修改:
public V put(K key,V value):存储一个键值对;
返回值:当存储一个已存在的键时,用新值替换旧值,并将旧值返回;如果键不存在,返回null。
2).删除:
public V remove(Object key):使用键删除对应的“键值对”,并将“值”返回。
3).查询:
public V get(K key):通过键,获取对应的值;
public int size():获取键值对的数量;
4).遍历:
注:Map本身没有遍历的方法,都是间接遍历;
1) 键找值:keySet(),将Map集合中的键放到Set集合中。
2) values(),将Map集合中的值放到Set集合中。
3).获取“键值对”的方式;entrySet()
1.4 集合遍历_键找值:
1).键找值:先获取Map中所有“键”的集合,然后在逐个根据每个键,获取对应的值。
2).示例代码:
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("美女", "马蓉");
map.put("绿巨人", "王宝强");
map.put("老王", "宋喆");
map.put("影帝", "黄渤");
//键找值:先获取所有“键"的集合
Set<String> keys = map.keySet();
//遍历所有键的集合
for (String key : keys) {
System.out.println(key + " , " + map.get(key));
}
}
1.5 集合遍历_键值对对象_Entry对象说明:
当我们向Map中存储键值对时,其实Map内部会将这个键值对封装到一个Entry对象中。
1.6 集合遍历_键值对对象:
1)常用方法:
获取对应键和对应值得方法:
public K getKey() :获取Entry对象中的键。
public V getValue() :获取Entry对象中的值。
获取Map集合中所有Entry对象的方法:
public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。
2).键值对对象:将所有的Entry对象封装到一个Set中,并返回;
3).示例代码:
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("美女", "马蓉");
map.put("绿巨人", "王宝强");
map.put("老王", "宋喆");
map.put("影帝", "黄渤");
//键值对对象
Set<Map.Entry<String, String>> es = map.entrySet();
//遍历所有的Entry
for (Map.Entry<String, String> e : es) {
String key = e.getKey();
String value = e.getValue();
System.out.println(key + " , " + value);
}
}
1.7 子类_HashMap的基本使用和使用自定义对象做键:
1).注意:自定义对象做键,必须重写hashCode()和equals()方法:
public class Student {
.....
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
2).测试类:
public static void main(String[] args) {
Map<Student,String> map = new HashMap<>();
map.put(new Student("张三", 18), "帅哥");
map.put(new Student("杨幂", 17), "美女");
map.put(new Student("杨幂", 17), "女神");
System.out.println(map.size());
System.out.println(map);
}
1.8 子类_LinkedHashMap的基本使用:
1). LinkedHashMap:它是Map的特例,有序的哈希表;
1.9 集合练习_计算每个字符出现的次数(多练):
1).题目:有以下字符串:
String str = "abccdabadebaabbf";
统计:a、b、c、d字符各出现多少次;
2).示例代码:
public static void main(String[] args) {
String str = "abccdabadebaabbf";
//1.定义一个Map存储计算结果
Map<Character,Integer> map = new HashMap<>();
//2.遍历字符串
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
// if (c >= ‘a‘ && c <= ‘d‘) {
//用c作键,到map中查找值
Integer value = map.get(c);
if (value == null) {
value = 1;
}else{
value++;
}
//将c和value重新put到map中
map.put(c, value);
// }
}
//3.验证结果
Set<Map.Entry<Character,Integer>> es = map.entrySet();
for (Map.Entry<Character, Integer> e : es) {
System.out.println(e.getKey() + " = " + e.getValue());
}
}
第二章:补充知识点
2.1 JDK9对集合添加的优化:
1).向集合添加元素:
ArrayList<String> list = new ArrayList<>();
list.add(...);
list.add(...);
...
2).JDK9的三个集合接口:List、Set、Map中都提供了一种静态方法:of( )
3).例如:
List<String> strList = List.of("张三","李四","王五","周六");
Set<String> strSet = Set.of("黄渤","黄老邪","黄磊","黄瓜");
Map<Character,Integer> map = Map.of(‘a‘,10,‘b‘,20,‘c‘,25);
4).注意:它们返回都是:(长度)不可变集合--不能再添加、删除元素;不能修改
public static void main(String[] args) {
List<String> list = List.of("张三", "李四", "王五");
System.out.println(list);
// list.add("周六");//运行时异常
// list.remove(0);//运行时异常
// list.set(0, "张三丰");//运行时异常
System.out.println(list);
}
注意:1:of()方法只是Map,List,Set这三个接口的静态方法,其父类接口和子类实现并没有这类方法,比如HashSet,ArrayList等待;
2:返回的集合是不可变的;
2.2 Debug追踪调试:
1).在要“暂停”的代码左侧,"行号的右边"--》鼠标单击,出现一个红点。
2).右键-->Debuge "xxxx.main()"
3).运行起来后,到达断点处,会自动暂停:
4).几个快捷键:
1).F8 : 单步执行,遇到方法调用,不进入方法体;
2).F9 : 结束单步执行;继续执行后面的代码,如果后面代码没有断点,直接将后续所有代码执行完毕;如果后面有断点,将在下一个断点处暂停;
3).F7 : 单步执行,遇到方法调用,进入到方法体;
第三章:综合案例
模拟斗地主洗牌发牌_案例介绍:
1).封装一副牌(54个字符串)
2).洗牌
3).发牌
4).看牌:要求每个人的牌面要从大到小排列:
抓到手:
?2,?2,小王,?2,大王,?2
看牌:
大王,小王,?2,?2,?2,?2
以上是关于Map集合的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin集合操作 ⑤ ( Map 集合 | 获取 Map 值 | Map 遍历 | 可变 Map 集合 )