和平至上漫画

核心内容摘要

告别剧荒!麻花影视超全韩剧清单,带你沉浸式领略极致视听盛宴
台湾电影的璀璨明珠:苏畅“惊艳三部曲”的绝代风华

葫芦娃不卖药,但我们卖的,是健康与希望!

Java实习模拟面试之Java基础篇

题高频核心考点深度解析适合人群准备Java后端实习/校招的同学关键词Java基础、面试八股文、 vs equals、引用类型、泛型擦除、反射优化、序列化字数约3500字 |阅读时间10分钟在Java实习或校招面试中基础知识的扎实程度往往是决定你能否进入下一轮的关键。

很多同学背了“八股文”但一被追问就露怯。

本文通过真实模拟面试对话的形式带你深入理解8道高频Java基础题并附带面试官连环追问助你不仅“答得出”更能“讲得透”。

面试题1说说Java中和equals()的区别以及hashCode()与equals()的关系面试官提问“请解释一下和equals()的区别另外为什么重写equals()时通常也要重写hashCode()”候选人回答好的是运算符用于比较两个变量是否引用同一个对象即内存地址是否相同。

对于基本数据类型它比较的是值对于引用类型比较的是堆内存地址。

equals()是Object类中的方法默认行为和一样。

但像String、Integer等类重写了equals()使其比较的是对象的内容是否相等。

举个例子Strings1newString(hello);Strings2newString(hello);System.out.println(s1s

;// false地址不同System.out.println(s

equals(s

);// true内容相同至于hashCode()和equals()的关系——Java规范规定如果两个对象通过equals()判断为相等那么它们的hashCode()必须返回相同的整数。

反之则不一定成立哈希冲突。

这个约定主要是为了保证对象在HashMap、HashSet等基于哈希表的集合中能正确工作。

比如如果只重写equals()而不重写hashCode()两个逻辑上相等的对象可能被存入 HashMap 的不同桶中导致get()找不到数据。

面试官追问“那如果我只重写hashCode()不重写equals()会有什么问题”候选人这种情况虽然不会报错但会导致逻辑混乱。

例如两个hashCode()相同的对象equals()却返回false这会让 HashSet 认为它们是不同元素而重复存储违背了 Set 的“唯一性”语义。

所以必须同时重写两者且保持一致性。

面试题2String、StringBuilder、StringBuffer 的区别和使用场景面试官提问“这三个类都用来处理字符串它们到底有什么区别什么时候该用哪个”候选人回答三者的核心区别在于可变性和线程安全性类型可变性线程安全性能底层结构String不可变安全因为不可变拼接慢每次生成新对象final char[]StringBuilder可变不安全快char[]可扩容StringBuffer可变安全方法加synchronized较慢同上使用建议如果字符串内容不会改变如配置项、常量用String如果在单线程环境中频繁拼接字符串如循环构建 SQL用StringBuilder如果在多线程共享的场景下需要拼接极少见才考虑StringBuffer。

实际开发中99% 的字符串拼接场景都用StringBuilder因为现代 Web 应用大多是无状态的单线程处理请求。

面试题3Java中的四种引用类型及应用场景面试官提问“除了强引用你还知道哪些引用类型它们分别用在什么场景”候选人回答Java 从 JDK

2 开始引入了java.lang.ref包定义了四种引用强度强引用Strong Reference最常见的形式Object obj new Object();只要强引用存在GC永远不会回收该对象。

软引用SoftReference内存不足时才会被回收。

应用场景实现内存敏感的缓存比如图片缓存。

当 JVM 快 OOM 时自动释放缓存。

弱引用WeakReference下次 GC 时就会被回收无论内存是否充足。

应用场景ThreadLocal的 key 就是弱引用防止内存泄漏也用于监听器、缓存等临时对象。

虚引用PhantomReference最弱无法通过它获取对象仅用于在对象被回收时收到通知。

应用场景配合ReferenceQueue实现资源清理比如 NIO 的DirectByteBuffer回收。

记住口诀软缓存、弱监听、虚回收。

面试题4接口和抽象类的区别什么时候用接口什么时候用抽象类面试官提问“接口和抽象类都能定义规范怎么选择”候选人回答主要区别如下特性抽象类接口关键字abstract classinterface继承方式单继承多实现成员可有构造器、字段、具体方法JDK8 可有default方法但不能有实例字段设计目的is-a关系代码复用can-do关系能力契约使用原则如果多个类有共同的代码逻辑如公共字段、工具方法用抽象类如果只是定义行为规范且希望类能实现多个能力如Runnable Serializable用接口。

✅ 举例HttpServlet是抽象类提供了service()等通用逻辑List、Comparable是接口定义“能做什么”。

面试题5Java异常体系结构Checked Exception 和 Unchecked Exception 的区别面试官提问“Java 的异常是怎么分类的Checked 和 Unchecked 有什么不同”候选人回答Java 异常体系以Throwable为根Throwable ├── ErrorJVM 错误如 OutOfMemoryError └── Exception ├── RuntimeExceptionUnchecked └── 其他 ExceptionCheckedChecked Exception受检异常编译器强制要求处理try-catch 或 throws如IOException、SQLException。

表示可预期的外部问题程序应尝试恢复。

Unchecked Exception非受检异常包括RuntimeException及其子类如NullPointerException、IllegalArgumentException和Error。

通常是程序逻辑错误不应被捕获而应修复代码。

建议不要滥用 checked exception现代框架如 Spring倾向于将 checked exception 包装为 unchecked简化调用方处理。

面试题6Java中的泛型是什么泛型擦除是怎么回事面试官提问“泛型解决了什么问题为什么说 Java 泛型是‘伪泛型’”候选人回答泛型Generics是在编译期提供类型安全检查的机制避免强制类型转换和ClassCastException。

例如ListStringlistnewArrayList();list.add(hello);// list.add(

; // 编译报错Stringslist.get(

;// 无需强转但 Java 的泛型是通过类型擦除Type Erasure实现的——编译后泛型信息会被擦除替换为上限类型通常是Object。

所以上面的ListString在运行时就是List。

带来的限制不能new T()不能使用instanceof T不能创建泛型数组。

为什么这么设计为了向后兼容JDK

4 之前的代码。

C# 的泛型是真泛型运行时保留类型但 Java 选择了兼容性优先。

面试题7Java反射机制的原理和应用场景反射的性能问题如何优化面试官提问“反射很慢为什么还要用怎么优化”候选人回答反射原理通过Class对象动态获取类的结构字段、方法、构造器并在运行时调用绕过编译期类型检查。

典型应用场景Spring 的依赖注入AutowiredJDBC 加载驱动Class.forName()ORM 框架如 MyBatis 映射结果集到对象单元测试框架JUnit 反射调用测试方法。

性能问题反射调用比直接调用慢10~50 倍因涉及权限检查、参数封装等JIT 无法优化反射代码。

优化手段缓存Method/Field对象避免重复查找使用setAccessible(true)关闭访问检查提升 20% 性能在高频场景下可用LambdaMetafactory或MethodHandle替代接近直接调用性能。

✅ 示例Spring 在启动时就缓存了所有 Bean 的反射元数据运行时几乎无开销。

面试题8Java中的序列化和反序列化serialVersionUID的作用面试官提问“什么时候需要序列化serialVersionUID到底有什么用”候选人回答序列化是将对象转换为字节流的过程用于网络传输如 RPC持久化存储如缓存到磁盘深拷贝。

实现方式类实现Serializable接口标记接口。

serialVersionUID的作用它是序列化版本的唯一标识。

反序列化时JVM 会检查.class文件中的serialVersionUID是否与字节流中的匹配。

如果不显式声明JVM 会根据类结构自动生成一个对字段、方法敏感一旦类结构变化如加字段自动生成的 UID 会变导致反序列化失败InvalidClassException。

最佳实践显式声明private static final long serialVersionUID 1L;并在兼容性允许的情况下保持不变。

⚠️ 注意如果类不需要跨 JVM 或长期存储可以不关心 UID但涉及网络传输或持久化必须管理好版本。

总结这8道题覆盖了 Java 基础中的核心概念看似简单但每一题都能延伸出深度。

面试官往往通过“连环追问”考察你是否真正理解底层原理。

建议不要死记硬背而是结合源码如String.equals()、HashMap、调试、实验去验证。

只有理解了“为什么”才能在压力面试中从容应对。

如果你觉得本文有帮助欢迎点赞、收藏、转发评论区互动你在面试中被问过哪些“灵魂拷问”欢迎分享

lnb两年半1.3.7-lnb两年半应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123