一、Map集合概述
前面我们学的Collection接口下的集合,元素都是单个存储的,称为单列集合。
现实生活中,很多数据是成对存在的,比如: IP地址与主机名,身份证号与个人,学生与学号等。
这种一一对应的关系,叫做映射。 java中提供了Map集合 ,用于保存具有映射关系的数据,称为双列集合
二、特点
1.双列集合,存取无序、不重复、无索引
2.Map集合是一种键值对集合,每一个元素都有包含一个键对象(key)和一个值对象(vaule)。
3.Map集合中,键是不能重复的,值可以重复
4.键和值是对应的,通过键就可以找到所对应的值
三、常用方法
1.添加数据 put(key , value),输入想要添加的数据键和值
public class Demo01 { public static void main(String[] args) { Map<String , String> map = new HashMap<>(); map.put("杨过" , "小龙女"); map.put("郭靖", "刘亦菲"); map.put("景天" , "雪见"); map.put("郭靖" , "黄蓉"); System.out.println(map); } }
2.删除数据 remove(key)根据键来删除整个元素
public class Demo01 { public static void main(String[] args) { Map<String , String> map = new HashMap<>(); map.put("杨过" , "小龙女"); map.put("郭靖", "刘亦菲"); map.put("韦小宝" , "雪见"); map.put("郭靖" , "黄蓉"); map.remove("韦小宝"); System.out.println(map); } }
3.获取数据 get(key) 根据键获取数据
public class Demo01 { public static void main(String[] args) { Map<String , String> map = new HashMap<>(); map.put("杨过" , "小龙女"); map.put("郭靖", "刘亦菲"); map.put("韦小宝" , "雪见"); map.put("郭靖" , "黄蓉"); String s = map.get("郭靖"); System.out.println(s); } }
4.判断集合中是否包含指定的键 containsKey(key)
public class Demo01 { public static void main(String[] args) { Map<String , String> map = new HashMap<>(); map.put("杨过" , "小龙女"); map.put("郭靖", "刘亦菲"); map.put("韦小宝" , "雪见"); map.put("郭靖" , "黄蓉"); boolean wei = map.containsKey("韦小宝"); System.out.println(wei);//true } }
5.判断集合中是否包含指定的值containsValue(v)
public class Demo01 { public static void main(String[] args) { Map<String , String> map = new HashMap<>(); map.put("杨过" , "小龙女"); map.put("郭靖", "刘亦菲"); map.put("韦小宝" , "雪见"); map.put("郭靖" , "黄蓉"); boolean xiao = map.containsValue("小龙女"); System.out.println(xiao);//true } }
6.获取集合所有的键 keySet()
public class Demo01 { public static void main(String[] args) { Map<String , String> map = new HashMap<>(); map.put("杨过" , "小龙女"); map.put("郭靖", "刘亦菲"); map.put("韦小宝" , "雪见"); map.put("郭靖" , "黄蓉"); Set<String> strings = map.keySet(); System.out.println(strings);//[杨过, 韦小宝, 郭靖] } }
7.获取所有的值values()
public class Demo01 { public static void main(String[] args) { Map<String , String> map = new HashMap<>(); map.put("杨过" , "小龙女"); map.put("郭靖", "刘亦菲"); map.put("韦小宝" , "雪见"); map.put("郭靖" , "黄蓉"); //获取Map集合全部值 Collection<String> values = map.values(); System.out.println(values);//[小龙女, 雪见, 黄蓉] } }
8.判断集合是否为空 isEmpty()
public class Demo01 { public static void main(String[] args) { Map<String , String> map = new HashMap<>(); map.put("杨过" , "小龙女"); map.put("郭靖", "刘亦菲"); map.put("韦小宝" , "雪见"); map.put("郭靖" , "黄蓉"); //判断集合是否为空 boolean empty = map.isEmpty(); System.out.println(empty);//false } }
9.获取集合大小 size()
public class Demo01 { public static void main(String[] args) { Map<String , String> map = new HashMap<>(); map.put("杨过" , "小龙女"); map.put("郭靖", "刘亦菲"); map.put("韦小宝" , "雪见"); map.put("郭靖" , "黄蓉"); //获取集合大小 int i = map.size(); System.out.println(i); } }
10.清除集合里面所有的元素 clear()
public class Demo01 { public static void main(String[] args) { Map<String , String> map = new HashMap<>(); map.put("杨过" , "小龙女"); map.put("郭靖", "刘亦菲"); map.put("韦小宝" , "雪见"); map.put("郭靖" , "黄蓉"); map.clear(); System.out.println(map); } }
四、Map集合的遍历方法
1.第一种方法用keySet() 和 get()方法
1.先用keySet()方法获取所有的键 map.keySet()
2.再用增强for循环遍历集合,在通过get方法()用键获取对应的值
3.再把键和值输出
//1.遍历集合,并将序号与对应人名打印。 // Set<Integer> se = map.keySet(); // for (Integer key : se) { // String Value = map.get(key); // System.out.println(key + "----------------" + Value); // }
2.第二种方法获取键值对集合 entrySet();
1.通过map.entrySet()方法获取所有的键值对
2.然后遍历集合,再调用getKey()方法和getValue()方法获取所有的键和值
3.把键和值全部输出
//1.遍历集合,并将序号与对应人名打印。 Set<Map.Entry<Integer, String>> entries = map.entrySet(); for (Map.Entry<Integer, String> entry : entries) { Integer key = entry.getKey(); String value = entry.getValue(); System.out.println(key + "----------" + value); }
3.第三种方法使用forEach方法遍历集合
1.集合调用forEach方法,map.forEach 实现BiConsumer接口
//1.遍历集合,并将序号与对应人名打印。 map.forEach(new BiConsumer<Integer, String>() { @Override public void accept(Integer key, String value) { System.out.println(key + "---------" + value); } });
五、HashMap
1.特点:
无序,不重复,无索引
2.底层结构
在Jdk1.8之前是数组 + 链表(哈希表)
在Jdk1.8之后是数组 + 链表 + 红黑树(哈希表)
3.保证数据不重复
1.HashMap保证键是唯一不重复是依赖hashCode 和 equals 方法
2.如果是自定义类的话,想要保证键是唯一就必须要在类里面重写hashCode和equals方法
注意:如果存储的数据里面有两个数据的键是相同,值不相同的话,那么键是不会变得,但是值是会覆盖的
例如:现在集合里面添加的数据有两个数据的键是重复的,那么第一个张同学的值会被后面的张同学的值所覆盖掉,而最后输出集合的里面的数据只有两个:
("张同学" , "广东湛江") ,("李同学", "广东云浮")
public class StudentTest { public static void main(String[] args) { Map<Student ,String> map = new HashMap<>(); map.put(new Student("张同学"),"广东广州"); map.put(new Student("李同学"),"广东云浮"); map.put(new Student("张同学"),"广东湛江"); map.forEach(new BiConsumer<Student, String>() { @Override public void accept(Student student, String s) { System.out.println(student + "------" + s); } }); }
六、LinkHashMap
1.特点
存储有序,不重复,无索引
2.保证数据不重复
1.LinkHashMap保证键是唯一不重复是依赖hashCode 和 equals 方法
2.如果是自定义类的话,想要保证键是唯一就必须要在类里面重写hashCode和equals方法
3.底层结构
在Jdk1.8之前是数组 + 链表 +双链表(哈希表)
在Jdk1.8之后是数组 + 链表 + 红黑树 + 双链表(哈希表)
七、TreeMap
1. 特点
可以排序,不重复,无索引(TreeSet底层就是使用TreeMap实现存储的)
2. TreeMap的排序
1.使用无参构造器创建TreeMap集合,存入集合的键要实现Comparable接口<T>接口
2.使用有参构造器创建TreeMap集合,要实现Comparator<T>接口,并且指定排序规则
3. TreeMap底层结构
TreeMap的底层就是红黑树结构,可以对元素的键进行排序
4. TreeMap去重
在TreeMap中,每个键必须是唯一的,因此如果尝试向TreeMap中添加一个已经存在的键,则新的值会覆盖旧的值。这种特性使得TreeMap可以很方便地用来去重,因为只需将需要去重的元素作为键添加到TreeMap中,即可确保不会存在重复的元素。