☰
银行IT笔试真题解析:JVM、数据库与C++高频考点详解
2026/10/17 23:20:08 网站建设 项目流程

简介:一份面向银行信息技术岗位求职的计算机基础笔试题与答案文档,适配计算机专业应届生、准备银行面试的技术求职者。内容覆盖.NET平台运行机制、信息工程战略规划、数据库系统模型、面向对象技术、C++访问控制、网络安全防火墙、堆排序最坏复杂度、二叉树遍历交换子树、二分查找适用条件、哈希查找冲突处理、多线程栈堆分配、SQL集合运算以及Java事件监听等高频考点;并涉及栈输出序列判断、连接池行为等典型题目。每道选择题均附答案和必要解析,便于逐题核验、快速定位薄弱环节。资源共1个docx文档,大小约25KB,按题号顺序排列,结构紧凑;既能作为考前速刷手册,也可用于查漏补缺和知识框架整理。目前已有84人学习,对想进入银行IT部门的求职者具有直接参考价值,适合作为平安银行及各股份制银行IT笔试的备考资料。

1. 一份银行IT笔试真题库:为什么它比盲目刷LeetCode更贴近实战

备考银行IT岗的同学大多有个共识:计算机求职笔试里最磨人的不是算法题,而是那种“看着都眼熟、一选就错”的概念题。计算机求职面经里反复被追问的JVM、数据库锁、哈希冲突、多线程,这套真题里全都有原型。这份银行面试真题库,来自某股份制银行近几年的IT招聘笔试题整理,覆盖.NET与Java基础、数据库与SQL、数据结构与算法、C++底层机制、操作系统死锁和数据仓库六大块,每道题都带答案和解析。对正在准备计算机求职笔试的人,它是一份查漏清单;对刚转行进银行系统方向的开发,它帮你快速判断自己的知识面有没有硬伤。

2. Java核心与JVM机制:从字节码到内存布局的高频考点

银行IT笔试的Java题很少考偏门API,反复出现的都是“编译产物是什么”“方法传参改没改到”“static成员能不能直接访问”这类基础题。基础不代表简单,恰恰是失分重灾区。

2.1 编译产物与运行机制:为什么答案是byte code

题库第一题问.NET的描述哪项错误,答案是D“编译时直接被编译成机器代码”。同样逻辑也出现在Java题里:“Java程序经编译后会产生什么”,正确选项是byte code。

.NET编译后生成的是中间语言IL,运行时由CLR转换成机器码;Java编译后生成的是.class字节码文件,由JVM解释执行。这两道题本质是同一个知识点:现代语言编译产物大多是中间表示,不是直接可执行的机器码。

javac Hello.java javap -c Hello.class

逻辑说明:javac把.java源文件编译成.class字节码文件,javap -c对class文件反汇编,输出JVM能识别的指令序列。这个命令经常用来验证“编译后到底变成了什么”,比背概念更直观。参数说明:-c表示反汇编当前类的字节码;如果想看常量池、字段表和完整签名,可以加-verbose参数查看更详细的结构。

顺带把题库里“负责对字节代码解释执行”的题也一并解决:答案是“虚拟机”,不是编译器,也不是垃圾回收器。垃圾回收器只负责内存回收,不负责执行字节码。

2.2 传参陷阱:String与数组在方法调用后的真实状态

题库里那道change方法的题很有代表性:String变量传入方法后重新赋值,外层引用不变;字符数组传入方法后修改了第一个元素,外层数组也跟着变了。输出结果是good and gbc。

public class Example { String str = new String("good"); char[] ch = {'a', 'b', 'c'}; public static void main(String[] args) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.print(ex.str + " and "); System.out.print(ex.ch); } public void change(String str, char[] ch) { str = "test ok"; ch[0] = 'g'; } }

逻辑说明:Java参数传递只有一种语义——值传递。String作为引用类型传入时,形参str和实参ex.str指向同一个对象,但形参重新赋值"test ok"只是把形参指向了新字符串对象,实参的引用没有被修改。数组传入时同样是值传递,但数组引用指向的是同一个数组对象,ch[0] = 'g'是在原数组上做元素修改,所以外层能看到变化。参数说明:String虽然是引用类型,但不可变性决定了“重新赋值”不等于“修改原对象”;数组是可变对象,修改元素属于原地操作。

这道题在面试中经常被延伸成“那StringBuilder呢?”,如果传的是StringBuilder并执行append,外层能看到内容变化;如果执行sb = new StringBuilder(),外层看不到。

2.3 static成员、集合初始化与事件监听:三道容易错位的题

题库里“int arr[] = new int[10],main里直接println(arr[1])”的题,答案是编译时报错。原因很简单:arr是实例成员,而main是static上下文,不能直接访问非static成员。把arr声明成static int[],或者先new Person()再用对象访问,就能通过。这个考点几乎每年都有变体,比如把数组换成普通对象、换成List,问法不同底层逻辑一致。

另外两道题在流传版本里出现了题干和选项错位的情况,刷的时候要小心。一道是“哪些接口可以对TextField对象事件进行监听和处理”,实际考的是ActionListener、TextListener这类监听接口;另一道选择题的选项写成了ArrayList myList = new Object()、List myList = new ArrayList()这种组合。看起来像集合题,其实是考引用类型兼容性:ArrayList不能赋给Object以外的引用,反过来List myList = new ArrayList()是合法的向上转型。

JavaScript全局函数那道题也是类似套路:escape、eval、isFinite、isNaN、parseFloat、parseInt、unescape这7个是标准全局函数,setTimeout不在其中,所以选它。

2.4 设计模式:Proxy为什么适合“不能直接操作对象”的场景

题库最后一道设计模式题描述很典型:不同级别的用户对同一对象拥有不同访问权限,或某个客户端不能直接操作某个对象但又必须和它互动。这种情况最合适的是Proxy模式。Bridge用于抽象和实现解耦,Facade用于给子系统提供统一门面,Adapter用于接口转换,都没有“控制访问权限”这层语义。Proxy模式在银行系统里很常见,比如远程代理、权限代理,调用端看不到真实对象,只和代理交互。

3. 数据库、SQL与数据仓库:union去重、ETL链路与SAS日期读取

银行IT笔试的数据库部分明显比互联网大厂考得更“企业级”:SQL去重、Oracle锁、数据仓库ETL、SAS日期输入全都有。这些题不刷一遍很难想到会考。

3.1 union与union all:8行答案背后的去重逻辑

题目给的是两张字段完全相同的表T1和T2,各有5条不同的数据,其中T1有2条数据也存在于T2,问select * from T1 union select * from T2返回多少行,答案是8行。

SELECT * FROM T1 UNION SELECT * FROM T2; SELECT * FROM T1 UNION ALL SELECT * FROM T2;

逻辑说明:第一条语句返回8行,因为UNION会对结果集做去重,T1的5条加T2的5条总共10条,其中交集2条只保留一份,所以是5 + 5 - 2 = 8。第二条语句返回10行,UNION ALL保留所有行,不做去重。参数说明:UNION和UNION ALL在处理重复数据时行为完全不同;实际生产环境里如果明确知道两张表没有交集或不需要去重,优先用UNION ALL,省去排序去重的开销。

这里有个容易被忽略的前提:题目强调“字段定义完全相同”,这是UNION能正常执行的基础。如果字段数量不一致,SQL会直接报错。

3.2 DML、DDL与Oracle锁:数据库基础题的边界

“下面哪些不是DML语句”那道题,答案是CREATE。DML只包括SELECT、UPDATE、INSERT、DELETE,面向数据操作;CREATE、ALTER、DROP属于DDL,面向结构定义。银行笔试喜欢把这两类混在一起考,还喜欢加一个MERGE作为干扰项——MERGE在Oracle里属于DML,可以做条件式插入或更新。

Oracle锁那道填空题把锁分成了三类:DML锁保护数据完整性,DDL锁保护对象结构定义,内部锁和闩保护数据库内部结构。这个分类要记牢,面试被追问“行锁和表锁属于哪一类”时直接答DML锁。

同一题里还混了一道SQL细节题:Oracle的SELECT语句中连接字符串用的是||,不是加号也不是&。另外Round(number[, decimals])函数也要知道:忽略decimals保留0位小数,为负数时小数点左边四舍五入。

“信息工程基础”那道题在银行笔试题里属于企业信息化常识:信息战略规划起点是把企业战略目标转换成信息系统目标,信息处理以数据为中心。这类题不用深究,记住“战略目标”和“数据”两个关键词就能拿分。

3.3 ETL与数据仓库:数据稽核为什么不在三阶段里

ETL是数据仓库建设中最核心的链路,全称Extract-Transform-Load,数据抽取、转换、加载是三件套。题库问“ETL软件的主要功能不包括什么”,答案是数据稽核。稽核属于数据质量管理范畴,通常在ETL完成之后或过程中单独做校验,不是ETL阶段的必备职能。

数据仓库的题经常和SAS、决策树一起出。SAS那道阅读题在整套题里很特别,它给了一段原始数据,格式是son Frank 01/31/89这种,问哪条INPUT语句能正确读取Birthdate为SAS日期值,答案是input relation $ first_name $ birthdate :mmddyy8.;。

data work.family; infile 'file-specification'; input relation $ first_name $ birthdate :mmddyy8.; run;

逻辑说明:列表输入(list input)方式下,$表示字符型变量,birthdate后面必须用冒号修饰符绑定informat。mmddyy8.表示按月-日-年两位形式读入日期,正好匹配01/31/89这种格式。如果不加冒号,SAS会把空格作为分隔符,日期值无法正确映射到变量上。参数说明:mmddyy8.中的8指informat宽度,两位月、两位日、两位年加两个分隔符正好8位;换成date9.会按01JAN1989这种格式解析,对不上题给数据。这类题在纯Java背景的人看来有点懵,但银行数仓岗确实会用SAS处理数据,属于岗位特色题。

3.4 连接池:关闭连接不是真的关闭

“客户端关闭一个从连接池中获取的连接,会发生什么”的答案是:连接不会关闭,只是还给连接池。很多新手第一反应是选“永久关闭”,实际连接池设计的核心就是复用。常见的连接池实现里,close()方法被代理拦截,真正的物理连接归还到空闲队列,供下一次获取使用。这题还延伸出一个面试追问:连接归还前事务没提交会怎样?答案是事务状态会跟着连接一起回到连接池,可能污染下一个使用者,这也是为什么规范里强调用完要commit或rollback。

4. 数据结构与算法:排序复杂度、二叉树遍历与查找陷阱

算法题在这份题库里不算难,但覆盖面很广:堆排序、二叉树遍历、二分查找、哈希冲突、栈输出序列、决策树全都有。难度不大,坑不少。

4.1 排序算法复杂度速查:最坏情况别再记错

“对n个元素进行堆排序,最坏情况下的时间复杂度”答案是O(nlog₂n)。堆排序建堆是O(n),每次堆调整是O(log₂n),调整n次,最坏就是O(nlog₂n)。容易混的是快速排序——平均O(nlog₂n),最坏O(n²)。

这里整理一份笔试常考的复杂度表:

排序算法平均时间最坏时间空间稳定性
冒泡排序O(n²)O(n²)O(1)稳定
快速排序O(nlog₂n)O(n²)O(log₂n)不稳定
堆排序O(nlog₂n)O(nlog₂n)O(1)不稳定
归并排序O(nlog₂n)O(nlog₂n)O(n)稳定
直接插入O(n²)O(n²)O(1)稳定

这表是银行笔试选择题的高频素材。出题人一般不考实现细节,只考最坏/平均复杂度和稳定性,背熟就有分。

4.2 二叉树遍历:后序为什么最适合交换左右子树

“交换二叉树所有分支结点的左右子树,用哪种遍历最合适”,答案是后序遍历。原因是后序遍历先处理左子树、再处理右子树、最后处理根节点,交换操作从叶子向根逐步完成,每个结点的左右子树在交换前已经是处理完的状态。如果不用递归而用栈模拟,后序遍历也保证孩子结点先于父结点被访问。

void swapChildren(TreeNode* root) { if (root == NULL) return; swapChildren(root->left); swapChildren(root->right); TreeNode* temp = root->left; root->left = root->right; root->right = temp; }

逻辑说明:先递归处理左子树,再递归处理右子树,最后交换当前结点的左右孩子指针。这样每一层的交换都发生在孩子层处理完之后,不会出现“交换了父结点但子结点内部的子树还没翻转”的遗漏。参数说明:root->left和root->right分别是二叉树结点的左右孩子指针;递归终止条件是结点为空。前序遍历也能做但需要额外变量保存孩子引用,中序遍历在这道题里容易造成子树错乱,后序是最自然的解。

4.3 二分查找与哈希:存储结构决定算法边界

二分查找的叙述题正确答案是“表必须有序,且只能以顺序方式存储”。链表不能二分的原因是链表不支持O(1)随机访问,每次取中值都要从头遍历,二分退化成线性。题库里另有一项说“链表方式存储也可以”,这是经典的干扰项。

public int binarySearch(int[] arr, int target) { int left = 0, right = arr.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) return mid; if (arr[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; }

逻辑说明:维护左右边界,每次取中点比较,目标值比中值大则收缩左边界,小则收缩右边界。left + (right - left) / 2的写法可以避免left + right直接相加导致整数溢出。参数说明:left <= right是循环继续条件,left = mid + 1和right = mid - 1两个更新动作是关键,少了加减1就会出现死循环或漏掉元素。

哈希查找那道题考的是理念:哈希函数不是越复杂越好,不存在“最好”的哈希函数,除留余数法也不万能,要视数据分布而定。还有一个隐藏考点是删除元素:开放定址法解决冲突时,不能简单物理删除元素,否则会导致后续冲突键的查找链断裂。常见做法是打“墓碑”标记,这就是为什么哈希表的删除比插入更讲究。哈希这个知识点在面试里会被追着问:什么时候用开放定址法?什么时候用链地址法?一般存储效率要求高、负载因子低时开放定址法有优势;冲突概率大、数据量不稳时链地址法更稳。

4.4 栈输出序列、决策树与关联规则:规律型题目的套路

栈的输入序列是1,2,3,4,5,问哪个不可能是输出序列。选项里4 1 2 3 5不可能:要让4先出栈,说明1、2、3已经全部入栈且还压在栈底,此时4出栈后,栈顶是3,下一个能出来的只能是3,不可能是1。这类题不要靠脑子空想,拿笔按“入栈则压入、出栈则弹出”的规则模拟一遍,任何出栈元素出现后,它下面的元素必须按逆序依次弹出。

决策树的题有填空有选择:决策树包含根结点、内部结点、叶结点,没有“外部结点”这个类别;寻找最佳决策树是NP完全问题;决策树对噪声干扰比较敏感,但冗余属性不会对准确率造成不利影响。这几点如果没专门准备过,很容易在选项里踩坑。

数据挖掘题也偏概念:根据已知变量预测其他变量值属于预测建模;买啤酒的人大概率也买尿布是关联规则问题。银行笔试考数据挖掘一般不深入算法,能分清楚预测建模、关联分析和聚类描述就够了。

5. C++、内存与并发:从符号约定到死锁预防

C++题在银行IT笔试里占比不低,尤其系统开发和基础架构方向。这份题库的C++题集中在符号修饰、虚函数多态、位域和一些C语言历史遗留特性上。

5.1 extern "C":C++和C的符号约定为什么不同

“在C++程序中调用被C编译器编译后的函数,为什么要加extern 'C'声明”这道题,答案是C++支持函数重载,C语言不支持。C++编译器会把函数名和参数列表一起编码成修饰名,比如void foo(int, int)在C++编译器里可能生成_foo_int_int,而C编译器只生成_foo。如果不加extern "C",C++链接器去找的是修饰后的符号,找不到C库里的原始符号,链接直接失败。

#ifdef __cplusplus extern "C" { #endif void foo(int x, int y); #ifdef __cplusplus } #endif

逻辑说明:#ifdef __cplusplus判断当前是否C++编译环境,是的话用extern "C"包住声明,告诉C++编译器这部分按C的符号规则生成引用。这样C++代码就能正确链接到C编译的库函数。参数说明:__cplusplus是C++编译器预定义的宏,C编译器不会定义;extern "C"可以作用于单个声明,也可以像这里一样作用于一个声明块。实际项目里C++调第三方C库的头文件几乎都这么写,是面试里出现的标准写法。

5.2 虚函数与多态:基类指针到底调用了谁

题库给了一段base、derive1、derive2的继承代码,base里who()是虚函数,p指向不同对象后调用who(),输出依次是base class、derive1 class、derive2 class。这是典型的动态绑定,虚函数表(vtable)在运行期根据实际对象类型决定调用目标。

#include <iostream> using namespace std; class base { public: virtual void who() { cout << "base class" << endl; } }; class derive1 : public base { public: void who() { cout << "derive1 class" << endl; } }; class derive2 : public base { public: void who() { cout << "derive2 class" << endl; } }; int main() { base obj1, *p; derive1 obj2; derive2 obj3; p = &obj1; p->who(); p = &obj2; p->who(); p = &obj3; p->who(); return 0; }

逻辑说明:p是基类指针,指向哪个对象就调用哪个对象的who(),这是虚函数的多态特性。编译器为每个含虚函数的类生成vtable,对象内存里有一个vptr指针指向对应vtable,运行时通过vptr间接调用,所以决定权在对象类型而非指针类型。参数说明:如果把base里的virtual去掉,输出会变成三次base class,因为非虚函数在编译期按指针静态类型绑定。这道题和“派生类指针”那题是同一考点的正反两面。

5.3 位域、函数指针数组与继承访问规则

位域题给了struct bs的定义,unsigned a:4表示a占4位,unsigned :0是空域,强制下一个位域从新的存储单元开始存放,所以b从第二字节开始占4位,c再占4位。这类题考的是位域的内存布局和对齐规则,银行系统做底层协议解析时会用到,笔试主要考“空域会让下一个位域重新对齐”。

(*s[10])(int)的声明也常被拿来考C语言读法:s是一个数组,有10个元素,每个元素是一个函数指针,函数参数是int,返回int*指针。拆解的技巧是先找标识符s,再看右边[10]是数组,向左看到*表示元素是指针,再向左是(函数签名),最后确认返回值。读C复杂声明一直有“顺时针螺旋法则”,多练几道就能形成直觉。

继承访问规则那道题问“派生类中的成员不能直接访问基类中的哪类成员”,答案是private。即使是公有继承,基类的private成员也不对派生类可见,这是封装性的底线。protected可以被派生类访问,但不能被外部访问。

5.4 死锁预防与多线程内存分布

死锁预防有三种措施:采用资源的静态预分配策略,破坏“部分分配”条件;允许进程剥夺其他进程占有的资源,破坏“不可剥夺”条件;采用资源有序分配法,破坏“环路等待”条件。这三条分别对应死锁四个必要条件里的部分分配、不可剥夺和环路,记住对应关系比死记结论更稳。

多线程的内存分布题答案是:栈私有、堆公有。每个线程有自己的栈,用来保存局部变量和函数调用信息;堆是进程级的,所有线程共享。这道题从操作系统到Java都有对应版本,Java里就是栈帧和堆对象的区别,面试经常追问“那线程局部变量存在哪”,答案是线程栈或ThreadLocal持有的堆引用。

6. 避坑与复盘:五类高频失分点和一套复习顺序

这套题刷下来最容易错的不一定是难题,而是“表面看会、实际记混”的基础题。这里列五条最常见的翻车记录,每一条都是真实刷题时会遇到的。

现象常见原因解决方式
Java里直接println非static数组,报编译错误把实例成员当成static直接使用给数组加static,或者先new对象再访问
UNION结果行数和UNION ALL混淆没有区分去重语义先确认题目关键字:UNION去重,UNION ALL不去重
哈希表删除元素后,后续元素查不到开放定址法冲突链断裂用“墓碑”标记代替真正的物理删除
二分查找写出来死循环或漏元素边界更新没加减1while (left <= right)配合left = mid + 1、right = mid - 1
栈输出序列题选错凭直觉判断,没有模拟进出栈手写栈逐步模拟,元素出栈后的顺序必须和栈内逆序一致

提示:这份题库原版是docx格式,部分题目在流传过程中出现了题干和选项错位的情况,比如集合初始化选项被贴到了事件监听的题下面。刷题时以知识点为准,不要纠结选项排版。

复盘顺序我建议这样做:第一遍按章节完整刷,把错题的知识点标签写出来,比如“String传参”“位域”“open addressing删除”;第二遍只看标签不看题,尝试自己口述每个标签对应的结论;第三遍拿这些标签去翻计算机求职面经,找对应的面试追问,看自己能不能接住。这套做法把一份真题库变成了面试模拟题集,比重复刷三遍原题效率高很多。

从那以后,我每次整理这种真题资源,都会强制自己走一遍“错题→知识点标签→面经追问”的对照流程,哪怕只整理一份文档,也会把每个答案背后的概念边界写在旁边。实践证明,能用自己的话讲清楚“为什么选C”的题,才是真正掌握的题。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询