目录
双列集合的特点
1、双列集合一次需要存一对数据,分别为键和值
2、键不能重复,值可以重复 1双列集合一次需要存一对数据,分别为键和值2键不能重复,值可以
重复
3、键和值是一一对应的,每一个键只能找到自己对应的值 3键和值是一一对应的,每一个键只能找到自己对应的值
4、键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象” 4键+值这个整体我们称之为“键值对”或者“键值对对象”,在中叫做“Entry对象”
Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的
| 方法名称 | 说明 |
| v put(k key,v value) | 添加元素 |
| v remove(object key) | 根据键删除键值对元素 |
| void clear() | 移除所有的键值对元素 |
| boolean containsKey(object key) | 判断集合是否包含指定的键 |
| boolean containsValue(object value) | 判断集合是否包含指定的值 |
| boolean isEmpty() | 判断集合是否为空 |
| int size() | 集合的长度,也就是集合中键值对的个数 |
示例:
- //创建map集合,
- Map<String,String> map = new HashMap();
- //添加元素
- map.put("张三","123");
- map.put("李四","456");
- map.put("王五","789");
- System.out.println(map);
- System.out.println("_________________");
- //根据键删除键值对元素
- map.remove("张三");
- System.out.println(map);
- //判断集合是否包含指定的键
- boolean flag = map.containsKey("张三");
- System.out.println(flag);
- //判断集合是否包含指定的值
- boolean b = map.containsValue("456");
- System.out.println(b);
- //判断集合是否为空
- boolean empty = map.isEmpty();
- System.out.println(empty);
- //集合的长度,也就是集合中键值对的个数
- int size = map.size();
- System.out.println(size);
- //移除所有的键值对元素
- map.clear();
- System.out.println(map);
1、键找值
示例:
- //创建map集合,
- Map<String,String> map = new HashMap();
- //添加元素
- map.put("张三","123");
- map.put("李四","456");
- map.put("王五","789");
- //获取所有的键放在单列集合里
- Set<String> stringSet = map.keySet();
- //遍历单列集合,得到每一个键
- for (String key : stringSet) {
- //通过键找到对应的值
- String value = map.get(key);
- System.out.println(key + "=" + value);
- }
- System.out.println("-------------");
- //通过迭代器遍历
- Iterator<String> iterator = stringSet.iterator();
- while (iterator.hasNext()){
- String key = iterator.next();
- String value = map.get(key);
- System.out.println(key + "=" + value);
- }
- System.out.println("-------------");
- //通过Lambda表达式遍历
- stringSet.forEach(s -> {
- //通过键找到对应的值
- String value = map.get(s);
- System.out.println(s + "=" + value);
- });
2、通过键值对
示例:
- //创建map集合,
- Map<String,String> map = new HashMap();
- //添加元素
- map.put("张三","123");
- map.put("李四","456");
- map.put("王五","789");
- //获取所有键值对放入一个集合
- Set<Map.Entry<String, String>> entries = map.entrySet();
- //增强for遍历集合
- for (Map.Entry<String, String> entry : entries) {
- String key = entry.getKey();
- String value = entry.getValue();
- System.out.println(key + "=" + value);
- }
- System.out.println("-----------------");
- //迭代器遍历
- Iterator<Map.Entry<String, String>> iterator = entries.iterator();
- while (iterator.hasNext()){
- Map.Entry<String, String> next = iterator.next();
- System.out.println(next);
- }
- System.out.println("-----------------");
- //lambda表达式遍历
- entries.forEach(Entry -> {
- System.out.println(Entry);
- });
3、lambda表达式
示例:
- //创建map集合,
- Map<String,String> map = new HashMap();
- //添加元素
- map.put("张三","123");
- map.put("李四","456");
- map.put("王五","789");
- //匿名内部类
- map.forEach(new BiConsumer<String, String>() {
- @Override
- public void accept(String s, String s2) {
- System.out.println(s + "=" + s2);
- }
- });
- 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的特点
1、HashMap是Map里面的一个实现类。
2、没有特有方法,直接使用Map里面的方法就可以了。
3、特点都是由键决定的:无序、不重复、无索引
4、HashMap跟HashSet底层原理是一模一样的,都是哈希表结构
5、HashMap底层是哈希表结构的
6、依赖hashcode方法和equals方法保证键的唯一
7、如果键存储的是自定义对象,需要重写hashCode和equals方法如果值存储自定义对象,不需要
重写hashCode和equals方法
HashMap练习,统计投票数
- //创建map集合,
- Map<String,Integer> map = new HashMap();
- //添加元素;定义四个景点
- List<String> list = new ArrayList<>();
- String [] array = {"A","B","C","D"};
- //定义票数
- Random random = new Random();
- for (int i = 0; i < 40; i++) {
- int index = random.nextInt(array.length);
- list.add(array[index]);
- }
-
- for (String name : list) {
- //判断当前景点是否在map集合中
- if (map.containsKey(name)){
- //存在
- //先获取当前经典的票数
- int count = map.get(name);
- //景点票数加1
- count++;
- //再放回集合中
- map.put(name,count);
- }else {
- //不存在
- map.put(name,1);
- }
- }
- //求最大值
- int max = 0;
- Set<Map.Entry<String, Integer>> entries = map.entrySet();
- for (Map.Entry<String, Integer> entry : entries) {
- int count = entry.getValue();
- if (count>max){
- max = count;
- }
- }
- //判断那个景点票数最多,并打印
- for (Map.Entry<String, Integer> entry : entries) {
- int count = entry.getValue();
- if (count == max){
- System.out.println(entry.getKey());
- }
- }
- System.out.println(map);
由键决定:有序、不重复、无索引。
这里的有序指的是保证存储和取出的元素顺序一致
原理:底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储
的顺序。
示例:
- //创建集合,
- LinkedHashMap<String,Integer> linkedHashMap = new LinkedHashMap<>();
- //添加元素
- linkedHashMap.put("a",1);
- linkedHashMap.put("a",2);
- linkedHashMap.put("c",3);
- linkedHashMap.put("d",4);
- //打印集合
- System.out.println(linkedHashMap);
TreeMap跟TreeSet底层原理一样,都是红黑树结构的。
由键决定特性:不重复、无索引、可排序
可排序:对键进行排序。
注意:默认按照键的从小到大进行排序,也可以自己规定键的排序规则
代码书写两种排序规则
1、实现Comparable接口,指定比较规则。
2、创建集合时传递Comparator比较器对象,指定比较规则。
示例:
- //创建集合,
- TreeMap<Integer,String> treeMap = new TreeMap<>(new Comparator<Integer>() {
- @Override
- public int compare(Integer o1, Integer o2) {
- //o1表示当前要添加的元素
- //o2表示已在红黑树存在的元素
- //实现倒序
- return o2-o1;
- }
- });
- //添加元素
- treeMap.put(5,"a");
- treeMap.put(4,"b");
- treeMap.put(3,"c");
- treeMap.put(2,"d");
- treeMap.put(1,"e");
- //打印
- System.out.println(treeMap);