双列集合的特点
①双列集合一次需要存一对数据,分别为键和值
②键不能重复,值可以重复
③键和值是一一对应的,每一个键只能找到自己对应的值
④键+值这个整体我们称之为"键值对"或者"键值对对象",在Java中叫做"Entry对象"
Map常见的API
map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的

Map集合的遍历方式
①键找值
步骤分析:
1.获取所有键的集合。用keySet()方法实现
2.遍历键的集合,获取到每一个键。用增强for实现
3.根据键去找值。用get(Object key)方法实现
java
public class MapDemo01 {
public static void main(String[] args) {
//创建集合对象
Map<String, String> map = new HashMap<String, String>();
//添加元素
map.put("张无忌", "赵敏");
map.put("郭靖", "黄蓉");
map.put("杨过", "小龙女");
//获取所有键的集合。用keySet()方法实现
Set<String> keySet = map.keySet();
//遍历键的集合,获取到每一个键。用增强for实现
for (String key : keySet) {
//根据键去找值。用get(Object key)方法实现
String value = map.get(key);
System.out.println(key + "," + value);
}
}
}
②键值对
步骤分析:
1.获取所有键值对对象的集合
Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合
2.遍历键值对对象的集合,得到每一个键值对对象
用增强for实现,得到每一个Map.Entry
3.根据键值对对象获取键和值
用getKey()得到键
用getValue()得到值
③Lambda表达式

HashMap
HashMap的特点
①HashMap是Map里面的一个实现类
②特点有键决定:无序、不重复、无索引
③HashMap的底层原理是哈希表结构
④依赖hashCode方法和equals方法保证键的唯一
⑤如果键要存储的是自定义对象,需要重写hashCode和equals方法
java
public class A02_HashMapDemo2 {
public static void main(String[] args) {
/*
某个班级80名学生,现在需要组成秋游活动,
班长提供了四个景点依次是(A、B、C、D),
每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。
*/
//1.需要先让同学们投票
//定义一个数组,存储4个景点
String[] arr = {"A","B","C","D"};
//利用随机数模拟80个同学的投票,并把投票的结果存储起来
ArrayList<String> list = new ArrayList<>();
Random r = new Random();
for (int i = 0; i < 80; i++) {
int index = r.nextInt(arr.length);
list.add(arr[index]);
}
//2.如果要统计的东西比较多,不方便使用计数器思想
//我们可以定义map集合,利用集合进行统计。
HashMap<String,Integer> hm = new HashMap<>();
for (String name : list) {
//判断当前的景点在map集合当中是否存在
if(hm.containsKey(name)){
//存在
//先获取当前景点已经被投票的次数
int count = hm.get(name);
//表示当前景点又被投了一次
count++;
//把新的次数再次添加到集合当中
hm.put(name,count);
}else{
//不存在
hm.put(name,1);
}
}
System.out.println(hm);
//3.求最大值
int max = 0;
Set<Map.Entry<String, Integer>> entries = hm.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
int count = entry.getValue();
if(count > max){
max = count;
}
}
System.out.println(max);
//4.判断哪个景点的次数跟最大值一样,如果一样,打印出来
for (Map.Entry<String, Integer> entry : entries) {
int count = entry.getValue();
if(count == max){
System.out.println(entry.getKey());
}
}
}
}
LinkedHashMap
由键决定:有序、不重复、无索引 (有序:保证存储和取出的顺序一致)
原理:哈希表,没和键值对元素额外多了一个双链表的机制记录存储的顺序
java
public class A01_LinkedHashMapDemo1 {
public static void main(String[] args) {
//1.创建集合
LinkedHashMap<String,Integer> lhm = new LinkedHashMap<>();
//2.添加元素
lhm.put("c",789);
lhm.put("b",456);
lhm.put("a",123);
lhm.put("a",111);
//3.打印集合
System.out.println(lhm);
}
}
TreeMap
特点:
1.底层原理:红黑树结构
2.由键决定特性:不重复、无索引、可排序 (可排序:对键进行排序)
3.默认按诈骗间的从小到大啊进行排序,也可以自己规定键的排序规则
代码书写的两种排序规则:
实现Comparable接口,指定比较规则
创建集合是传递Comparator比较器对象,指定比较规则
java
public class A01_TreeMapDemo1 {
public static void main(String[] args) {
/*
TreeMap集合:基本应用
需求1:
键:整数表示id
值:字符串表示商品名称
要求1:按照id的升序排列
要求2:按照id的降序排列
*/
//1.创建集合对象
//Integer Double 默认情况下都是按照升序排列的
//String 按照字母再ASCII码表中对应的数字升序进行排列
//abcdefg ...
TreeMap<Integer,String> tm = new TreeMap<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//o1:当前要添加的元素
//o2:表示已经在红黑树中存在的元素
return o2 - o1;
}
});
//2.添加元素
tm.put(5,"可恰可乐");
tm.put(4,"雷碧");
tm.put(3,"九个核桃");
tm.put(2,"康帅傅");
tm.put(1,"粤利粤");
//3.打印集合
System.out.println(tm);
}
}