Java Map集合
2023-12-29 15:32:48
1Map集合
1.1 Map集合的介绍
- java.util.Map<K,V> 集合,里面保存的数据是成对存在的,称之为双列集合。存储的数据,我们称为键值对。 之前所学的Collection集合中元素单个单个存在的,称为单列集合
1.2 特点
-
Map<K,V> K:键的数据类型;V:值的数据类型
-
特点 :
- 键不能重复,值可以重复
- 键和值是 一 一 对应的,通过键可以找到对应的值
- (键 + 值) 一起是一个整体 我们称之为“键值对” 或者 “键值对对象”,在Java中叫做“Entry对象”
-
使用场景
- 凡是要表示一一对应的数据时就可以Map集合
- 举例 : 学生的学号和姓名 — (itheima001 小智)
- 举例 : 夫妻的关系 ---- (王宝强 马蓉 ) (谢霆锋 张柏芝)
- 凡是要表示一一对应的数据时就可以Map集合
1.3 常用实现类
- HashMap:
- 此前的HashSet底层实现就是HashMap完成的,HashSet保存的元素其实就是HashMap集合中保存的键,底层结构是哈希表结构,具有键唯一,无序,特点。
- LinkedHashMap:
- 底层结构是有链表和哈希表结构,去重,有序
- TreeMap:
- 底层是有红黑树,去重,通过键排序
1.4 常用的方法
- public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。
- public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
- public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
- public Set keySet(): 获取Map集合中所有的键,存储到Set集合中。
- public boolean containKey(Object key):判断该集合中是否有此键。
1.5 Map集合的遍历
public class MapDemo1 {
public static void main(String[] args) {
//创建Map集合
Map<String,String> map = new HashMap<>();
//向map集合中存储元素(key、value)
map.put("javaee","JavaEE从门到放弃");
map.put("php","Php从门到放弃");
map.put("mysql","Mysql从门到放弃");
map.put("java","Java从门到放弃");
System.out.println(map);
//删除map集合中的元素(根据key元素名字删除)
if (map.containsKey("java")){
map.remove("java");
}
//获取map集合中的value元素
String mysql=map.get("mysql");
System.out.println(mysql);
}
}
遍历map
第一种:
public class MapDemo2 {
public static void main(String[] args) {
//创建Map集合
Map<String,String> map = new HashMap<>();
//添加元素
map.put("yuwen","语文");
map.put("math","数学");
map.put("english","英语");
map.put("daode","道德");
//遍历:先获取到所有的key元素, 遍历所有的key元素, 通过key找到value
//1、先获取到所有的key元素
Set<String> keys = map.keySet();
//2、遍历所有的key元素
for (String key:keys){
//3、通过key找到value
String value=map.get(key);
System.out.println("key="+key +" , value="+value);
}
}
}
第二种:
public class MapDemo3 {
public static void main(String[] args) {
//创建Map集合
Map<String, String> map = new HashMap<>();
//添加元素
map.put("yuwen","语文");
map.put("math","数学");
map.put("english","英语");
map.put("daode","道德");
//遍历:先获取到所有的键值对对象(Map.Entry), 遍历所有的键值对对象, 通过键值对对象(Map.Entry)分别获取 key、value
//1、先获取到所有的键值对对象(Map.Entry)
Set<Map.Entry<String,String>> entries=map.entrySet();
//2、遍历所有的键值对对象
for (Map.Entry<String,String> entry:entries){
//3、通过键值对对象(Map.Entry)分别获取 key、value
String key=entry.getKey();
String value=entry.getValue();
System.out.println("key="+key+" , value="+value);
}
}
}
1.6 HashMap集合
- 注意 : HashMap集合 , 要想保证键唯一 , 那么键所在的类必须重写hashCode和equals方法
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
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 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);
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
/**
* 注意 : HashMap集合 , 要想保证键唯一 , 那么键所在的类必须重写hashCode和equals方法
*/
public class MapDemo4 {
public static void main(String[] args) {
//创建map集合对象
HashMap<Student, String> studentMap = new HashMap<>();
//添加元素( key元素 : 自定义对象 )
studentMap.put(new Student("zs", 23), "北京");
studentMap.put(new Student("ls", 24), "上海");
studentMap.put(new Student("zs", 23), "北京"); //学生对象中的内容是重复的
//遍历集合
Set<Student> keys = studentMap.keySet();
for (Student key : keys) {
System.out.println( key +" --- " + studentMap.get(key));
}
}
}
运行的结果:
Student{name='ls', age=24} --- 上海
Student{name='zs', age=23} --- 北京
1.7LinkedHashMap集合
- LinkedHashMap类 , 在最底层采用的数据结构 : 是链表+哈希表。
- 特点 :
- 元素唯一
- 元素有序
public class LinkedHashMapDemo1 {
public static void main(String[] args) {
LinkedHashMap<String,String> map = new LinkedHashMap<>();
//添加元素
map.put("周瑜","小乔");
map.put("孙策","大乔");
map.put("刘备","孙尚香");
map.put("诸葛亮","黄月英");
map.put("周瑜","小乔2");
//遍历
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println( key +" ---- "+ value);
}
}
}
1.8TreeMap集合
-
TreeMap的底层是红黑树实现的,有排序的能力,键去重。
-
可以自然排序(键所在的类要实现Comparable)
-
若自定义类没有自然排序功能,或自然排序功能不满足要求时。可以自定义比较器排序(Comparator)
public class TreeMapDemo1 {
public static void main(String[] args) {
// 定义TreeMap集合存储键值对,键使用Integer,值使用String
// 创建集合对象
TreeMap<Integer,String> treeMap = new TreeMap<>();
treeMap.put(1,"lisus");
treeMap.put(2,"zhangshan");
treeMap.put(3,"wangwu");
System.out.println(treeMap);
}
}
/*
需求:创建一个TreeMap集合,键是学生对象(Student),值是籍贯(String)。
学生属性姓名和年龄, 要求按照年龄进行升序排序并遍历
*/
public class TreeMapTest2 {
public static void main(String[] args) {
// 学生作为键, 家庭住址作为值。
TreeMap<Student, String> tm = new TreeMap<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();
}
});
tm.put(new Student("迪丽热巴", 18), "新疆");
tm.put(new Student("迪丽热巴", 16), "中国");
System.out.println(tm);
}
}
2集合嵌套
2.1List嵌套List
public class Test3 {
public static void main(String[] args) {
List<String> gradeThreeClassOne = new ArrayList<>();
gradeThreeClassOne.add("threeClassOne1");
gradeThreeClassOne.add("threeClassOne2");
gradeThreeClassOne.add("threeClassOne3");
List<String> gradeThreeClassTwo = new ArrayList<>();
gradeThreeClassTwo.add("threeClassTwo1");
gradeThreeClassTwo.add("threeClassTwo2");
gradeThreeClassTwo.add("threeClassTwo3");
List<String> gradeThreeClassThree = new ArrayList<>();
gradeThreeClassThree.add("threeClassThree1");
gradeThreeClassThree.add("hreeClassThree2");
gradeThreeClassThree.add("hreeClassThree3");
List<List<String>> grades = new ArrayList<>();
grades.add(gradeThreeClassOne);
grades.add(gradeThreeClassTwo);
grades.add(gradeThreeClassThree);
for (List<String> grade:grades){
for (String name:grade){
System.out.println(name);
}
System.out.println("-----------------");
}
}
}
2.2List嵌套Map
/*
List嵌套Map :
使用场景举例:一年级有多个班级,每个班级有多名学生。要求保存每个班级的学生姓名,姓名有与之对应的学号,保存一年级所有的班级信息。
思路:
1 可以使用Map集合保存一个班级的学生(键是学号,值是名字)
2 可以使用List集合保存所有班级
因此我们可以定义集合如下:
班级:Map<String,String> 键是学号,值是姓名
举例 :
Map<String,String> 一班 = {it001 = 迪丽热巴 , it002 = 古力娜扎 ,it003 = 马尔扎哈 ,it004 = 欧阳娜娜}
Map<String,String> 二班 = {it001 = 李小璐 , it002 = 白百何 , it003 = 马蓉}
Map<String,String> 三班 = {it001 = 林丹 ,it002 = 文章, it003 = 陈赫}
年级:List<Map<String,String>>保存每个班级的信息
举例 :
List<Map<String,String>> 年级 = {一班 , 二班 , 三班}
*/
public class ListNestingMapDemo {
public static void main(String[] args) {
Map<String, String> clases1 = new HashMap<>();
clases1.put("it001", "张1");
clases1.put("it002", "张2");
clases1.put("it003", "张3");
clases1.put("it004", "张4");
Map<String, String> clases2 = new HashMap<>();
clases2.put("it001", "w1");
clases2.put("it002", "bbh");
clases2.put("it003", "mr");
Map<String, String> clases3 = new HashMap<>();
clases3.put("it001", "ld");
clases3.put("it002", "wz");
clases3.put("it003", "ch");
//在List集合中存储Map集合
List<Map<String,String>> grade =new ArrayList<>();
}
}
2.3Map嵌套Map
public class MapNestingMapDemo {
public static void main(String[] args) {
Map<String, String> classes1 = new HashMap<>();
classes1.put("it001", "dlrb");
classes1.put("it002", "glnz");
classes1.put("it003", "mezh");
classes1.put("it004", "oynn");
Map<String, String> classes2 = new HashMap<>();
classes2.put("it001", "lxl");
classes2.put("it002", "bbh");
classes2.put("it003", "mr");
Map<String, String> classes3 = new HashMap<>();
classes2.put("it001", "ld");
classes2.put("it002", "wz");
classes2.put("it003", "ch");
//Map集合中存储Map集合
Map<String, Map<String, String>> grade = new HashMap<>();
grade.put("一班", classes1);
grade.put("二班", classes2);
grade.put("三班", classes3);
}
}
文章来源:https://blog.csdn.net/lisus2007/article/details/135289445
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!