面试-阿里社招笔试题两则(二)----基于hashMap实现LRU缓存

面试官:如何用LinkedHashMap实现LRU 上一篇文章分析了HashMap的原理,有网友留言想看LinkedHashMap分析,今天它来了。 LinkedHashMap是HashMap的子类,在原有HashMap数据结构的基础上,它还维护着一个双向链表链接所有entry,这个链表定义了迭代顺序,通常是数据插入的顺序。 上图我只画了链表,其实红黑树节点也是一样的,只是节点类型不一样而已 也就是说我们遍历LinkedHashMap的时候,是从... 阅读详情

基于HashMap实现LRU缓存

单线程环境下,实现LRU缓存,不可以通过 LinkedHashMap 来实现。

LinkedHashMap 本身实现了LRU存储方式,可以通过定义初始容量和重写
boolean removeEldestEntry(Map.Entry<K,V> eldest) 方式来实现,这里不采用这种方式。我感觉需要考虑比较多的地方就是各种边界值吧,本身的算法实现来说,没有太高的复杂度。

代码实现:

package com.lhc.cache;

import java.util.HashMap;
import java.util.LinkedHashMap;

/**
 * @description:
 * @author: hjt
 * @create: 2020-06-01 14:05
 */

public class LRUCache<K, V> {
    private final int MAX_CACHE_SIZE;
    private Node first;
    private Node last;

    private HashMap<K, Node<K, V>> hashMap;

    public LRUCache(int cacheSize) {
        MAX_CACHE_SIZE = cacheSize;
        hashMap = new HashMap<K, Node<K, V>>();
    }

    public void put(K key, V value) {
        Node node = hashMap.get(key);
        if (node == null) {
            if (hashMap.size() >= MAX_CACHE_SIZE) {
                hashMap.remove(last.key);
                removeLast();
            }
            node = new Node();
            node.key = key;
        }
        node.value = value;
        moveToFirst(node);
        hashMap.put(key, node);
    }

    public V get(K key) {
        Node<K, V> node = hashMap.get(key);
        if (node == null) return null;
        moveToFirst(node);
        return node.value;
    }

    public void remove(K key) {
        Node node = hashMap.get(key);
        if (node != null) {
            if (node.pre != null) node.pre.next = node.next;
            if (node.next != null) node.next.pre = node.pre;
            if (node == first) first = node.next;
            if (node == last) last = node.pre;
        }
        hashMap.remove(key);
    }

    private void moveToFirst(Node node) {
        if (node == first) return;
        if (node.pre != null) node.pre.next = node.next;
        if (node.next != null) node.next.pre = node.pre;
        if (node == last) last = last.pre;

        if (first == null || last == null) {
            first = last = node;
            return;
        }

        node.next = first;
        first.pre = node;
        first = node;
        node.pre = null;
    }

    private void removeLast() {
        if (last != null) {
            last = last.pre;
            if (last == null) first = null;
            else last.next = null;
        }
    }

    class Node<K, V> {
        public Node pre;
        public Node next;
        public K key;
        public V value;
    }
}
2017挖财安卓校招笔试题复盘:Handler、启动模式与性能优化全解析 在Android开发者的面试准备中,基础知识始终是衡量功底的核心标尺。无论是Handler消息机制、Activity启动模式,还是图片加载与内存优化,这些经典考点不仅出现在校招笔试里,也贯穿于日常工程实践。理解Java基础如字符串常量池、HashMap线程安全,掌握异步任务与生命周期管理,是每个Android工程师构建技术体系的必经之路。从面试场景出发,解析常考题型背后的原理与答题思路,并延伸到当前主流技术栈如Kotlin、MVVM和协程的演进,帮助开发者建立从基础概念到实际应用的完整认知。无论准备校招还是 阅读详情

相关推荐

阿里校招在线笔试题详解:算法思维、Java底层与工程权衡

大厂研发岗位的在线笔试,往往不只考察算法本身,更看重候选人对底层原理、边界场景和工程权衡的理解。比如经典的Top K问题,既可以用排序解决,也能借助最小堆或快速选择达到更优时间复杂度;而HashMap在JDK 1.7下的并发扩容问题,则直接反映对集合源码和线程安全机制的掌握程度。从数据规模估算、哈希分片到复杂度的推演,这些能力在真实业务中同样至关重要。无论是准备阿里巴巴在线笔试题,还是系统提升编程基本功,理解数据结构在特定约束下的取舍、熟悉常见笔试OJ的输入输出规范,都是通往大厂offer的关键路径。本文以

weixin_30873847的博客 381

算法学习笔记(10)-缓存淘汰算法LRU

文章目录1.1 何谓LRU算法1.2 如何实现1.3 为何不直接使用HashMap作为LRU底层结构 今日心情美丽,让咱们看看传说中的LRU算法是怎么一回事 1.1 何谓LRU算法 LRU算法指的是Least Recently Used,即最近最少使用算法,也被称作缓存淘汰算法/页面置换算法,LRU算法的基本原则是如果一个数据最近很少被访问到,那么之后也应该很少被访问到;如果一个数据最近经常被...

BoringError的博客 591

春招总结!记录一下3月份拿到的offer,华为,阿里,美团御三家,附上自己总结的面经!

前言 攒攒人品,希望早日收到tx的暑假实习offer 华为 校招 通用软件开发 已oc , 第三次测评中 。。 一面 3月3号 60分钟+20笔试 熟悉哪种语言 JAVA以及Python 算法题 最大公共前缀 (一开始用前缀树做,后续调试出了问题。时间快到改用循环做)。 如何学习一门语言(整体局部整体局部) JAVA:讲讲集合类(讲了List、Map等主要实现类,底层数据结构主要参数主要方法) synchronized修饰代码块以及方法的区别;synchronized reentrantlock等重入锁以及

weixin_53224039的博客 2254

字节跳动Android一面凉凉,竟以为一面是HR面...

我以为是HR一面,结果是技术,没想到啊,没想到! 1、描述Activity的生命周期。 2、描述一个Activity启动另外一个Activity的生命周期 3、Activity标签可以配置什么 4、IntentFilter里面的标签可以干嘛 5、Service怎么启动 了解IntentService吗? 6、几大控件有 7、存储数据的方式有 8、Intent可以干嘛 9、Sharedpreference里面的apply和commit有什么区别 10、Conte.

AndroidAlvin的博客 1047

京东2019校招Java笔试高频考点与真题解析

Java作为企业级应用开发的主流语言,其核心知识体系始终是大厂技术面试与笔试的考察重点。从面向对象、集合框架到JVM内存模型,每一个基础概念都直接影响代码的稳定性与性能。以HashMap为例,其底层数组+链表+红黑树结构、扩容机制与线程安全性,是衡量候选人是否真正理解Java集合原理的试金石。JVM运行时数据区与内存溢出(OutOfMemoryError)的区分,则考验开发者对内存管理的深度认知。掌握这些基础原理后,再结合数据结构、算法、数据库索引等高频考点,形成系统化复习路线,不仅有助于应对京东等互联网公

weixin_30457551的博客 594

美丽联合校招笔试题全解析:电商技术岗与产品运营岗备战指南

互联网校招笔试是求职者进入大厂的第一道关卡,其底层逻辑并非单纯考察知识记忆,而是通过业务场景包装基础概念,筛选出具备扎实功底、结构化思维与商业嗅觉的候选人。尤其在电商与内容融合的平台中,高并发架构、推荐算法、用户增长与数据运营成为核心命题方向。从数据结构到系统设计,从产品策略到数据分析,每一类题型都折射出企业对“能落地解决问题”的工程能力与业务理解力的重视。理解这些出题意图,远比背诵答案更有价值。本文以一份典型的电商+内容平台校招笔试题为切入点,拆解技术岗与产品运营岗的考察维度与答题框架,并为求职者提供从笔

weixin_30896825的博客 437

阿里实习生笔试题深度解析:从HashMap到分布式核心考点

在后端开发的面试与笔试中,仅停留在API使用层面远远不够,深入理解底层原理并建立知识网络才是关键。从Java集合类的线程安全,到JVM内存模型与对象分配,再到并发编程中的volatile语义,每一环节都直接影响系统在高并发场景下的稳定性。数据库索引的最左前缀原则、分布式系统中的CAP权衡,更是实际工程项目中性能优化与架构设计的核心依据。本文围绕阿里巴巴实习生笔试题,系统拆解了HashMap的扩容隐患、JVM运行时数据区、零拷贝技术、LRU缓存实现等高频考点,并结合实操经验给出答题策略与复盘方法,帮助读者构建

weixin_33860553的博客 828

 2020年阿里社招的笔试题目2--社招居然也让我笔试醉了

2020年阿里的笔试题目。 /** * 二、有一个字符串它的构成是词+空格的组合,如“北京 杭州 杭州 北京”, 要求输入一个匹配模式(简单的以字符来写), 比如 aabb, 来判断该字符串是否符合该模式, 举个例子: * 1. pattern = "abba", str="北京 杭州 杭州 北京" 返回 ture * 2. pattern = "aabb", str="北京 杭州 杭州 北京" 返回 false * 3. patter...

java技术专家全栈成长之路 5090

最新高频Java笔试题分享,最新大厂Java社招面试经验汇总

说一个前几年一个热门话题:“是否应该跳出舒适圈。”一时间,这个话题便引发众人议论:支持方:愿意挑战不擅长领域的人,勇气可嘉,值得学习。反对派:做自己擅长的事情不好吗?为何非要跳出舒适圈呢?其实,每个人的决定都取决于当下自己的状态以及那一瞬间的冲动,也可能你成了雷军,也可能你和下图一样,大家懂我意思吧一念之间的决定,你敢尝试吗?今天想说的是对于想转行做程序员的一些建议和小小的帮助。每年想转行做程序员的人都不少,现在一些大热门的区块链,人工智能这些都不适合转行的人去学习,因为对逻辑思维能力以及数学能力要求太高了

D1561691的博客 1005

阿里社招笔试三个题目超级简单,但是我没有做完,醉了

三、找到一个无序数组中找两个特定数,使其相加等于特定数字,请写代码java将它找出来,并指出时间复杂度。 例如 * 【10,25,19,89,75,56,34,54,16,9,-5】找到相加等于28的【19,9 】 源码: /** * 功能说明:TODO * * @date 2020年5月18日 * * */ public class TextTest { /** * 三、找到一个无序数组中找两个特定数,使其相加等于特定数字,请写代码java将它找出来...

java技术专家全栈成长之路 3842

小厂 Java 面试,难度怎么样?

每次面试都录音,复盘时能发现很多自己没意识到的问题。使用飞书、钉钉等工具将录音转为文字,便于快速定位和分析回答不好的地方。让 AI 帮你分析面试官问题的考察点,并对你的回答提出优化建议。AI 只是工具,最终的答案需要结合你自己的实际情况来调整。失败是常态,放平心态,持续精进。加油!

JavaGuide 406

从阿里秋招附加题到自研ImageLoader:图片加载框架设计全解析

在Android开发中,图片加载是最高频也最复杂的场景之一。一个成熟的图片加载框架往往涉及三级缓存、异步线程调度、Bitmap压缩与内存优化等多个核心知识点。理解这些底层原理,不仅能帮助我们更高效地使用Glide、Fresco等主流库,也是应对大厂技术面试时展现工程能力的加分项。本文从一道经典的客户端面试题出发,逐步拆解图片加载框架的整体架构设计,包括内存缓存与磁盘缓存的LRU策略、线程池参数取舍、控件复用导致的图片错乱问题,以及从零手写轻量级ImageLoader的关键代码实现。通过完整的编码实践与踩坑复

weixin_30709061的博客 339

【LPDDR4 - 学习二】LPDDR4 介绍 ——LPDDR4 芯片引脚说明解析

本文系统解析了LPDDR4内存芯片的引脚定义与特性,重点介绍了272球POPFBGA封装的双通道架构。内容涵盖电源管理(三级供电架构与上电时序)、控制信号(差分时钟与复用命令总线)、数据接口(16位双向数据总线与选通信号)以及校准复位等核心模块。通过表格详细列明了各引脚电压范围、功能定义及工程注意事项,并附有典型封装球位分布图。全文基于JEDEC标准,为移动设备内存设计提供全面的硬件参考,特别强调电源时序控制、信号完整性及抗干扰设计等关键点。

zap15622077817的博客 2639

阿里面试经历

此前在脉脉上荣幸获得一个阿里金服大佬的内推,便记录下,知不足,而补不足。 ** 一.面试时的代码评测 ** 1.评测详情 面试时面试官首先出了两道笔试题,共给了20分钟让写出代码。 1、实现一个LRU淘汰算法 设计并且实现一个Least Recently Used (LRU)的缓存对象,他支持get和put操作 get用来获取cache中的key对应的value,如果该key不存在...

二营长 2247

PRD撰写效率翻倍秘籍:我是如何用大模型+飞书文档搭建自动化工作流的

本文分享了如何利用大模型与飞书文档构建自动化工作流,以大幅提升PRD撰写效率。通过结构化需求输入、设计模块化提示词模板,并借助自动化脚本桥接数据与文档,产品经理可将繁琐的文档撰写工作自动化,从而将精力聚焦于产品战略与用户洞察。

weixin_28520495的博客 405

基于单片机控制双向可控硅灯光强度设计

*单片机设计介绍,基于单片机控制双向可控硅灯光强度设计。

QQ2193276455的博客 2457

2024阿里+头条+腾讯等大厂Java笔试题分享,java初级程序员面试题目

面试题文档来啦,内容很多,485页!由于笔记的内容太多,没办法全部展示出来,下面只截取部分内容展示。

2401_84415708的博客 1143

基于STM32F407的摄像头(不带FIFO的OV7670)图像采集及LCD显示实验-笔记整理

硬件说明 STM32F4开发板 stm32f4系列的芯片处理的能力可以说非常强大了的,而且内部还自带有数字摄像头接口(DCMI),可以说stm32f407的核心板和不带FIFO的摄像头模块OV7670简直就是绝配! 我手上的这块张这个样子 (图片来源:某宝): F4系列的DCMI接口内部结构框图如下图3所示,具体的配置使用方式可以参考以下这篇博文:《stm32f4的数字摄像头接口(DCMI)使用》 这位博主大大已经很详细地介绍了DCMI接口的具体使用方法和原理,更重要的是里面还有接口的配置函数,虽然不完

LiangWF22的博客 2万+

Java 面试必看:3 年经验如何拿下阿里 P6?高频题 + 避坑指南大公开

本文把一线大厂近半年的高频考点拆解成 "可落地的得分点",从基础到架构层层递进,附上面试官视角的 "加分话术" 和 "避坑指南"。无论你是应届生还是 3 年 + 开发,照着这份攻略准备,至少少走 6 个月弯路!

2501_93207597的博客 1125

[Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

分类(Classification)属于有监督学习(Supervised Learning)中的一类,它是数据挖掘、机器学习和数据科学中一个重要的研究领域。分类模型类似于人类学习的方式,通过对历史数据或训练集的学习得到一个目标函数,再用该目标函数预测新数据集的未知属性。本章主要讲述分类算法基础概念,并结合决策树、KNN、SVM分类算法案例分析各类数据集,从而让读者学会使用Python分类算法分析自己的数据集,研究自己领域的知识,从而创造价值。 19.1 分类 19.1.1 分类模型 与前面讲述的聚类模型类似

杨秀璋的专栏 2万+

实战:RK3568 Android14 调试 MIPI DSI 液晶屏

LCD1_RST -> 对应原理图网络连接到 GPIO。LCD1_PWR_EN ->用于给屏幕 VCC 供电。LCD0_BL_EN / LCD0_BL_PWM -> MP3302 升压芯片驱动 LED 灯条。![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/100f2be7f763494da1032464e272e63b.png&pinctrl {/* 配置 LCD_RST 和 LCD_EN */

qq_33427070的博客 1548

阿里校招笔试全解析:算法、Java与工程思维的高频考点指南

算法和数据结构是技术人才选拔的基础标尺,任何软件岗位的笔试都难以绕开这两座大山。它们不仅考察对原理的理解,更检验工程实践中能否灵活运用双指针、滑动窗口、哈希表、LRU等经典模型解决模糊问题。在阿里校招中,这些知识点被包装成生活化的场景题,变式丰富,重点在于识别题目背后的核心模型。同时,Java基础、并发、网络协议与数据库等工程底座知识也占据客观题的半壁江山。理解这些技术概念的本质,并梳理常见变式与踩坑点,能显著提升备考效率。这篇内容系统拆解了阿里软件类笔试的题型构成、高频题眼与复习路径,为求职者和自检基本功

weixin_29097457的博客 271

用 ADT 连接 SAP S/4HANA Public Cloud 开发租户的完整落地指南

摘要:在SAP S/4HANA公有云中进行ABAP开发时,必须使用Development Tenant(客户端080)而非Customizing Tenant(客户端100)连接ADT工具。开发用户需具备SAP_BR_DEVELOPER角色且写权限不受限,开发对象应创建在结构包的子包中。连接前需确认正确的ABAP服务URL(通常为Launchpad URL去掉"/ui"),并通过运行控制台程序验证全链路功能。典型开发场景如通过BAdI实现业务校验时,需遵循Clean Core原则在指定包

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 338

网易Java校招笔试核心考点解析:集合框架、JVM与并发编程

Java后端面试中,集合框架与JVM内存模型始终是考察的重中之重。HashMap的底层结构、负载因子权衡、ConcurrentHashMap的锁粒度演进,以及类加载过程、双亲委派模型,这些基础原理不仅决定代码性能,更直接影响线上问题排查能力。并发编程中的synchronized、volatile与线程池参数设计,同样是区分候选人实战水平的关键。面试官通过看似简单的笔试题,层层深挖候选人对底层机制的理解深度。以大厂校招真题为例,剖析典型考点背后的设计思想与工程实践,帮助求职者建立完整的Java知识体系,从容应

weixin_32247165的博客 336

微信H5网页支付JSAPI部分用户报错:system:access_denied 的解决方案

JSAPI 支付仅支持微信内置浏览器调用。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1685

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

2023Java岗面试,进互联网大厂必备Java面试八股文真题解析

这份Java进阶知识典藏版内容非常的全面,真的可以好好补一补,希望大家都能拿到理想的薪资和。

SharingOfficer的博客 759

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 面试-阿里社招笔试题两则(一)----Excel列号转数字
下一篇: 面试-3.MyBatis中#与$的区别,PrepareStatement
过河的小卒子
博客等级 码龄10年 39粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值