java双列集合

本文详细探讨了Java中的双列集合,包括Map的特点、常见API及HashMap与TreeMap的源码解析。HashMap是无序且不重复的,而TreeMap基于红黑树实现,支持排序。在添加元素时,HashMap会覆盖已存在的键值对,而TreeMap则依据键进行排序。此外,文章还提到了可变参数和集合工具类Collections的相关知识。
摘要由CSDN通过智能技术生成

双列集合

键值对对象(Entry)

特点:

1.双列集合一次需要存一堆数据,分别为键和值

2.键不能重复,值可以重复

3.键和值是一一对应的,每个键只能找到自己对应的值

4.键+值这个整体,我们称之为“键值对”或者“键值对象”,在Java中叫做“Entry对象”

体系结构

Map --> HashMap 、 TreeMap --> LinekedHashMap(继承子HashMap)

Map中常见的API

put( K \ V) 添加元素

remove(object key) 删除键值对元素

clear 移除所有的键值对元素

containsKey(object key) 判断集合是否包含指定的键

containsValue(Object value) 判断集合是否包含指定的值

isEmpty 判断集合是否为空

size 集合的长度,也就是集合中键值对的个数

put方法

再添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合中,返回null,如果键是存在的,则会把原有的键值对覆盖,会返回被覆盖的值

remove方法

返回值是被删除的键值对的值

Map的遍历方式

1.通过键找值的方式遍历

public static void main(String[] args) {
        HashMap<String, String> m = new HashMap<>();
        m.put("11" , "55");
        m.put("22" , "66");
        m.put("33" , "77");
        m.put("44" , "88");
        // 1. 使用迭代器遍历
        // 1. 1 将Map中的所有的键存入到一个单列集合
        Set<String> hs = new HashSet<>();
        hs = m.keySet();
        Iterator<String> it = hs.iterator();
        while (it.hasNext()){
           String s = it.next();
            System.out.println(s + "-" + m.get(s));
        }
        // 2. 使用增强for遍历
        for (String h : hs) {
            System.out.println(h + "-" + m.get(h));
        }
        // 3. 使用lambda表达式遍历
        hs.forEach(h -> System.out.println(h + "-" + m.get(h)));
    }

2.通过键值对对象遍历

// 1. 迭代器方式遍历
        Set<Map.Entry<String, String>> entries = m.entrySet();
        Iterator<Map.Entry<String, String>> it = entries.iterator();
        Map.Entry e = null;
        while (it.hasNext()){
            e = it.next();
            System.out.println(e.getKey() + "++" + e.getValue());
        }
        // 2.增强for循环遍历
        for (Map.Entry<String, String> sse : m.entrySet()) {
            System.out.println(sse.getKey() + "--" + sse.getValue());
        }
        // 3. lambda遍历
        entries.forEach(entry -> System.out.println(entry.getKey() + "//" + entry.getValue()));
​

3.Map的遍历方式(lambda表达式)

forEach(BiConsumer< ? super K , ? super V> action) 结合lambda遍历Map集合

 entries.forEach(entry -> System.out.println(entry.getKey() + " +++" + entry.getValue()));

HashMap

是Map的实现类

键:无序、不重复(会覆盖原有的entry对象)、无索引

HashMap跟HashSet底层原理是一样的,都是哈希表结构(根据键计算出hash值即可)

依赖HashCode和equals方法保证键的唯一(如果键存储的是自定义对象)

LinkedHashMap:是HashMap的子类

由键决定:有序、不重复、无索引

保证存储和取出的元素顺序一致

原理:底层数据结构依然是哈希表,只是每个键值对元素有额外的多了一个双链表的机制记录存储的顺序

TreeMap(底层基于红黑树实现排序,增删改查性能较好)

底层和tree底层原理一样,都是红黑树结构

由键决定特性:不重复、无索引、可排序

可排序:对键进行排序

默认按照键从小到大进行排序,也可以自己规定键的排序规则

实现:Comparable接口,指定比较规则

创建集合时传递Comparator比较器对象,指定比较规则

如果两种方式都存在,则主要以第二种方式比较

// TreeMap默认按照键升序,同时可以降序(需自己制定)
 TreeMap<Integer, String> isl = new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
// 简化后的lambda
// 此为降序算法
//TreeMap<Integer, String> isl = new TreeMap<>((Integer o1, Integer o2) -> o2 - o1);
        Set<Map.Entry<Integer, String>> entries = isl.entrySet();
​
        isl.put(22435 , "23333");
        isl.put(234123 , "2222");
        isl.put(1223 , "233333333");
        entries.forEach(s -> System.out.println(s.getKey() + " +++" + s.getValue()));
    }
​
// TreeMap自定义排序规则
public int compareTo(Student o) {
        //this:表示当前要添加的元素
        //o:表示已经在红黑树中存在的元素
        //返回值
        //负数:表示当前要添加的元素是小的,存左边
        //正数:表示当前要添加的元素是大的,存右边
        //0:表示相同,舍弃
        // 比较的逻辑
    i = this.getAge() - o.getAge() ?
        return this.getAge() - o.getAge();
    }

利用map集合进行统计(K表示要统计的内容 - V 表示次数)

如果对结果不要求排序,默认使用HashMap

如果要求结果排序,使用TreeMap

// 统计字符出现次数 
// 1.定义需要统计的字符串
        String str = "giughiuahzzzzzzzzzzziasighuraghpoiaygreugasjhgfmzxkhigoai";
        // 2. 创建集合用来接收数据
        TreeMap<Character , Integer> tm = new TreeMap<>();
        // 3. 将转换成char的字符串诸葛放入集合
        for (int i = 0; i < str.length(); i++) {
            char a = str.charAt(i);
           if(tm.containsKey(a)){
                Integer count = tm.get(a);
                System.out.println(count);
                count += 1;
                tm.put(a , count);
            }else{
                tm.put(a , 1);
            }
        }
        System.out.println(tm);

String拼接字符串(在map的基础上进行拼接)

 //StringBuilder拼接字符串用法
        StringBuilder sb =
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值