目录
Map接口是作为所有双列集合的父接口, map特点是 1) 没有索引概念 2) 键唯一,值不唯一
HashMap特点
1. 底层是哈希表结构, 增删快, 查询快
2. 键是唯一的, 值可以重复
3. 键值中可以存null, 但不建议, 容易混淆
4. 没有索引概念
5. 自定义对象作为键时候, 要重写它的hashcode和equals方法
构造方法
创建空的hashMap, 初始长度为16, 负载因子0.75
HashMap<String,Integer> hashMap = new HashMap<>();
常用方法
hashMap继承的抽象类中重写了toString方法, 因此hashMap也可以完成直接打印输出集合内容
增:
1.put(K key, V value): 返回被覆盖的value值, 如果之前没有相同key对象, 则返回null
HashMap<String,Integer> hashMap = new HashMap<>();
//添加 向hashmap中添加数据
hashMap.put("张三",29);
hashMap.put("李四",27);
hashMap.put("赵六",31);
//返回添加后 被覆盖的值内容 表中没有返回null
Integer i1 = hashMap.put("王五",25);
删:
2.remove(K key): 删除指定键的key和value, 返回删除的value值
Integer i2 = hashMap.remove("李四");
System.out.println("删除李四和对应的值:"+i2);
3.remove(K key, V value): 根据指定的key和value进行匹配并删除返回true, 没有匹配到返回false
boolean result = hashMap.remove("李四", 30);
System.out.println("删除map中年龄30岁的李四, 是否查询到并删除:"+result);
改:
4.replace(K key,V value): 修改key的值为value, 无返回值
hashMap.replace("张三",15);
System.out.println("修改后的map:"+hashMap);
5.replace(K key, V oldValue, V newValue): 将key的oldValue修改成newValue, 返回boolean结果
boolean result2 = hashMap.replace("赵六", 31, 20);
System.out.println("将31岁的赵六年龄修改为20, 返回结果:"+result2);
System.out.println("修改后的map:"+hashMap);
查:
6.get(K key): 获取key对应的value值
map里只能通过键找值, 通过传入的键返回对应的值. 如果不存在返回null , 存在 返回值
为什么不能通过值找键???
一个键对应一个值, 但一个值可能多个键, 不满足一一映射的关系, 不确定找哪个键
Integer i3= hashMap.get("王五");
System.out.println("找到key为王五的内容值为:"+i3);
7.containsKey(Object key): 判断hashMap的键中有没有key, 返回boolean结果
boolean r1 = hashMap.containsKey("张三");
8.containsValue(Object value): 判断hashMap的值中有没有value, 返回boolean结果
boolean r2 = hashMap.containsValue(20);
9.values(): 返回map集合中的所有值到Collection集合中
Collection<Integer> values = hashMap.values();
遍历
方式一: 使用keySet()
将hashMap中所有的key封装到hashSet集合中, 通过每次获取set集合中的key,返回对应的值
HashMap<String,Integer> hashMap = new HashMap<>();
hashMap.put("张三",29);
hashMap.put("李四",27);
hashMap.put("赵六",31);
//将key统一存在set集合中 , 通过set中的key去找对应的value
Set<String> set1 = hashMap.keySet();
for (String s : set1) {
Integer value = hashMap.get(s);
System.out.println("hashmap的key是:"+s+",value是:"+value);
}
方式二: 使用entrySet()方法
将key和value封装成一个entry键值对, 存放在set中, 通过entry对象调用getKey,getValue方法遍历
Set<Map.Entry<String, Integer>> entrySet = hashMap.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {
System.out.println("hashmap的key是:"+entry.getKey()+",hashmap的value是:"+entry.getValue());
}
方式三: 直接将所有的valule放进Collection中
System.out.println("直接将所有的value放进Collection中");
Collection<Integer> values = hashMap.values();
System.out.println(values);
LinkedHashMap特点
1. 数据结构: 哈希表+链表
2. 键唯一, 值可以重复
3. 存入取出顺序相同
4. 没有索引概念
应用(计算字符串中字符的个数)
System.out.println("请输入字符串:");
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
//1.将字符串拆分成字符
char[] chars = str.toCharArray();
//2.创建存放字符包装类和String类的hashMap
HashMap<Character,Integer> hashMap = new HashMap<>();
//3.遍历字符数组, 如果hashMap中含有该字符, 在其值的基础上+1
//如果没有该字符, 则存储, 值为1
for (char c : chars) {
if (hashMap.containsKey(c)){
hashMap.put(c,hashMap.get(c)+1);
}else {
hashMap.put(c,1);
}
}
//4.遍历打印key 和 value
for (Map.Entry<Character, Integer> entry : hashMap.entrySet()) {
System.out.println(entry.getKey()+"字符的个数:"+entry.getValue());
}