在准备银行Java后端面试时,除了要掌握银行领域的业务逻辑,还需要具备扎实的技术基础。下面我们将详细解答一些常见的技术问题,帮助你更好地准备面试。编辑
1. Mybatis的依赖pom包
Mybatis是一个流行的Java持久层框架,用于简化数据库的操作。使用Maven时,我们需要在pom.xml
文件中添加相关的依赖包。Mybatis的常用依赖如下:编辑
xml
<dependencies>
<!-- Mybatis 核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- Mybatis 与 Spring 整合包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- 数据库连接池(例如 HikariCP) -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.0</version>
</dependency>
<!-- Mybatis日志实现 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-logging</artifactId>
<version>3.5.4</version>
</dependency>
</dependencies>
这里主要包含Mybatis核心包、与Spring整合的包以及数据库连接池等相关依赖。确保根据实际需求添加对应版本。
2. Maven如何解决循环pom依赖
在大型项目中,Maven依赖管理可能会引入循环依赖问题。循环依赖通常表现为两个或多个模块相互依赖,这会导致构建错误。Maven本身没有直接的机制解决循环依赖问题,但以下几种方法可以避免或解决循环依赖:编辑
- 拆分模块:将循环依赖的模块进行拆分,抽取公共模块,降低模块之间的耦合度。
- 使用
provided
作用域 :某些依赖在编译时需要,但在运行时已经由容器提供,可以将其声明为provided
。 - 使用Maven的
dependencyManagement
:集中管理版本,避免直接相互依赖导致的版本冲突。
3. Java的8大基础类型和所占字节
Java有8种原始数据类型,它们分别是:
- byte: 1字节
- short: 2字节
- int: 4字节
- long: 8字节
- float: 4字节
- double: 8字节
- char: 2字节
- boolean: 在Java中,boolean的大小不确定,通常占1位,但具体依赖于JVM实现。
这些基础类型是Java的最基本数据类型,是面向性能优化时的基本构建块。
4. 类加载器
Java中使用类加载器(ClassLoader)来加载类文件。类加载器通常分为以下几种:
- Bootstrap ClassLoader :加载JVM的核心类库(如
rt.jar
)。 - Extension ClassLoader :加载JRE扩展库中的类(如
lib/ext
目录下的类)。 - System ClassLoader:加载类路径(CLASSPATH)下的类。
- 自定义ClassLoader:可以自定义类加载器来加载特定路径下的类文件。
Java类加载器的关键特性是延迟加载,即只有在实际需要类时才加载它们。
5. Redis的缓存穿透和缓存雪崩
-
缓存穿透 :当请求的数据既不在缓存中,也不在数据库中时,导致请求直接访问数据库,造成数据库负载压力。常见解决方法包括:
-
使用布隆过滤器 (Bloom Filter)防止无效请求。
-
将无效数据在缓存中设置为某个默认值,避免重复查询数据库。
-
-
缓存雪崩 :当缓存中的大量数据在同一时刻失效,导致大量请求直接访问数据库。解决方法:
-
设置不同过期时间 :避免缓存的失效时间重合。
-
使用加锁机制避免大量请求同时去数据库拉取数据。
-
6. Redis的key键过期事件
Redis通过过期时间来管理缓存数据。当某个键过期时,Redis会自动将其删除。Redis通过两种方式来处理过期的键:
- 定期删除:Redis定期扫描所有设置了过期时间的键,删除过期键。
- 惰性删除:当键被访问时,Redis检查该键是否过期,如果过期则删除。
可以通过EXPIRE
命令设置键的过期时间。
7. Redis的延迟队列
Redis延迟队列通常基于**ZSet(有序集合)**实现。通过将任务的过期时间作为分数,任务本身作为值,将任务放入有序集合中。当任务的过期时间到达时,消费端可以从队列中获取并执行该任务。实现延迟队列的核心思路如下:
- 使用
ZADD
命令将任务加入到有序集合。 - 使用
ZRANGEBYSCORE
获取指定时间范围内的任务。 - 使用
ZREM
删除已经处理过的任务。
8. RocketMQ的消息最终一致性
RocketMQ的消息最终一致性是通过事务消息来保证的。事务消息分为三部分:
- 发送半消息:生产者发送一条半消息到RocketMQ。
- 执行本地事务:生产者执行本地事务。
- 提交或回滚事务:RocketMQ根据事务执行结果决定是提交消息还是回滚消息。
这种机制保证了在分布式系统中,消息的发送和本地事务操作可以最终一致。
9. 分布式事务(CAP,2PC,3PC,TCC)
-
CAP定理 :指的是在分布式系统中,不可能同时满足一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)三者。通常,在网络分区发生时,系统需要在一致性和可用性之间做出取舍。
-
2PC(两阶段提交) :一种常见的分布式事务协议,分为准备阶段 和提交阶段。缺点是如果出现系统崩溃,可能导致阻塞。
-
3PC(三阶段提交):在2PC基础上加入了一个准备阶段,用于解决2PC中的阻塞问题。
-
TCC(Try-Confirm-Cancel):一种基于补偿机制的分布式事务方案,适用于涉及多个服务的事务。
10. 平时如何学习技术
在技术不断更新的今天,持续学习非常重要。我的学习方法如下:
- 定期阅读技术博客和书籍:通过技术博客和书籍保持对行业趋势的敏感度。
- 动手实践:通过个人项目或开源项目积累实践经验。
- 参加技术社区或会议:通过与同行的交流不断扩展自己的知识边界。
- 解决实际问题:通过解决实际问题来深化对某一技术的理解。
11. 未来发展
未来,技术的发展会更加注重分布式系统 、云计算 、人工智能 和大数据 。我将继续深入学习大数据处理 和机器学习 技术,并关注最新的编程语言 和框架 ,比如Go 、Kubernetes 、AI运维等。
随着技术的不断进步,我们还需要保持对新兴技术的敏感度,不断提升自己的能力以应对新的挑战。
希望这篇文章能够帮助你更好地准备银行业Java后端的面试。如果你对某个技术点有更深入的疑问,欢迎随时讨论!