2023招银网络科技Java开发岗面试储备
我在2023年6月11日参加了一场笔试,在杭州申请的职位是Java研发工程师。整个考试过程持续了三个小时左右,并且内容较为全面。我的个人项目基于微服务架构设计,在后续面试中主要考察了Java基础以及网络相关知识。我整理出了一个涵盖了所有复习重点的知识框架。
先简要介绍一下产品:
招银网络科技是招商银行于2002年成立的重要全资子机构之一,在金融科技领域发挥着关键作用。作为招商银行的核心驱动力之一,在数字化转型中持续贡献智慧与力量。
在人才战略方面,
深圳总部
,
杭州总部
,
成都总部
等研发中心致力于营造"让每个人都成为自己主宰者"的价值观,
通过构建完善的职业人薪酬福利体系
以及
开放包容的文化氛围中融合创新文化元素
,
全方位培养 employees' professional capabilities and career development pathways.
招银网络科技Java面试储备
- 一、Java中的Integer和int区别
-
- 对new Integer对象的具体分析
-
- new Integer对象与基本类型int对象的区别
-
- new Integer对象与其父类Integer对象的具体差异
-
- 对于整数常量池缓存机制的具体对比
-
- 分析整数常量池之外其他数据类型的处理方式
-
- 比较整数常量池缓存机制与其他基本类型如int的关系
-
- 不在整数常量池内的值与其他基本类型如int的关系分析
第二章节 面向对象技术的核心特征;第三章节 Spring 技术的相关介绍;第四章节 数据序列化与反序列化的实现原理;第五章节 如何高效管理数据库连接池;第六章节 访问修饰符在Java编程中的具体应用;第七章节 如何优化数据库索引性能;第八章节 设计自身项目的完整流程及注意事项;第九章节 如何解决文档滞后开发的问题?
* 2.研发工程师效率低下
* * 2.1自身能力的问题
* 2.2组织管理上的问题。
- 3.需求文档不够清晰准确
-
- 4.缺少利用在线系统同步项目的人员和进度
十、用户反馈网站登录缓慢,请问如何排查此问题
- 十一、在技术选型出现分歧的情况下,请您如何能够让其他成员接受您的方案?
- 十二、我们应该如何看待公司业务中大多数情况下并不需要用到最新技术和方法?
- 十三、请问您能详细解释一下final、finally和finalize()这三种方法的主要区别吗?
这里有一个全面的汇总 牛客-招银网络科技面试汇总
一、Integer和int区别
Integer和int区别,Integer a=1,Integer b=1,两个Integer用==判断是否相同?
Integer类属于包装类,在八种基本数据类型中占据重要地位。
一般情况下而言,在调用方法时创建一个Integer对象必须经过显式实例化过程;而对于基本类型int,则无需进行显式创建。
值得注意的是,默认情况下Integer对象会被初始化为null值;而对应的int类型则会被初始赋值为0。
从功能特性上来看,在进行对象对比操作时,默认情况下系统会将一个Integer对象自动boxing后与对应的int类型进行数值对比。
举个具体的例子来说:
在一个方法体内部定义如下两种变量:
- 类型为Integer的对象必须通过new关键字进行显式创建:例如 Integer a = new Integer(10);
- 类型为int的基本整数则可以直接赋值:例如 int b = 10;
在这两种情况下的区别在于: - 对于局部变量a来说(堆内存),其实际存储的是指向对应对象的引用;
- 而对于局部变量b(本地内存),其实际存储的是具体的整数值。

二者的具体比较
1.new Integer比较
Integer a = new Integer(10);
Integer b = new Integer(10);
System.out.println(a == b);
代码解读
结果
false
代码解读
原因:局部变量a和局部变量b均为堆内存对象的引用,由于堆内存分配的实际起始地址有所差异,因此两者并不相等。
2.new Integer和int比较
Integer c = new Integer(10);
int d = 10;
System.out.println(c == d);
代码解读
结果
true
代码解读
原因:当对Integer对象和int变量进行相等比较时会触发拆箱操作(unboxing),该操作会将int变量转换为对应的Integer对象进行比较。因此判断它们是否相等。
3.new Integer和Integer比较
Integer e = new Integer(10);
Integer f = 10;
System.out.println(e == f);
代码解读
结果
false
代码解读
原因:局部变量e被定义为堆内存中的对象引用,而f则利用了缓存技术,在基本数据类型的包装类中(如Float和Double),不支持常量池机制。因此,在比较时发现它们的内存地址不同,最终比较结果返回false。
4.Integer常量池缓存比较
Integer g = 10;
Integer h = 10;
System.out.println(g == h);
代码解读
结果:
true
代码解读
原因:
当我们在代码中直接声明变量为Integer类型,并赋值为整数值(如Integer g = 10;)时,默认情况下Java会进行数值自动装箱处理(boxing),将该整数转换为对应的Integer对象。同样地,在这种情况下变量h也会经历相同的处理过程。
// range [-128, 127] must be interned (JLS7 5.1.7)
// static final int low = -128;
// assert IntegerCache.high >= 127;
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
代码解读
通过分析源码可以看出,在i的取值范围介于-128到127之间时,在首次声明时会将i的具体数值存储到缓存中。在此期间的第二次引用操作可以直接调用缓存中已存在的对象实例而不必重新生成一个Integer对象。对于位于该范围内的所有整数值而言,在比较运算中可以直接使用==操作符进行判断较为便捷。而所有超出该范围的数据实例则会在堆内存区域中独立生成并避免重复利用已有的对象资源。值得注意的是,在这一特定范围内选取的g和h变量均属于该数值区间内的成员变量因此它们之间的比较结果必然相等即A和B的结果相等
5.Integer常量池以外的值比较
Integer i = 128;
Integer j = 128;
System.out.println(i == j);
代码解读
结果:
false
代码解读
原因: 第五组便于与第四组进行对比分析, 由于变量i和j不在指定区间范围内, 因此都是在堆上生成新的对象实例, 导致结果判定为false.
6.Integer常量池缓存与int比较
int k = 10;
Integer l = 10;
System.out.println(k == l);
代码解读
结果:
true
代码解读
原因:
Java中Integer类的自动生成机制能够实现数值类型的转换与存储。
当变量l被定义时,Java会将其自动生成并赋值为一个Integer对象:l = Integer.valueOf(10)。
在与基本数据类型进行比较时,则会触发自动生成机制:k与l.intValue(10)进行比较的结果等同于将两者转换为相同的基本数据类型的值。
最终结果自然等于true。
7.Integer常量池缓存以外与int比较
int m = 128;
Integer n = 128;
System.out.println(m == n);
代码解读
结果:
true
代码解读
如同第6点所述,在对比Int与Integer时
二、面向对象的三大特性
封装、继承、多态。什么时候用到继承?多态具体讲一下?
答:面向对象是一种重要的思维方式。这种思维方式使得我们能够将复杂的问题变得相对简单。通过这种方法的应用,我们可以实现角色的转变——即从传统的执行者转变为系统的管理者或设计者。面向对象编程的核心理念体现在其三大特性之中:封装、继承与多态
封装即为将事物打包成一个实体,并对外提供稳定的公共接口。该实体与外界通过固定的 API 连接,并对外提供稳定的公共接口。当该接口发生变化时,则不会影响到外部调用者的行为。
继承 :基于现有类型的子类型生成,并能够继承并保持其基础类型的特征。子类型能够通过覆盖或重新定义功能来提升基础类型的能力。
多态:其本质则体现在一个程序中能够执行多种不同功能的方法;具体而言,则主要通过以下三种途径实现:
o 采用子类别覆盖父类别以完成
o 在同一个体内部借助于方法重载功能
o 利用子实例模拟主实例的功能
覆盖(@Override) :
覆盖也叫重写 ,是指子类和父类之间方法的一种关系,比如说父类拥有方法A,子类扩展了方法A并且添加了丰富的功能。那么我们就说子类覆盖或者重写了方法A,也就是说子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。
该重写的方法需满足“一大、两小、两同”的要求。其中,“一大”要求所选重写的类的访问修饰符级别不低于(或等于)其父类;“两小”则要求所选重写的类的返回值类型和声明异常的数量不超过其父类;“两同”方面,则所选重写的类必须与原类具有完全相同的成员方法名称及其参数列表。
重载 :
重载即在一个类中(包括父类)包含多个同名但有差异的方法。这些方法若参数个数、顺序和类型的差异都存在,则可视为重载。
若仅凭修饰符、返回值及抛出异常的不同,则是两个相同的方法。
仅当返回值不同时才可被视为重载。
通过将子类对象用作父类对象来实现多态
向上转型策略 :
子类对象转换为父类别时, 父类别既可以是接口。
公式:Father f = new Son();
代码解读
Father是父类或接口,Son是子类。
向下转型 :
父类对象转为子类。
公式:Son s = (Son) f;
代码解读
在进行向上迁移时无需额外操作,在进行向下迁移时必须执行相应的转换步骤
三、Spring
Spring了解吗?用过吗?
答
Spring Framework特性:
零干扰 :在使用 Spring Framework 构建应用程序时会带来极小程度的架构影响。不仅领域模型能够实现零污染;功能性组件通过仅需几个简单的注解即可标记即可实现轻量化处理,并且彻底避免了原有架构的任何破坏,并且能够进一步简化组件间的耦合关系。从而使得基于Spring开发的应用程序架构清晰、模块化且易于维护。
反转控制模式
反转控制模式
基于切面设计模式
容器:Spring IOC 是一个专门负责管理和协调组件对象生命周期的容器。它为组件提供了统一的资源管理服务,并且通过容器化的管理方式简化了组件的操作流程。这种设计使得开发者无需关注组件创建过程中的复杂细节即可高效地完成开发任务,在提升开发效率的同时也降低了操作难度。
组件化:通过简单的组件配置组合成一个复杂的应用来实现功能。能够在 Spring 中采用 XML 和 Java 注解来组合这些对象。从而让我们能够基于一个个功能明确且边界清晰的模块有序地构建出超大型复杂的系统。
声明式 :大量早期需要通过编码实现的功能,现在只需声明其功能即可由框架自动处理。
四、序列化反序列化
序列化了解吗?序列化和反序列化,什么时候用?当时怎么做的?
序列化 :将数据结构或对象编码为二进制数据流的过程
反序列化 :二进制数据流解码为数据结构或者对象的过程
使用场景;
- 将程序运行时生成的对象存储于特定的文件存储介质或数据库表结构;
- 用于将数据传输至目标服务器的网络传输过程。
个人最早接触的时候
工作中
Jackson的主要类ObjectMapper
ObjectMapper mapper = new ObjectMapper();
// 反序列化
Student student = mapper.readValue(jsonString, Student.class);
// 序列化
byte[] byteArr = mapper.writeValueAsBytes(student);
代码解读
五、数据库连接池
数据库,连接池,为什么要用连接池?为什么连接耗费资源?
获得、关闭连接
六、访问修饰符
访问控制,protected、无显式指定时分别的访问范围
| 修饰符 | 同一个类 | 同一个包 | 不同包的子类 | 任何地方 |
|---|---|---|---|---|
| private | √ | |||
| default | √ | √ | ||
| protected | √ | √ | √ | |
| public | √ | √ | √ | √ |
七、数据库索引
数据库,索引,是不是越多越好?为什么?
答案是否定的。尽管在某些情况下增加索引有助于提升数据库查询速度(例如通过使用B+树结构),但过度依赖索引并非万善之策。实际上,在实际应用中(例如MySQL),过多的索引可能会导致数据库运行效率下降(例如每项操作都会导致相关联的所有索引被更新),并且随着表结构的变化(例如频繁插入、修改或删除数据),维护大量独立的B+树结构会显著增加存储资源占用情况(例如每个独立的索引都需要维护一个B+树结构)。此外,在执行插入、修改或删除操作时(例如当大量数据被频繁访问时),这些操作不仅会导致相关联的所有索引被更新(例如可能导致MySQL运行效率受到影响,并在内存受限的情况下表现得更为明显))。因此,在设计数据库 schema 时需要权衡其与存储资源占用情况之间的关系(例如通过合理的主键设计与非主键组织方式)。
八、介绍一下作为子模块负责人设计自己项目的整体过程
一、 项目基本介绍
- 项目背景
- 项目的完结时间
二、 项目职责(量化)
- 通过进行需求评估可以明确项目的时间安排。
- 在项目实施过程中进行系统架构设计。
- 完成接口文档编写任务的同时制定详细的接口设计方案,并合理分配工作量。
- 该系统能够通过创新技术实现显著提升。
- 总结个人参与项目的体会:一是认识到团队协作的重要性;二是深刻体会到规范命名对理解和维护代码的作用;三是认识到模块化设计原则对提高系统可维护性的作用。
九、针对文档滞后开发的问题,你认为如何解决
1.缺乏合理的进度安排
1.1为系统测试安排足够的时间
一种情况是测试中存在大量需求需要逐一处理,这会导致项目的延期。另一种情况是在测试过程中发现了诸多问题和bug,由于难以预估发现这些缺陷所需的时间,因此若未能为测试预留足够时间,则可能导致项目在发布前因延期而受到影响。此时能够采取的方式是记录不严重的缺陷,等待下一次需求迭代时再解决。不过其实更好的做法是在早期进度规划阶段就预留足够的系统测试时间。
1.2 调整进度计划,并对功能优先级进行优化,在下次迭代中进行处理
当发现初始预期的进度明显不符并低估了项目的复杂度时
2.研发工程师效率低下
2.1自身能力的问题
例如刚刚毕业又缺乏实践经验的专业人员往往难以胜任工作;在技术能力上与同行相比略显不足的情况下工作效率会有明显下降;有些效能水平较高的专业人员的工作效能较普通员工高出十倍以上;这也是为什么宁可斥资招募高水平的专业人才也不愿容忍低效能的人才成长;不仅仅局限于代码质量不高这样的问题;这会导致整个项目的进程严重滞后
2.2组织管理上的问题。
比如分工不明确,流程不明确。
3.需求文档不够清晰准确
正式记载具有不可替代的作用,在项目管理过程中必须予以重视,唯有将各类意见详细记载下来,方能让各种矛盾逐渐明辨是非,从而形成共识,并能在实践中不断完善各项决策方案,最终形成众多关键决策往往能够清晰明确地体现出来;通过构建标准化文档体系,可以有效降低项目经理与团队协作中的信息传递障碍.
√ 产品文档书写需以求严谨且无误地呈现内容。
√ 在编写功能说明的同时,请配合展示界面设计的相关演示。
√ 功能说明需涵盖以下要点:场景设置说明;字段参数记录;必要提示信息;操作步骤概述;异常处理方案分析;关键注意事项罗列。
√ 每次发生变更时,请及时更新文件版本信息,并明确标明修改位置;确保相关人员及时知悉。
4.缺少利用在线系统同步项目的人员和进度
该系统的显著优势在于团队成员可以根据项目进展灵活调整个人工作时间。特别是在处理零散琐碎的小需求时, 如果团队成员缺乏对彼此时间安排的了解, 则可能导致长时间排队.
十、用户反馈网站登陆缓慢,遇见这个问题如何排查
1.响应时间过长
在网站性能优化过程中发现DNS解析速度较慢的现象时,请您注意这一问题可能属于罕见情况,在影响网站访问的各种因素中仅占较小比例。相比之下,在常见的网络环境中本地DNS服务故障更为普遍。
ping www.baidu.com
代码解读
2.建立链接慢
当我们识别出服务器IP后,则引导客户端与服务器进行连接。此连接的速度与性能主要受线路质量的影响。常见问题包括跨越线路的访问请求、远距离地域间的访问以及中继网络出现故障等情况。

可以通过CDN进行加速;如果线路出现短暂的不稳定性,则可能需要等待网络运营商进行线路调整;同时,在尝试重启路由器光纤猫之前,请确保网络环境已达到最佳状态;这通常只是暂时缓解问题,并不能完全解决问题。
3.执行时间慢
当 server 健康运行时(即在近似理想状态下),其响应时间几乎可以忽略不计;但如果 server 某个关键组件出现性能瓶颈(如 CPU、内存、磁盘 IOPS 或带宽某一项指标异常),那么即使其他方面一切正常也会导致访问速度受限或下降。排查建议:如果观察到曾经快速访问网站如今突然变慢,并且假设网络状况正常情况下,则可以通过云主机监控工具查看各资源使用情况(推荐使用 Zabbix 等工具对各项资源进行实时监控);而对于虚拟主机则可以直接执行简单命令或者直接访问图片文件来判断当前机器上的各项资源占用情况。
4.程序Bug
虽然大多数情况下程序运行缓慢是导致问题的主要原因, 但是由于其高度的领域特异性和不常出现的问题, 数据库相关的问题往往容易被忽视。排查方法: 通常需要由专业的程序员进行详细调试, 常见于如程序死循环、数据库死锁等问题中。对于MySQL服务器而言, 开启慢日志功能并使用root账户登录是一个有效的排查手段。
show full processlist;
代码解读
获取到正在执行的查询语句,对其进行explain分析。
十一、技术选型发生分歧如何说服其他成员接受你的方案
我们采用系统化的方法将复杂性进行了分类处理
项目经理在处理冲突时应避免无差别对待的做法。当遇到性质轻微、无需投入大量时间和精力解决的矛盾时, 项目负责人应引导涉事各方采取退让或协商的方式解决问题。冷处理策略是一种既简洁又有效的应对措施, 特别是在需要时间恢复情绪或立即行动可能带来负面效果的情况下尤其适用。然而, 这种方法的缺点在于可能导致小规模冲突逐渐演变为更大规模的问题。
(2)缓和
项目经理积极在冲突中寻求达成共识的地方,并尽量最大限度地淡化或避开存在分歧的领域。为了避免讨论可能伤害感情的话题,在处理过程中不去涉及可能导致矛盾的问题。从而有助于缓和冲突。这种方法重视成员之间的相互关系,并非单纯为了解决问题;因此,在一定程度上有助于缓和冲突形势但无法彻底解决问题。
(3)各方的妥协
所谓的‘折中’或‘调和折中’是在成员之间通过协商,在双方共同探讨的基础上形成的共识。为了实现一种调和折中的方法来解决冲突,并让各方都能获得一定程度上的满足,在势均力敌或焦点问题复杂的情况下可考虑采取这一策略。特别需要注意的是不宜过早采用这种方法;如果过于急切地采取这种方法可能会忽视问题的核心从而导致单纯依靠‘妥协’无法彻底解决问题的情况出现。
(4)强制执行
这是与妥协对立的解决策略。当项目经理需要在短时间内处理重大事件或采取非同寻常行动(如不考虑其他因素),以强制执行的方式确保决策效率时,则采用这种方法。这种方法认为,在冲突中迅速解决争端比维护成员间的关系更有价值。在这种情况下,项目经理通常赋予自身权力来处理冲突,并坚定地支持自己的观点而否定他人的观点——表现出专断的行为特征。这使得冲突双方可能被迫服从于项目经理的决定。然而,在这种情况下使用这种方法会导致以下结果:项目成员可能会按命令行事而不考虑个人意愿;他们可能会感到不满和抵触情绪;甚至会产生怨恨心理;从而导致工作氛围紧张。
(5)直面挑战
被称为问题解决型模式,在这种模式下, 项目经理必须直面冲突, 不仅要在结果上给予关注, 同时也必须重视团队成员之间的关系质量。在这个框架下, 团队成员之间会彼此坦诚相待, 采取积极、友善的态度来应对冲突, 并愿意通过沟通来化解矛盾。每位成员都旨在共同解决问题, 在理解他人的观点与想法的同时, 也会在必要时放弃或重新界定自己的立场, 最终消弭分歧与矛盾。
当项目中的冲突难以明确界定时,在双方争执不下的情况下,
可由上级管理人员通过调查研究来确定谁是对方还是错误的一方,
然后通过仲裁程序来解决问题。
而如果情况紧急、亟需解决问题时,则可采取这种措施。
反之,在这种情况下可能会挫伤团队士气、降低开发效率并影响整体目标的达成。
十二、如何看待公司业务大部分情况用不上最新的技术
技术的服务对象主要是业务层面的需求与运作,
而业务的核心目标在于满足商业需求。
新技术虽然可以在某些场景下暂时发挥作用,
但掌握新技术必须深入理解其背后的技术原理。
设计模式与软件开发理念都是构建系统架构的重要组成部分。
十三、final、finally、finalize()的区别
该关键字用于声明Object属性(其属性不可交变)、Method(其方法不可覆盖)以及Class(其类不能继承)。该关键字负责处理所有异常情况,并在每一轮循环中都会被执行。该关键字属于Object类的一个成员函数,在每一轮循环中都会被执行。该关键字负责回收被回收对象并进行资源释放包括但不限于关闭文件等操作。
