首页 > 编程语言 >java-集合类学习

java-集合类学习

时间:2023-06-27 21:12:00浏览次数:37  
标签:java int 学习 put maxSize 集合 hash public LinkedHashMap

LinkedHashMap

A special constructor is provided to create a linked hash map whose order of iteration is the order in which its entries were last accessed, from least-recently accessed to most-recently (access-order).
This kind of map is well-suited to building LRU caches. Invoking the put, putIfAbsent, get, getOrDefault, compute, computeIfAbsent, computeIfPresent, or merge methods results in an access to the corresponding entry (assuming it exists after the invocation completes). The replace methods only result in an access of the entry if the value is replaced.

这里的注释说了 , 由于特殊的构造方法可以使得初始化进来的map 可以保持当初的位置, 这个特点, 让 LinkedHashMap 非常适合实现 LRU caches

LinkedHashMap 继承 HashMap , 同时重写了 newNode 方法 , LinkedHashMap 本身没有 put 方法 , 使用的是父类 HashMap , 然后在 putget 方法都使用前后双向链表连接 , 使得它可以知道元素的前后顺序 .

使用 LinkedHashMap 实现一个 LRU

import java.util.LinkedHashMap;
import java.util.Map;

public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int maxSize;

    public LRUCache(int maxSize) {
        super(maxSize, 0.75f, true);
        this.maxSize = maxSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > maxSize;
    }
}

在LRUCache的构造函数中,调用了LinkedHashMap的构造函数并传入了三个参数:maxSize、0.75f和true。其中,maxSize表示缓存的最大容量,0.75f表示负载因子,true表示按照访问顺序排序。

在LRUCache中重写了removeEldestEntry方法,当LRUCache中的元素数量超过maxSize时,removeEldestEntry方法会返回true,从而触发LinkedHashMap自动移除最老的元素。

通过使用LRUCache类,可以方便地实现LRU缓存功能。例如,可以使用以下代码创建一个最大容量为10的LRU缓存:

LRUCache<String, String> cache = new LRUCache<>(10);

然后,可以使用put方法向缓存中添加元素,使用get方法从缓存中获取元素,LRUCache会自动维护缓存中元素的顺序。

TreeMap & TreeSet

TreeMap是有序的 ,就是外表表现的是一个 Map 但是是有序的 , 看下面的例子学习一下

 public void test1 (){
        SortedMap<Integer, String> treeMap = new TreeMap<>();
        // 添加元素
        treeMap.put(3, "C");
        treeMap.put(1, "A");
        treeMap.put(4, "D");
        treeMap.put(2, "B");

        // 遍历元素
        for (Map.Entry<Integer, String> entry : treeMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }


运行方法后的结果 : 
1: A
2: B
3: C
4: D

TreeMap查询写入的时间复杂度多少?其key对象为什么必须要实现Compare接口、如何用它实现一致性哈希

TreeMap 底层是红黑树 , 所以他的平均时间复杂度为 O(log(n)) ,空间复杂度为 O(n) ,key对象为什么必须要实现Compare接口用于比较大小 ,方便插入到红黑树算法里面

一致性hash算法 : 是一种将数据分布到多个节点的算法,它可以在节点的增减或者故障时,最小化数据的迁移量。一致性哈希算法的核心思想是将节点和数据都映射到一个环上,然后根据节点在环上的位置来划分数据的范围。

结题思路 : 主要考虑它的增删改查

import java.util.SortedMap;
import java.util.TreeMap;

public class ConsistentHash<T> {
    private final SortedMap<Integer, T> circle = new TreeMap<>();
    private final HashFunction hashFunction;
    private final int numberOfReplicas;

    public ConsistentHash(HashFunction hashFunction, int numberOfReplicas, Iterable<T> nodes) {
        this.hashFunction = hashFunction;
        this.numberOfReplicas = numberOfReplicas;

        for (T node : nodes) {
            addNode(node);
        }
    }

    public void addNode(T node) {
        for (int i = 0; i < numberOfReplicas; i++) {
            int hash = hashFunction.hash(node.toString() + i);
            circle.put(hash, node);
        }
    }

    public void removeNode(T node) {
        for (int i = 0; i < numberOfReplicas; i++) {
            int hash = hashFunction.hash(node.toString() + i);
            circle.remove(hash);
        }
    }

    public T get(Object key) {
        if (circle.isEmpty()) {
            return null;
        }

        int hash = hashFunction.hash(key.toString());
        if (!circle.containsKey(hash)) {
            SortedMap<Integer, T> tailMap = circle.tailMap(hash);
            hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();
        }

        return circle.get(hash);
    }

    public interface HashFunction {
        int hash(String key);
    }
}

参考资料

标签:java,int,学习,put,maxSize,集合,hash,public,LinkedHashMap
From: https://www.cnblogs.com/Benjious/p/17509930.html

相关文章

  • linux命令学习-目录大小du
    du命令:显示目录包含的文件大小du可以让我们知道文件和目录所占的空间大小du命令会深入遍历每个目录的子目录,统计所有文件的大小是英语diskusage的缩写,表示“磁盘使用/占用”-h以Ko,Mo,Go的形式显示文件大小-a会显示目录和文件的大小-s只显示当前目录的总大小......
  • 「学习笔记」基环树
    众所周知,一棵有\(n\)个节点的树有\(n-1\)条边,树上没有环。据此,明显的,对于一个有\(n\)个结点\(n\)条边的无向连通图,必定是在一棵树上的任意两个节点之间连一条边构成的。我们把\(n\)个节点\(n\)条边的无向连通图,就称为基环树。基环树上存在环,因此基环树它不是树,而......
  • JAVA判断是否是IDEA里启动
      /***判断是否是idea里面启动*@returntrue:是false:否*/privatestaticbooleancheckRunInIDEA(){try{Class.forName("com.intellij.rt.execution.application.AppMainV2");returntrue;}cat......
  • java8多线程使用示例
    使用CompletableFuture.allOf实现异步执行同步搜集结果/***@authorwjq*@create2022-03-1216:19*/publicclassTestCompleteFuture{privatestaticfinalintcorePoolSize=10;//核心线程数privatestaticfinalint......
  • 机器学习.周志华《12 计算学习理论 》
     基础知识计算学习理论(computationallearningtheory)是通过“计算”来研究机器“学习“的理论,其目的是分析学习任务的困难本质。例如:在什么条件下可进行有效的学习,需要多少训练样本能获得较好的精度等,从而为机器学习算法提供理论保证。几个基本概念回顾:泛化误差:学习器在总体上的......
  • 莫比乌斯反演 学习笔记
    炫酷反演魔术!莫反会用到的具体性质证明先不写,先写题。与其说是学习笔记,不如说是简要的题解集合。不太想贴太多代码啊,翻起来很烦。P3455[POI2007]ZAP-Queries很基础的一道题。令\(a\leb\),考虑\(k=1\)的情况。\[\begin{aligned}ans&=\sum\limits_{i=1}^a\sum\limits_{j=......
  • Java第三阶段题目集总结
    一、前言这一阶段的题目集主要课程成绩设计的迭代,在这一题目里主要用到了正则表达式,准确来说正则表达式在这一题里占据十分重要的位置。这一阶段还考查到了数据结构的内容,像是栈和队列的使用。同时还涉及到了map和set数组的使用。在这一阶段我学到了许多新的知识,也对前面所学的内......
  • 嘿 Siri,有没有「三天速成深度学习」的课程?
    「嘿Siri,有没有三天速成NLP的课程?」「很抱歉,我没有找到任何和『有没有三天速成NLP的课程?』有关的内容。」最近老能在朋友圈刷到「X 天学会Python,从此大专吊打博士生,工资蹭蹭往上升,抛弃Excel不是梦」。我们的耐心,正在变得越来越短。前段时间,外卖骑手配送时间从系统中消失的......
  • Maven构建项目后项目报Error错误Java compiler level does not match the version of
     Maven构建项目后项目报Error错误JavacompilerleveldoesnotmatchtheversionoftheinstalledJavaprojectfac 项目->右键->Properties->ProjectFacets->修改facets中Java版本(下拉箭头出)为要用的版本Maven构建项目需注意1.项目右键->Properties->buildpath->jdk2.项......
  • Java静态导入(import static)需谨慎
    从Java5开始引入了静态导入语法(importstatic),其目是为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序。我们先来看一个不使用静态导入的例子,也就是一般导入:publicclassMathUtils{//计算圆面积publicstaticdoublecalCircleArea(doubler){ret......