资讯动态

Java笔试高频考点深度解析:存储分层与多线程同步

发布时间:2026/10/24 1:07:32 来源:尧图企业网站定制
简介这份2020年兴业数金Java在线笔试题整理文档专为准备银行系金融科技岗位Java笔试的求职者而设聚焦Java基础、计算机存储、多线程同步、MySQL数据库及算法等高频考核模块。文档以问答形式梳理了方法重载、JDK辅助工具、InnoDB引擎理解、Delete与Truncate差异、堆的概念等核心考点并附有最近对称数编程题的解题思路适合用于笔试前快速查漏补缺与核心知识点复盘。资源为单个docx格式文件压缩包大小14KB共1个文件轻量便携可直接阅读或打印使用。已有8738人学习浏览内容精炼且覆盖兴业数金常见的Java技术面试命题方向对目标金融机构Java岗位的求职者具有较高参考价值。1. 一场Java在线笔试到底在考什么有过线上笔试经验的人都懂题目不算难但知识点散得像开卷考试却不知道翻哪一页。你明明复习了集合和IO结果卷子上一半是“计算机存储系统分为几个层次”“多线程同步和互斥有几种实现方法”“Delete和Truncate的差别”这种看起来基础、实际一写就卡壳的题。这份文档记录的2020年Java在线笔试恰好就是这类考卷的典型样本一道算法题、几道计算机基础题、几道数据库题再加一道多线程问答题。粗看考点很杂细看有一条主线——计算机怎么存数据、多个任务怎么安全地抢数据、写代码时怎么让程序既快又稳。这篇就把这条主线拆开讲一遍让你再遇到同类笔试时能一眼看出每道题在考什么。2. 存储系统的层次结构为什么Cache、主存、辅存要接力2.1 三级结构Cache、主存、辅存各管一段“计算机存储系统分为几个层次”几乎是大纲题但你真落笔写的时候容易漏层次。标准答法是三级层次结构高速缓冲存储器、主存储器、辅助存储器。最高层是Cache容量最小、速度最快、价格最贵中间是主存也就是内存条容量和速度居中最底层是辅存指硬盘、U盘这类外部存储容量最大、速度最慢、单位价格最便宜。这三级里还嵌套着两个子层次。一个是Cache到主存这一层目标是弥合CPU和内存之间的速度差另一个是主存到辅存这一层目标是让系统拥有比物理内存大得多的可寻址存储空间。考试时把这三级和两个子层次写全这道题基本就稳了。层次容量存取速度单位价格主要职责Cache高速缓存最小最快最贵弥补CPU与主存的速度差距主存内存中等中等中等存放正在运行的程序和数据辅存硬盘等最大最慢最便宜断电后仍能保存数据分层之后整个系统看起来像什么像一家既有收银台、又有后厨、还有冷藏库的餐厅。CPU是大厅里的顾客他下单时永远找最近的收银台Cache收银台没有的菜才去后厨主存取后厨也没有的食材再去冷藏库辅存调。对顾客来说等待时间被压缩到了“收银台一般都有”的水平。2.2 为什么分层就能提速快的不够装够装的不够快存储系统的核心矛盾是越快的存储器越贵、容量越小越便宜的存储器越慢、容量越大。单靠某一种存储器根本无法同时满足“速度接近CPU”和“容量足够大”两个要求。分层存储的聪明之处在于它让数据和程序按访问热度分布在不同的存储器里——高频使用的放Cache普通的使用放主存不常用的放辅存。这背后的理论依据是程序访问的局部性原理。程序在一小段时间内访问的地址往往集中在一个很小的范围内刚访问过的数据很快又会再访问时间局部性相邻地址的数据也会被连着访问空间局部性。既然热点这么集中把这一小块数据提前搬进CacheCPU大多数时候都能以Cache的速度拿到数据只有Cache没命中时才不得不去慢速的主存或辅存走一趟。所以“分层能提高程序执行效率”不是玄学而是用“小概率的慢”换“大概率的快”。整个存储系统平均下来存取速度接近最快的那层容量接近最大的那层价格则被辅存拉低。高速缓存解决速度问题辅助存储器解决容量问题这句话背下来不难关键是在面试里说清楚“局部性原理”这四个字分数差距就在这里拉开。2.3 InnoDB数据库里的“分层存储”也在暗中接力笔试题里有一道“关于MySQL中的InnoDB引擎的理解”它和存储分层其实是一家人。InnoDB是MySQL默认的存储引擎它靠一套内部的分层机制保证数据不丢、并发不乱。数据真正落在磁盘上也就是上面说的辅存层但读写频率高的数据页会先放在内存缓冲池里相当于数据库自己的Cache每次事务提交时InnoDB把操作记录追加到redo log重做日志里而不是立刻改磁盘上的数据文件。这个设计眼熟吗就是Cache和主存那套“先写日志、后刷数据”的接力。等系统崩溃重启InnoDB把redo log重放一遍那些没来得及落盘的事务也能恢复这就是“崩溃恢复”能力的来源。回答InnoDB这道题时只要抓住三件事就够了支持事务、使用行级锁定、具备崩溃恢复能力。再补一句“它是MySQL的默认存储引擎适合高并发、数据一致性要求高的场景”这道题就答得比大多数人完整。3. 对称数与堆两道题背后的算法思维3.1 找最接近的对称数别遍历要“构造”笔试题第一题是“输入一个正整数计算输出距离它最近的对称数”。对称数就是回文数比如121、1331这种正着读反着读都一样的数。第一次做这道题很多人第一反应是写个循环从n开始往两边一个个判断。这个思路没错但笔试里一旦n很大比如十位数逐个数判断必然超时。正规的解法是“构造三个候选再取距离最近的”。一个数的对称数长什么样它由前半部分决定。比如13245前半部分是132把132翻转成231拼回去得到13231这就是“以132为前导”构造出的对称数。但13231不一定离13245最近所以要把132减一、加一再各构造一个得到13131和13331三个候选里挑距离最近的那个。// 输入正整数 n返回距离 n 最近的对称数 static long findNearestPalindrome(long n) { if (n 10) return n; // 一位数本身就是对称数 String s Long.toString(n); int len s.length(); // 原数的位数 long front Long.parseLong(s.substring(0, (len 1) / 2)); // 取前半部分 long[] candidates { buildPalindrome(front, len % 2 0), // 前半部分原样构造 buildPalindrome(front - 1, len % 2 0),// 前半部分减一 buildPalindrome(front 1, len % 2 0) // 前半部分加一 }; long best candidates[0]; for (long c : candidates) { if (Math.abs(c - n) Math.abs(best - n)) { best c; // 距离更小就替换 } } return best; } // 用前半部分 half 构造完整对称数isEvenLen 表示原数是偶数位还是奇数位 static long buildPalindrome(long half, boolean isEvenLen) { String left Long.toString(half); StringBuilder sb new StringBuilder(left); if (isEvenLen) { return Long.parseLong(left sb.reverse()); // 偶数位直接整体翻转 } else { return Long.parseLong(left sb.reverse().substring(1)); // 奇数位去掉重复的中间位 } }这段代码的关键在buildPalindrome方法偶数位时前半部分直接拼上自身的翻转奇数位时翻转后要砍掉第一个字符因为中间那位只出现一次。候选数量固定只有三个所以复杂度是常数级无论n多大都不会超时。笔试时用这段思路比循环查找高出一个档次。3.2 堆不是“高度平衡树”是“按优先级排队的完全二叉树”“什么是堆”这道题看着简单翻车率却很高。很多资料会把堆描述成“左右子树高度差最多为1”那其实是平衡二叉树的概念不是堆。堆是一种特殊的完全二叉树它满足两个条件一是整棵树必须从左到右依次填满二是有堆序性质——大顶堆里父节点永远大于等于子节点小顶堆里父节点永远小于等于子节点。堆最直观的用途是实现优先队列。普通队列是先进先出优先队列是“优先级最高的先出”。用堆来实现入队和出队都只要O(log n)时间。Java里的PriorityQueue底层就是一个小顶堆。堆排序也是这个结构每次从堆顶取出最大或最小元素再调整堆结构就能在O(n log n)时间内排完整个数组。笔试题里问“什么是堆”你只要说出“完全二叉树 堆序性质 常用来实现优先队列”再补一句数组存储堆的父节点和子节点可以用下标算出关系第i个节点的左孩子是2i1右孩子是2i2就不需要存指针。这句话一出来面试官就知道你是真懂。3.3 三个“堆”的重名数据结构、JVM堆内存、操作系统堆“堆”这个词在计算机里至少有三个意思初学者最容易在这里踩坑。一个是数据结构堆就是上面说的完全二叉树一个是Java虚拟机里的堆内存它是运行时数据区用来存放对象实例还有一个是操作系统的堆内存是进程动态分配内存的区域new对象时底层就在操作系统堆里划空间。三个堆没有任何父子关系只是中文都翻译成“堆”。区分它们就一个窍门看上下文里的定语。笔试题说“什么是堆”结合前后题目是Java开发岗通常问的是数据结构说“JVM的堆”指的是内存区域说“堆和栈的区别”大概率是操作系统内存布局。别在答题时把三者混为一谈这是一道送分题但每年都有人写串。4. 方法重载与JDK辅助工具语言边界与工具箱4.1 重载同名方法怎么“各干各的”“Java重载的几种方式”这道题本质考的是你对方法签名的理解。重载就是在一个类里定义多个同名方法但它们的参数列表必须不同。参数列表不同有三种情况参数个数不同、参数类型不同、参数顺序不同。只要参数列表有差异方法体就可以做不同的事。public class Printer { public void print(int value) { // 参数个数相同类型不同 System.out.println(整数 value); } public void print(String value) { // 与上一个构成重载 System.out.println(字符串 value); } public void print(int value, String unit) { // 参数个数不同构成重载 System.out.println(value unit); } // 下面这两个写法都不能构成重载 // public int print(int value) { return value; } // 仅返回值不同不行 // public void print(int value) {} // 与已有方法完全相同不行 }关键坑是返回值类型不同不构成重载。为什么因为调用print(5)时编译期根本不知道你打算把返回值赋给int还是String单靠返回值无法区分该调哪个方法。访问修饰符不同、参数名不同也都不构成重载判断标准只有一个参数列表是否不同。4.2 重载与重写一对最容易被搞混的概念重载是“同一个类里同名不同参”重写是“子类里重新实现父类的方法”。前者是编译期就能确定的静态行为后者是运行期才决定的动态行为。笔试爱考它们的区别是因为概念长得像都涉及同名方法都让你觉得“方法可以重新定义”。记住三个区分维度。一看类关系重载一定发生在同一个类里重写一定发生在父子类之间。二看方法签名重载要求参数列表不同重写要求参数列表完全一致返回值类型可以相同或者是父类返回类型的子类型。三看关键字重写方法上面常带Override注解编译器会帮你检查是否真的重写了父类方法。把这三点写清楚比死记定义有用得多。4.3 JDK额外工具不只是java和javac“JDK额外提供了哪些辅助工具”这道题考的是日常开发的“工具箱意识”。大多数人都知道java和javac却忽略了安装JDK时附带的那些小工具。常考的是这几个javadoc根据源码注释生成API文档jar用来打包和拆包jconsole是图形化的JVM监控工具jps列出当前机器上的Java进程jstack打印线程快照jmap做堆转储javap反汇编class文件。其中javadoc和jar的出场率最高。javadoc生成的是那种带框架结构的HTML文档里面能看到每个类的说明、每个方法签名和注释jar命令类似压缩打包把编译后的class文件按指定清单打成一个可执行的jar包。jconsole则更进阶它能实时看到堆内存使用曲线和线程状态是排查内存问题的利器。笔试里能把名称和作用对上就行工具名记牢用途写清就拿到这题的分了。5. Delete与Truncate易混点删数据的两条路径5.1 删除数据不是只有一条路笔试题“Delete和Truncate的差别”是数据库题里的常青树。两者都能让表里的数据消失但消失的方式完全不同。DELETE是逐行删除属于DML数据操作语言你可以加WHERE条件精确控制删哪些行TRUNCATE是清空整张表属于DDL数据定义语言不能加WHERE它做的事是把整张表的结构保留下来但数据全部丢弃然后重建表。通俗地说DELETE是“点名删人”被点到的人离开剩下的人保持原位。TRUNCATE是“整个房间清空重来”桌椅板凳表结构还在但原先坐在座位上的人全部离场座位编号也从1重新排起。对比维度DELETETRUNCATE类型DML数据操作语言DDL数据定义语言是否支持WHERE支持可删部分行不支持只能清空全表自增列保留当前值继续累加重置为初始值从头开始触发器逐行触发DELETE触发器不触发触发器事务回滚事务内可回滚隐式提交通常不可回滚空间释放不立刻释放有碎片直接释放表空间5.2 三条最容易混淆的点易混点一两者能不能回滚这是最常见的坑。很多人以为DELETE一定可以回滚TRUNCATE一定不能。实际上DELETE在InnoDB引擎下放在事务里可以回滚TRUNCATE会被隐式提交。为什么混因为都在做删除操作人的直觉会默认“删错了能反悔”。区分方式是记类型DELETE是DML天然受事务控制TRUNCATE是DDL执行时就隐式提交后悔药基本没得吃。易混点二自增列的状态DELETE清空表之后再插入数据自增ID会接着之前的数继续走TRUNCATE之后自增ID会从1重新开始。为什么混因为从数据结果看两张表都空了容易让人误以为它们状态也一样。区分方式是想“重置”这个词TRUNCATE是整表重建所以计数器归零DELETE只是删行计数器还在原地。易混点三性能和空间释放TRUNCATE比DELETE快很多原因是它不逐行触发也不记录每行的删除日志直接在存储层面释放数据页DELETE逐行删还要记录undo日志以便回滚所以慢一些。TRUNCATE执行完表空间立刻收缩DELETE删完还有碎片。为什么混因为两者都能“让数据消失”而“消失得彻底不彻底”容易被忽略。记住一句话想快速清空全表、不关心回滚用TRUNCATE想删部分行、要保留自增计数用DELETE。5.3 这道题为什么年年出现面试官爱考这道题是因为它能快速检验你平时写SQL是“做了什么会什么”还是“知道为什么”。一个只知道DELETE能删数据的人答不出类型差异、回滚差异和空间释放差异而能把这几个点分清楚的人至少说明他踩过一次“删错数据无法回滚”的坑或者真读过MySQL文档。这道题不需要背长篇大论把上面那张表的六行差异记牢再补一句“TRUNCATE是DDL、操作前要谨慎”就过关了。6. 多线程同步与互斥从用户态到内核态该怎么选6.1 同步和互斥先分清楚再选工具多线程同步和互斥是笔试题里最容易被自己绕晕的部分。先看定义线程同步是线程之间有先后制约关系一个线程依赖另一个线程的消息消息没到就得等待到了才被唤醒线程互斥是访问共享资源时的排他性任何时刻最多只允许一个线程使用某个共享资源其他线程必须等着。互斥可以看作一种特殊的同步——它是“访问同一个资源”这件事上的同步。同步关心的是顺序和通知互斥关心的是排他和竞争。前者像百米接棒前一棒不跑到后一棒不能出发后者像只有一个厕所位谁进谁锁门。笔试里能写出“互斥是一种特殊的同步”这道问答题的地基就打牢了。6.2 用户态和内核态四种实现的成本分水岭线程同步的实现方法大体分两类用户模式和内核模式。用户模式包括原子操作和临界区优点是速度快因为不需要从用户态切换到内核态缺点是能力有限临界区只能在同一个进程内使用。内核模式包括事件、信号量、互斥量它们借助系统内核对象来实现同步可靠但代价高每次操作都要做一次用户态和内核态的切换成本明显更高。实现方式所属模式成本典型适用场景原子操作用户态最低单个全局变量的读改写临界区用户态较低同一进程内线程串行访问公共代码段互斥量内核态较高跨进程协调对共享资源的单独访问信号量内核态较高控制有限数量用户的资源分配事件内核态较高通知线程“某件事已发生”启动后续任务笔试里把这张表写出来就已经很够用了。要理解的是背后的判断逻辑临界区快但不跨进程适合做数据访问控制互斥量为“协调共同访问一个共享资源”而生信号量管的是“只有有限个许可”的资源比如连接池事件则用于通知一个线程干事另一个线程等它干完再接手。6.3 什么时候用哪个边界判断与笔试教训我在一次模拟笔试里把“信号量”和“互斥量”混着答导师看完给的评语只有一句“信号量是计数器互斥量是锁。”从那时起我每次复习多线程都强制自己走一遍这个判断流程要保护的是数据访问进程内就用临界区或锁要协调的是跨进程资源优先选互斥量要控的是“最多N个线程同时用”那就是信号量要干的是“等某个事件发生再继续”那就用事件。从一个具体例子看边界售票系统的余票数是有限数量资源适合用计数信号量控制转账时更新同一个账户余额是共享数据访问应该加锁线程池初始化完毕后通知所有等待线程开工则用事件通知。反过来如果只是单线程程序这些工具一个都用不上如果场景允许优先用用户态方案别让内核态切换拖慢高频操作。这份文档里的题目看似孤立实则是三块拼图存储系统告诉你数据在哪数据库引擎告诉你数据怎么不丢多线程告诉你数据怎么不被抢坏。把它们串成一条线远比背下一堆定义更有用。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑