Java Map集合:键值对操作全解析
·
Hello,大家好呀,我是Yize!今天我们开始学习Map集合(双列集合),至于上次说的数据结构,我们后面在说!!
现在,我们开始:
目录
双列集合的特点及常用API
双列集合的特点:
①双列集合一次需要存一对数据,分别为键和值
②键不能重复,值可以重复
③ 键和值是一一对应的,每一个键只能找到自己对应的值
④键+值这个整体我们称之为“键值对”或者“键值对对象” ,在Java中叫做"Entry对象”
Map常用API:

其中put方法
添加数据时,如果键不存在,那么直接将键值对对象添加到map集合中,方法返回null
如果键存在,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回
Map集合的三种遍历方式
键找值
Map<String,String> map = new HashMap<>();
map.put("灰太狼","红太狼");
map.put("武大郎","潘金莲");
map.put("贾乃亮","李小璐");
//键找值
/将map中的键拿出来装进Set集合中/
Set<String> str = map.keySet();
//迭代器遍历集合
Iterator<String> it = str.iterator();
while(it.hasNext()){
String i = it.next();
/利用get方法获取当前键的值/
String s = map.get(i);
System.out.println(i + "=" + s);
}
键值对
Map<String,String> map = new HashMap<>();
map.put("灰太狼","红太狼");
map.put("武大郎","潘金莲");
map.put("贾乃亮","李小璐");
//键值对
/利用map集合调用entrySet方法,获取所有键值对的对象,放入Set集合当中/
Set<Map.Entry<String, String>> entry = map.entrySet();
for (Map.Entry<String, String> en : entry) {
String s1 = en.getKey();
String s2 = en.getValue();
System.out.println(s1 + "=" + s2);
}
Lambda表达式
Map<String,String> map = new HashMap<>();
map.put("郭靖","小龙女");
map.put("武大郎","潘金莲");
map.put("贾乃亮","李小璐");
//lambda表达式遍历Map集合
map.forEach(( key, value) -> System.out.println(key + "=" + value));
Map分支
HashMap
特点:
① HashMap是Map里面的一个实现类。
②没有额外需要学习的特有方法,直接使用Map里面的方法就可以了。
③特点都是由键决定的: 无序、 不重复、 无索引
④ HashMap跟HashSet底层原理是一模一样的,都是 哈希表结构
注意点:HashMap的键位置如果存的是 自定义对象,需要重写 hashCode和 equals方法
LinkedHashMap
特点:有序,不重复,无索引
原理:底层数据依然是哈希表,只是每个键值对元素又额外多了一个双链表的机制记录存储的顺序(与LinkedHashSet类似)
TreeMap
特点:可排序,不重复,无索引
对键进行排序,默认从小到大排序
原理:与TreeSet类似,底层数据结构都是红黑树
与TreeSet一样,有两种排序规则:
- 实现Comparable接口,指定比较比较
- 创建集合对象的时候,传递Comparator比较器对象,指定规则比较
经典例题:
统计一个字符串里每个字符出现的次数,按次数进行排序
//统计字符串中每个字符出现的次数,按照字符出现次数排序
String str = "ahvxldhbvlzshdvhbhaklanhaj";
//统计每个字符出现的次数
TreeMap<Character,Integer> tr = new TreeMap<>();
for (int i = 0; i < str.length(); i++) {
char s = str.charAt(i);
if(tr.containsKey(s)){
int count = tr.get(s);
tr.put(s,count+1);
}else{
tr.put(s,1);
}
}
//再次创建一个TreeMap,利用tr调用get()获取键对应的值,进行排序
TreeMap<Character,Integer> tr2 = new TreeMap<>((o1,o2)->tr.get(o2)-tr.get(o1));
tr2.putAll(tr);
//遍历tr2,将字符和出现次数添加到StringBuilder中
StringBuilder sb = new StringBuilder();
for (Character key : tr2.keySet()) {
sb.append(key).append("出现了").append(tr2.get(key)).append("次").append("\n");
}
System.out.println(sb);
注意点:
- 在第一个TreeMap中无法进行传递Comparator进行指定规则,因为获取不到集合
- 在第二个TreeMap集合中,利用get()方法获取到键所对应的值从而进行比较
好啦,本期的学习到此结束,我们下次见!!!
更多推荐




所有评论(0)