某游戏大厂 Java 面试题深度解析(四)

在游戏行业的 Java 后端开发面试中,除了基础的编程知识外,面试官还会深入考察候选人对多线程、锁机制、集合框架以及异常处理的理解。本文将带您逐一解析这些常见的 Java 面试题。


一、怎么拼接多个 String?​编辑

在 Java 中,拼接多个字符串有几种常见的方式:

  1. 使用 + 运算符

    适合拼接少量字符串。
    java String result = "Hello" + " " + "World!";![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/86e4867de85f4db481d05503be4898bb~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1762565038&x-signature=GDJMIX6Bl2%2BF9Z%2BP3JYhTVjEMlI%3D)![](<> "点击并拖拽以移动")​编辑

  2. 使用 StringBuilderStringBuffer

    适合拼接大量字符串,StringBuilder 性能较好,StringBuffer 支持线程安全。
    java StringBuilder sb = new StringBuilder(); sb.append("Hello"); sb.append(" "); sb.append("World!"); String result = sb.toString();

  3. 使用 String.join()(JDK8及以后)

    适用于连接多个字符串。
    java String result = String.join(" ", "Hello", "World!");


二、讲讲异常

在 Java 中,异常是指程序在运行过程中发生的错误。异常分为两类:

  1. 检查型异常(Checked Exception)

    这些异常必须显式处理。继承自 Exception,如 IOExceptionSQLException 等。

  2. 非检查型异常(Unchecked Exception)

    继承自 RuntimeException,不强制要求处理。常见的如 NullPointerExceptionArrayIndexOutOfBoundsException

异常处理使用 try-catch 语句,或者通过 throws 抛出:

java 复制代码
try {  
    // 可能抛出异常的代码  
} catch (Exception e) {  
    // 异常处理逻辑  
} finally {  
    // 不论是否异常发生,都会执行的代码  
}  

三、深拷贝和浅拷贝​编辑

  • 浅拷贝(Shallow Copy) :拷贝对象的引用,复制的是对象的内存地址,修改引用对象的属性会影响原对象。编辑

java Person person1 = new Person("Alice", 25); Person person2 = person1; // 浅拷贝

  • 深拷贝(Deep Copy):拷贝对象本身,创建一个新的对象,两个对象的属性相互独立,修改其中一个不会影响另一个。

java Person person1 = new Person("Alice", 25); Person person2 = person1.clone(); // 深拷贝

深拷贝通常需要手动实现,或者使用 clone() 方法配合重写 clone() 接口。


四、Java 的包装类及为什么要有包装类?​编辑

Java 的包装类是为了将基本数据类型包装为对象,以便于在需要对象的场合使用它们。例如:

  • int 的包装类是 Integer
  • double 的包装类是 Double

为什么需要包装类?

  1. 自动装箱与拆箱 :Java 提供了基本数据类型与其对应的包装类之间的自动转换。
    java Integer i = 10; // 自动装箱 int x = i; // 自动拆箱

  2. 可以使用集合类 :Java 集合框架(如 ArrayList)只能存储对象,而无法存储基本数据类型。


五、Java 的集合​编辑

Java 提供了丰富的集合框架,主要有以下几种类型:

  1. List (有序可重复)

    • ArrayListLinkedList

    • 适用于需要按顺序存取元素的场景。

  2. Set (无序不重复)

    • HashSetTreeSet

    • 适用于去重、无序场景。

  3. Map (键值对)

    • HashMapTreeMap

    • 适用于存储和查找键值对的场景。

  4. Queue (队列)

    • LinkedListPriorityQueue

    • 适用于先进先出的数据结构。


六、乐观锁和悲观锁​编辑

  • 悲观锁 :假设会发生并发冲突,每次操作都会加锁,其他线程无法访问被锁的资源,适用于数据冲突概率高的场景。常见的如 synchronizedReentrantLock​编辑

  • 乐观锁 :假设不会发生并发冲突,操作时不加锁,只在提交时检测是否有并发修改,如果有则回滚。常用技术如 CAS (Compare-And-Swap)和 版本号机制​编辑

---​编辑

七、synchronize 和 Lock 的区别

  1. synchronize

    • 是 Java 内置的关键字,简洁易用。

    • 使用时由 JVM 管理锁的获取与释放。

    • 不支持定时锁、尝试锁等高级功能。

  2. Lock

    • 是接口,提供更多的锁操作,如 tryLock()lockInterruptibly() 等。

    • 必须手动加锁和解锁,更灵活,但容易出错。

    • 推荐使用 ReentrantLock


八、synchronized 的底层实现

Synchronized 关键字是通过 对象监视器(Object Monitor)实现的。每个对象都有一个监视器(锁),只有获取了该对象的锁才能执行同步代码块。

  1. 对象锁 :通过 synchronized 修饰实例方法。
  2. 类锁 :通过 synchronized 修饰静态方法。

当线程访问同步代码时,它会尝试获取对象监视器。如果其他线程已经持有监视器,当前线程会进入阻塞队列,直到锁被释放。


九、ReentrantLock 的区别

ReentrantLockLock 接口的实现类,提供了比 synchronized 更灵活的锁操作:

  1. 可重入性:可以在同一线程中多次获得锁。
  2. 可中断性 :通过 lockInterruptibly() 方法可以在等待锁时被中断。
  3. 公平锁 :可以通过设置 true 实现公平锁,保证先请求的线程优先获得锁。

十、ThreadLocal 的原理是什么?

ThreadLocal 是 Java 提供的一种线程隔离的机制。每个线程都会有一个 独立的变量副本 ,即使多个线程访问同一个 ThreadLocal 变量,它们也不会相互影响。

java 复制代码
ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);  

每个线程从 ThreadLocal 中获取的值是独立的,适合用于处理线程局部存储,如数据库连接、用户会话等。


十一、CountdownLatch

CountDownLatch 是 Java 提供的一种同步辅助工具类,允许一个或多个线程等待直到其他线程的操作完成。

  • 用法
    ```java
    CountDownLatch latch = new CountDownLatch(3);

    // 子线程执行任务后调用 countDown()
    new Thread(() -> {
    // 执行任务
    latch.countDown();
    }).start();

latch.await(); // 主线程等待

```

  • 应用场景:可以用来实现多个线程并行执行,主线程等待所有子线程完成后再继续执行。

总结

在游戏大厂的 Java 面试中,除了基本的编程能力外,对 并发编程集合框架异常处理 等核心概念的深入理解也是必考内容。面试官不仅关注你的知识深度,还会考察如何在实际场景中运用这些技术解决问题。因此,掌握这些 Java 基础知识,并在项目中积累经验,是通过面试的关键。

相关推荐
gfdgd xi3 小时前
好消息:KMRE 安卓模拟器现可在Debian/GXDE使用
android·python·架构·bug·deepin·龙芯
Kay_Liang3 小时前
【Hive 踩坑实录】从元数据库初始化到 HiveServer2 启动的全流程问题解决
大数据·linux·hive·hadoop·笔记·mysql·ubuntu
Victor3563 小时前
Redis(97)Redis的日志文件如何管理?
后端
=>>漫反射=>>3 小时前
【Spring Boot Starter 设计思考:分离模式是否适用于所有场景】
java·spring boot·后端·设计规范·自动装配
Victor3563 小时前
Redis(96)Redis的备份和恢复策略如何配置?
后端
用户21411832636023 小时前
AI 驱动教学革命:3 分钟生成专业级动画课件,还能导出视频 GIF!
后端
小马哥编程4 小时前
【软考架构】案例分析-系统设计与建模:数据流图DFD与数据字典
java·数据库·架构·统一建模语言
sibylyue4 小时前
Spring编程式事务和声明式事务
java·数据库·mysql
程序员爱钓鱼4 小时前
Python编程实战 | 函数与模块化编程 - 第三方库的安装与管理(pip使用)
后端·python·ipython