美文网首页一些收藏
[Java]重学Java-Map

[Java]重学Java-Map

作者: AbstractCulture | 来源:发表于2022-04-13 10:34 被阅读0次

HashMap

关于HashMap的源码解析,笔者已经写过,这里不在重复介绍.

HashSet-集合

如果你需要判断一个集合中是否有重复的元素,那么HashSet就是最适合的集合类。

HashSet<Integer> hashSet = new HashSet<>();
hashSet.add(1);
hashSet.add(1);
hashSet.add(1);
hashSet.add(1);
System.out.println("当前集合中的元素个数为:" + hashSet.size());

当前集合中的元素个数为:1

  • 如果要访问集合中的元素,需要使用迭代器进行访问。
  • 对于插入集合中的元素,是不保证顺序性的。
  • 这里要注意一点,HashSet是依托HashMap实现去重的,如果我们往HashSet里存放的是对象,一定要记得重写hashCode和equals方法.

实现的原理

其实不用看很多,HashSet内部声明了一个HashMap类型的变量map,每次都委托HashMap做去重.

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;
    
    
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
    
    public boolean contains(Object o) {
        return map.containsKey(o);
    }
}

TreeMap-自然数排序的Map

TreeMap中的元素需要实现Comparable(我们平时使用的包装类型自己帮我们实现了),这里我们尝试乱序插入,然后看看输出的结果

TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(1, "我是1");
treeMap.put(3, "我是3");
treeMap.put(2, "我是2");
treeMap.forEach((k, v) -> System.out.println(k + "," + v));
  • 输出结果
1,我是1
2,我是2
3,我是3

可以看到,key按照compare比较后的结果进行了排序.

LinkedHashMap-插入有序的Map

前面我们了解到,HashMap是无序的,但是某些场景下,我们希望元素按照插入的顺序进行读取,这个时候你就可以用上LinkedHashMap.
LinkedHashMap内部使用了一个双向链表维护了key的顺序性.

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
{
    /**
     * The head (eldest) of the doubly linked list.
     */
    transient LinkedHashMap.Entry<K,V> head;

    /**
     * The tail (youngest) of the doubly linked list.
     */
    transient LinkedHashMap.Entry<K,V> tail;

    /**
     * The iteration ordering method for this linked hash map: <tt>true</tt>
     * for access-order, <tt>false</tt> for insertion-order.
     *
     * @serial
     */
    final boolean accessOrder;
    // 省略
}

HashMap留了几个方法给子类进行扩展:

// Callbacks to allow LinkedHashMap post-actions
void afterNodeAccess(Node<K,V> p) { }
void afterNodeInsertion(boolean evict) { }
void afterNodeRemoval(Node<K,V> p) { }

有兴趣了解原理的,这里提供一下链接,文章只做简单的演示(因为用的确实不多,而且八股文考试很少考):
彻底理解HashMap及LinkedHashMap

  • Demo
LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("我是第一个", "111");
linkedHashMap.put("我是第二个", "222");
linkedHashMap.put("我是第三个", "333");
linkedHashMap.forEach((k, v) -> System.out.println(k + ":" + v));
  • 输出结果
我是第一个:111
我是第二个:222
我是第三个:333

可以看到,我们以什么顺序插入,就按什么顺序输出了结果。

总结

  • Map 是一种将对象(而非数字)与对象相关联的设计,也就是key-value。
  • HashMap 专为快速访问而设计,而 TreeMap 保持键始终处于排序状态,所以没有 HashMap 快。 LinkedHashMap 按插入顺序保存其元素,但使用散列提供快速访问的能力.

相关文章

  • [Java]重学Java-Map

    HashMap 关于HashMap的源码解析,笔者已经写过,这里不在重复介绍. HashSet-集合 如果你需要判...

  • Java-Map

    TreeMap TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或...

  • JAVA-Map 详解

    1Map Map 定义了键值存储的数据操作的接口, 主要用于键值的存储,使用键可以得到值,并且不允许重复的键,值可...

  • Java-map使用

    代码如下: 结果如下 原文链接 https://www.cnblogs.com/gongxr/p/7777717....

  • java-Map相关方法

    一、map转化list、 二、遍历map 三、根据map的key排序 输出:排序之前:[1=一, 2=二, 3=三...

  • 重学Java

    为什么要学 首先是Java应用广泛,Java无疑是应用最广泛的一门语言,不仅可以开发桌面型应用,也可以开发Web应...

  • java重学之路

    工作了几年 把java的很多基本知识已经忘了 今天开始java的重新学习 整理些基本资料 以备翻阅 2017年06...

  • 重学java系列

    背景 毕业已经一年,面向业务编程也已经一年,期间学习了一本新的jvm语言。但回过头来看,自己刚入门java的时候,...

  • [Java]重学Java-继承

    复用 随着码代码的时间增长,程序员会越发需要"复用"这个能力,比如最简单的对String类进行判空: 我们需要每次...

  • [Java]重学Java-集合

    容器 很多时候,我们写程序需要进行批量的操作,比如说,新增一批学生列表.那么就需要有容器来装下这10个对象。Jav...

网友评论

    本文标题:[Java]重学Java-Map

    本文链接:https://www.haomeiwen.com/subject/lvaosrtx.html