Map集合
Map 接口概述
Map接口是双列集合,它的每个元素都包含一个键对象(key)和一个值对象(value),对象之间存在一种对应关系,称为映射。
访问元素时,只要指定了 key 就能找到对应的value。
将键映射到值的对象,一个映射不能包含重复的键,每个键最多指引映射到一个值。
Map 子类
HashMap:哈希表结构:
LinkedHashMap:链表、哈希表结构:
TreeMap:树结构
以上Map接口的各种”数据结构”全部是针对”键”有效,跟”值”无关;
Map接口中常用集合概述
通过查看 Map 接口描述,看到 Map 有多个子类,这里我们主要讲解常用的 HashMap集合、LinkedHashMap 集合。
HashMap
Map接口中的常用方法
- put方法:将指定的键与值对应起来,并添加到集合中,方法返回值为键所对应的值
- 使用 put 方法时,若指定的键(key)在集合中不存在,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;
- 使用 put 方法时,若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。
- get方法:获取指定键(key)所对应的值(value)
- remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value)。
示例代码
public class Test05 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建Map对象
Map<String, String> map = new HashMap<String, String>();
//给map 中添加元素
map.put("001", "小红");
map.put("002", "小黄");
map.put("003", "小绿");
//通过键取值
System.out.println(map.get("001"));
//删除
String value = map.remove("001");
System.out.println(value); // 王五
//输出Map
System.out.println(map);
}
}
Map集合遍历键找值方式
键找值方式:即通过元素中的键,获取键所对应的值
操作步骤与图解:
1. 获取Map集合中所有的键,由于键是唯一的,所以返回一个 Set集合存储所有的键
2. 遍历键的Set集合,得到每一个键
3. 根据键,获取键所对应的值
示例代码
public class Test06 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, String> map = new HashMap<String, String>();
// 给map 中添加元素
map.put("111", "王五");
map.put("112", "李四");
map.put("113", "赵六");
map.put("114", "田七");
Set<String> k = map.keySet();
for (String str : k) {
System.out.println(str + map.get(str));
}
}
}
Entry 键值对对象
在Map类设计时,提供了一个嵌套接口 Entry。
Entry 将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历 Map 集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。
static interface Map.Entry
Map集合遍历键值对方式
键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。
步骤
- 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。
- 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象
- 通过键值对(Entry)对象,获取Entry 对象中的键与值。
示例代码
public class Test07 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, String> map = new HashMap<String, String>();
// 给map 中添加元素
map.put("111", "王五");
map.put("112", "李四");
map.put("113", "赵六");
map.put("114", "田七");
Set<Entry<String, String>> hs = map.entrySet();
for (Entry<String, String> entry : hs) {
System.out.println(entry.getKey()+entry.getValue());
}
Iterator<Map.Entry<String, String>> it = hs.iterator();
while(it.hasNext()){
Map.Entry<String,String> entry = it.next();
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
}
}
注意:Map 集合不能直接使用迭代器或者 foreach 进行遍历。但是转成 Set 之后就可以使用了。
HashMap 存储自定义类型键值
练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到map集合中。学生作为键, 家庭住址作为值。
注意,学生姓名相同并且年龄相同视为同一名学生。
示例代码
class Student {
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.getName() + this.getAge() +"";
}
}
class Compare implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
int n1 = o1.getName().compareTo(o2.getName());
int n2 = (n1 == 0 ? o2.getAge() - o1.getAge(): n1);
return n2;
}
}
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Student, String> map = new TreeMap<>(new Compare());
map.put(new Student("小明", 18), "地球");
map.put(new Student("小红", 13), "火星");
map.put(new Student("小蓝", 14), "金星");
map.put(new Student("小蓝", 14), "金星");
map.put(new Student("小绿", 13), "海王星");
Set<Student> s = map.keySet();
for (Student stu : s) {
System.out.print(stu);
System.out.println(map.get(stu));
}
}
}
TreeMap
二叉树原理保证键唯一,键是可按照指定顺序排序的
1. 使用TreeMap会对”键”进行排序;
2. 所以,作为”键”的对象,必须实现两种比较的方式之一;
示例代码
public class Test08 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.实例化一个 TreeMap
TreeMap<String,String> map = new TreeMap<>();
//2.填充集合
map.put("004", "刘亦菲");
map.put("002", "张学友");
map.put("001", "刘德华");
map.put("003", "高圆圆");
//3.遍历
Set<String> keys = map.keySet();
for(String key : keys){
System.out.println(key + "," + map.get(key));
}
}
}
TreeMap 统计字符串出现次数
代码示例
import java.util.HashMap;
import java.util.Set;
/*
* "aababcabcdabcde",获取字符串中每一个字母出现的次数
*/
public class Test04 {
public static void main(String[] args) {
// TODO Auto-generated method stub
HashMap<Character, Integer> map = new HashMap<>();
String str = "aababcabcdabcde";
char[] chars = str.toCharArray();
for (char c : chars) {
if(!map.containsKey(c)){
map.put(c, 1);
}else{
map.put(c, map.get(c)+1);
}
}
StringBuffer sb = new StringBuffer();
Set<Character> keys = map.keySet();
for (Character ch : keys) {
sb.append(ch).append("(").append(map.get(ch)).append(")");
}
System.out.println(sb);
}
}