java Map双列集合
单列集合:一次只能添加一个元素
双列集合:一次添加两个元素,左边的叫键(唯一的不能重复),右边叫值(可以重复),键和值一一对应。这样一对叫:键值对/键值对对象/在Java中叫:Entry
Map常见API
Map是个接口,不能直接new Map,要new其实现类的对象
put方法的细节:有两个作用添加和覆盖
- 在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合当中,返回null。
- 在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,并把被覆盖的值进行返回。
remove方法:删除后会返回对应的值。
Map遍历方式
三种:键找值、键值对、lambda表达式
键找值
先获取所有的键,放到单列集合里面,再使用get方法,依次获取每个键对应的值
public class A02_MapDemo2 {public static void main(String[] args) {//Map集合的第一种遍历方式//三个课堂练习:////练习一: 利用键找值的方式遍历map集合,要求:装着键的单列集合使用增强for的形式进行遍历//练习二: 利用键找值的方式遍历map集合,要求:装着键的单列集合使用迭代器的形式进行遍历//练习三: 利用键找值的方式遍历map集合,要求:装着键的单列集合使用lambda表达式的形式进行遍历//1.创建Map集合的对象Map<String,String> map = new HashMap<>();//2.添加元素map.put("尹志平","小龙女");map.put("郭靖","穆念慈");map.put("欧阳克","黄蓉");//3.通过键找值//3.1获取所有的键,把这些键放到一个单列集合当中Set<String> keys = map.keySet();//3.2遍历单列集合,得到每一个键for (String key : keys) {//System.out.println(key);//3.3 利用map集合中的键获取对应的值 getString value = map.get(key);System.out.println(key + " = " + value);}}
}
键值对
依次获取map里的键值对,通过get方法再依次获取里面的键和值
package com.itheima.a01mymap;import java.util.HashMap;
import java.util.Map;public class A03_MapDemo3 {public static void main(String[] args) {//Map集合的第二种遍历方式//三个课堂练习:////练习一: 通过键值对对象进行遍历map集合,要求:装着键值对对象的单列集合使用增强for的形式进行遍历//练习二: 通过键值对对象进行遍历map集合,要求:装着键值对对象的单列集合使用迭代器的形式进行遍历//练习三: 通过键值对对象进行遍历map集合,要求:装着键值对对象的单列集合使用lambda的形式进行遍历//1.创建Map集合的对象Map<String, String> map = new HashMap<>();//2.添加元素//键:人物的外号//值:人物的名字map.put("标枪选手", "马超");map.put("人物挂件", "明世隐");map.put("御龙骑士", "尹志平");/* //3.Map集合的第二种遍历方式//通过键值对对象进行遍历//3.1 通过一个方法获取所有的键值对对象,返回一个Set集合Set<Map.Entry<String, String>> entries = map.entrySet();//3.2 遍历entries这个集合,去得到里面的每一个键值对对象for (Map.Entry<String, String> entry : entries) {//entry ---> "御龙骑士","尹志平"//3.3 利用entry调用get方法获取键和值String key = entry.getKey();String value = entry.getValue();System.out.println(key + "=" + value);}*///3.Map集合的第二种遍历方式//通过键值对对象进行遍历//3.1 通过一个方法获取所有的键值对对象,返回一个Set集合//3.2 遍历entries这个集合,去得到里面的每一个键值对对象for (Map.Entry<String, String> entry : map.entrySet()) {//entry ---> "御龙骑士","尹志平"//3.3 利用entry调用get方法获取键和值String key = entry.getKey();String value = entry.getValue();System.out.println(key + "=" + value);}}
}
lambda表达式
package com.itheima.a01mymap;import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;public class A04_MapDemo4 {public static void main(String[] args) {//Map集合的第三种遍历方式//1.创建Map集合的对象Map<String,String> map = new HashMap<>();//2.添加元素//键:人物的名字//值:名人名言map.put("鲁迅","这句话是我说的");map.put("曹操","不可能绝对不可能");map.put("刘备","接着奏乐接着舞");map.put("柯镇恶","看我眼色行事");//3.利用lambda表达式进行遍历//底层://forEach其实就是利用第二种方式进行遍历,依次得到每一个键和值//再调用accept方法map.forEach(new BiConsumer<String, String>() {@Overridepublic void accept(String key, String value) {System.out.println(key + "=" + value);}});System.out.println("-----------------------------------");map.forEach((String key, String value)->{System.out.println(key + "=" + value);});System.out.println("-----------------------------------");map.forEach((key, value)-> System.out.println(key + "=" + value));}
}
HashMap
特点:是Map的实现类。无序,不重复,无索引都是指键。HashMap和HashSet的底层是一样的,都是哈希表结构
创建时,在底层创建一个长度为16,默认加载因子为0.75的数组,再利用put方法就可以添加数据了,put方法底层首先创建一个Entry对象,记录要添加的键和值,利用键计算哈希值(与要添加的值无关),确定要存入的数组索引,存入即可,如果该位置已经有元素,则调用equals方法比较键的属性值,如果键里的数据一样,那么覆盖原有的Entry,键不一样则(jdk8以后)则挂在原来元素下面(链表),当链表长度超过8且数组长度>=64,则下面的链表自动转为红黑树。
LinkedHashMap
有序,不重复,无索引指的是键。有序是指:存取元素顺序一致
底层原理:底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序。每添加一个元素在它们之间形成一个双向链表。
TreeMap
TreeMap和TreeSet底层一样的,都是红黑树结构
键:不重复,无索引,可排序(是指对键可排序)默认按照键从小到大排列,也可以自己指定键排序规则。
排序规则实现方法:1实现comparable接口。2创建集合时传递comparator比较器对象