IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> map 集合的特征以及遍历方式以及TreeMap介绍 -> 正文阅读

[数据结构与算法]map 集合的特征以及遍历方式以及TreeMap介绍

目录

TreeMap

Map接口的遍历方式


我们知道, map 接口是双列 , 底下三个实现类 hashMap, TreeMap , HashTable

hashMap 可参考:hashMap底层实现解析(负载因子0.75,初始容量16,键不重复)_xx12321q的博客-CSDN博客

? ? ? ?hashTable 底层同 hashMap相同, 但是它在大部分方法上加了synchronized锁,是线程安全的(但是键不能存放null值)

最后就是TreeMap(键采用红黑树存储)

TreeMap

? ? ? TreeMap 中所有的元素都保持着某种固定的顺序,如果需要得到一个有序的 Map 就应该使用TreeMap key 值所在类必须实现 Comparable 接口。例:
TreeMap<String,String> treeMap = new TreeMap<>();
treeMap.put("b","2");
treeMap.put("c","3");
treeMap.put("d","4");
treeMap.put("a","10");
System.out.println(treeMap);

结果 :?

? ? ? ?我们可以看到, TreeMap根据键的顺序来为我们已经排好了序 , 我们这里的键是String, 而String已经实现了Comparable接口, 并重写了compareTo()方法,所以这里按照字母顺序排列

? ? ? ?但是如果我们使用了自己定义的类, 并没有实现Comparable接口?,这样是不能put的

public class User {      //自定义一个User类

    private Integer id;
    private String account;
    private String sex;

    public User(){}

    public User(Integer id, String account, String sex) {
        this.id = id;
        this.account = account;
        this.sex = sex;
    }
}
TreeMap<User,String> treeMap = new TreeMap<>();
User user = new User();
treeMap.put(user,"abc");

结果

?可以看到,直接会报出 ClassCastException(类加载异常)

? ? ? ? 所以我们使用TreeMap的时候,键必须要实现Comparable接口重写compareTo()方法来传入我们自己定义的排序规则, 例 :

// 实现Comparable接口,传入类型
public class User implements Comparable<User>{

    private Integer id;
    private String account;
    private String sex;

    public User() {
    }

    public User(Integer id, String account, String sex) {
        this.id = id;
        this.account = account;
        this.sex = sex;
    }

    @Override
    public int compareTo(User user) {   //可以自定义排序规则
        return 0;
    }
}

介绍完特征,我们来看 put() 方法的部分源码,这里就不完全展示了

?可以看到 , 这就是TreeMap的有序性

需要注意的是, TreeMap并不能存储 null 的键,而hashMap可以

Map接口的遍历方式

先建立一个Map , 以hashMap为例

Map<String,String> map = new HashMap<>();
map.put("a","1");
map.put("f","12");
map.put("q","123");
map.put("w","1234");
map.put("b","12345");

? 方式一 :? 先将所有key(键) 存到一个set 集合中(使用keySet()方法),然后遍历set集合 ,通过key拿到value ,例 :

Set<String> set = map.keySet();      //拿到所有的键
Iterator<String> iterator = set.iterator();   //拿到set的迭代器
while (iterator.hasNext()){           //循环遍历 
      System.out.println(map.get(iterator.next()));  //通过get()拿值
}

结果 :?

?

方式二 : 通过entrySet() 方法,直接拿到底层存储键值对的对象, 返回到set 集合中,然后遍历set集合

通过Entry类里的方法遍历,例:

Set<Map.Entry<String, String>> entrySet = map.entrySet();  //拿到底层entry
for (Map.Entry<String, String> entry : entrySet) {
    System.out.println("key:"+entry.getKey()+"::  value:"+entry.getValue());
}

结果 :?

方式三 : 流遍历

map.forEach(new BiConsumer<String, String>() {
     @Override
     public void accept(String s, String s2) {
          System.out.println(s+"::"+s2);
     }
});

结果:?

?以上就是map 遍历的三种方式

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:48:16  更:2022-03-08 22:51:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:50:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码