面向经验丰富的 Java 面试问题50+ 面向程序员的核心 Java 面试问题及答案
披露:本篇文章包含附属链接;如果您通过本文提供的不同链接购买产品或服务,我可能会收到报酬。
各位 Java 程序员们,大家好!过去几年,我一直在分享大量的Java 面试题、答案和讨论。许多读者希望我把它们整理在一起,方便大家在准备面试时查阅。
这篇文章就是由此产生的。
本文包含50 多个 Java 面试问题和答案,涵盖所有重要主题,如核心 Java 基础知识、Java 集合框架、Java 多线程和并发、Java IO、JDBC、JVM 内部、编码问题、面向对象编程等。
这些问题摘自我参加过的各种 Java 面试,也有一些是我的朋友、读者和其他人根据自身经验分享的。它们绝对不难。你可能已经在电话面试或线下面试中见过它们了。
这些问题对于复习重要的 Java 主题(如核心 Java 概念、多线程、lambda、Streams 和集合)也非常有用。
我还分享了一些有用的资源,供进一步学习和提高,例如Udemy 上的完整 Java 大师班课程,您可以加入该课程来提高和填补 Java 技能的空白。
我还撰写了有关 Java 面试准备的书籍,例如《Grokking the Java Interview》和《Grokking the Spring Boot Interviews》,在其中我分享了很多针对 Java 开发人员的问题。
如果你今年正在准备 Java 面试,你也可以在 Gumroad 上获取我的 Java + Spring 面试 + SQL 捆绑包,使用代码friends20还可获得 20% 的折扣
那么我们还在等什么呢?以下列出了初学者和经验丰富的 Java 开发人员在面试中经常被问到的一些问题。
面向 2 至 3 年经验程序员的 50 道 Java 面试题
所以,为了不浪费大家的时间,我整理了一些面向初学者的Java 核心面试常见问题。这份清单主要针对初学者和经验不足的开发者,例如拥有 2 到 3 年 Java 经验的开发者。
1) Java 如何实现平台独立性?(答案)
提示:字节码和 Java 虚拟机
答案:Java 通过生成字节码并在 Java 虚拟机上运行来实现平台独立性,Java 虚拟机将这些字节码转换为平台相关的机器码。由于 JVM 因平台而异,我的意思是,对于 Windows,您需要单独的 JRE(其中包含 JVM),而对于 Linux,您需要单独的 JRE。由于 Java 代码不会被编译为本机机器码,而是被编译为字节码,这使得它们具有平台独立性。
2) Java 中有什么 ? (答案) 提示:JVM 的一部分,用于加载类的字节码。您可以编写自己的字节码。 答案:在 Java 中,代码被封装在类中,因为 Java 是面向对象的编程。您的程序是在类中编写的,为了执行它们,JVM 会加载包含您代码的类。**ClassLoader**
负责加载类的 JVM 组件称为类加载器。主要有三种类加载器:引导类加载器、扩展类加载器和应用程序类加载器。
下面是一个漂亮的图表,展示了每个 Java 类加载器的功能:
3)编写一个 Java 程序来检查一个数字是偶数还是奇数?(答案)
提示:您可以使用按位运算符,如按位与,记住,偶数在二进制格式的末尾为零,奇数在二进制格式的末尾为 1。
4) Java 中和的区别 ? (答案) 提示:和之间的所有区别都适用于此,例如排序、重复、随机搜索等。请参阅Richard Warburton 撰写的《Java 基础:集合》,了解有关 ArrayList、HashSet 和 Java 中其他重要集合的更多信息。**ArrayList**
**HashSet**
List
Set
5)单例模式中的双重检查锁是什么?(答案)
提示:两次检查实例是否初始化,第一次不使用锁,第二次使用锁。
6)如何在 Java 中创建线程安全的单例?(答案)
提示:有很多方法,比如使用枚举、使用双重检查锁定模式或使用嵌套静态类。
7)Java 中 Serializable 和 Externalizable 之间的区别?(答案)
提示:Externalizable 让您可以更好地控制序列化过程。
8) 何时在 Java 中使用瞬态变量?(答案)
提示:当你想让实现了 Serializable 接口的类中的变量不可序列化时。换句话说,你可以将其用于不想保存其值的变量。请参阅《Java 完全大师班》,了解 Java 中的瞬态变量。
9)Java 中的 temporary 变量和 volatile 变量有什么区别?(答案)
提示:完全不同,一个用于序列化环境,另一个用于并发环境。
10)何时在 Java 中使用 volatile 变量?(答案)
提示:当您需要指示 JVM 某个变量可以被多个线程修改,并提示 JVM 不缓存其值时。
11)我们可以覆盖 Java 中的私有方法吗?(答案)
提示:不可以,因为它在子类中不可见,这是覆盖 Java 中方法的主要要求。
12) Java 中**Hashtable**
和 的 区别?(答案**) **提示:有几个但最重要的是,它是同步的,而 while不是。与 相比,它也是比较老旧且速度较慢的。**HashMap**
Hashtable
HashMap
HashMap
13) Java 中**List**
和 的 区别?(答案) 提示:是有序的,允许重复。是无序的,不允许重复元素。**Set**
List
Set
14) Java 中**ArrayList**
和 的 区别(答案) 提示:有很多,但最重要的是是非同步的,速度很快;而是同步的,速度很慢。它也是像 这样的遗留类。**Vector**
ArrayList
Vector
Hashtable
15) Java 中**Hashtable**
和的 区别?(答案) 提示:更具可扩展性。请参阅Richard Warburton 撰写的《Java 基础:集合》了解更多信息。**ConcurrentHashMap**
16)如何 **ConcurrentHashMap**
实现可扩展性?(答案)
提示:通过将地图分成几段,并且仅在写入操作期间锁定。
17) 你需要重写哪两个方法才能像 在 中**Object**
使用 ?(答案) 提示:equals 和 hashcode**Key**
**HashMap**
18) Java 中 wait 和 sleep 的区别?(答案) \
提示:该wait()
方法释放锁或监视器,而 sleep 则不会。
**notify**
19) Java 中和 的 区别**notifyAll**
?(答案)
提示:notify
通知一个随机线程正在等待该锁,notifyAll
通知所有正在等待监视器的线程。如果你确定只有一个线程在等待,那么使用notify
,否则notifyAll
最好使用 。请参阅Java Champion Heinz Kabutz 的“线程基础迷你课程”,了解更多关于线程基础知识。
**equals()**
20) 为什么要在 Java 中覆盖 hashcode 以及?(答案)
提示:为了符合 equals 和 hashcode 契约,如果您计划将对象存储到集合类中,则需要这样做,例如HashMap
或ArrayList
。
21)的负载因子是什么 **HashMap**
意思?(答案)
提示:触发调整大小的阈值HashMap
通常为0.75,这意味着HashMap
如果它已满75%,则自行调整大小。
22) Java 中**ArrayList**
和的 区别?(答案) 提示:数组和链表类似,一个允许随机搜索,一个不允许。链表的插入和删除操作比较简单,而数组的查找操作则比较简单。请参阅Richard Warburton 在 Pluralsight 上开设的课程“Java 基础:集合”,了解更多关于 Java 中集合数据结构的知识。**LinkedList**
23) Java 中**CountDownLatch**
和的 区别?(答案)提示:屏障被打破后 可以重用,但计数达到零后不能重用。**CyclicBarrier**
CyclicBarrier
CountDownLatch
24)什么时候在 Java 中使用**Runnable**
vs ?( 答案) 提示:总是**Thread**
25) Java 中 Enum 类型安全的含义是什么?(答案)
提示:这意味着你不能将不同 Enum 类型的实例分配给 Enum 变量。例如,如果你有一个像DayOfWeek
day 这样的变量,那么你不能从枚举中为其赋值DayOfMonth
。
26)Java 中 Integer 的自动装箱是如何工作的?(答案)
提示:通过使用valueOf()
Java 中的方法。
**PATH**
27) Java 中和的 区别**Classpath**
?(答案)
提示:PATH
是操作系统使用的,Classpath
是 JVM 用来定位 Java 二进制文件(例如 JAR 文件或 Class 文件)的。请参阅《Java 基础:核心平台》,了解更多关于PATH
、Classpath
和其他 Java 环境变量的信息。
28) Java 中方法重载和覆盖有什么区别?(答案)
提示:覆盖发生在子类中,而重载发生在同一个类中。此外,覆盖是运行时活动,而重载在编译时解析。
29)在 Java 中,如何防止一个类被子类化?(答案) \
提示:只需将其构造函数设为私有即可
30) 如何限制你的类被客户端使用?(答案) \
提示:将构造函数设为私有,或者从构造函数中抛出异常
**StringBuilder**
31)Java 中和 的 区别**StringBuffer**
?(答案)
提示:StringBuilder
不是同步的,StringBuffer
是同步的。
32) Java 中多态性和继承的区别?(答案)
提示:继承允许代码重用,并构建类之间的关系,而多态性则提供了动态行为。请参阅Coursera 上的面向对象 Java 编程:数据结构及其他专业课程,了解更多关于 OOP 特性的信息。这是面向初学者最深入的课程之一。
顺便说一句,如果你觉得Coursera的课程很有用(因为它们是由世界各地知名公司和大学创建的),我建议你加入Coursera Plus,这是Coursera的一项订阅计划,可以让你无限制地访问其最受欢迎的课程、专业课程、专业证书和指导项目。它每年的费用约为399美元,但绝对物超所值,因为你可以获得无限量的证书。
33) 我们可以在 Java 中覆盖静态方法吗? (答案) \
提示:不可以,因为覆盖在运行时解析,而静态方法调用在编译时解析。
34) 我们可以访问 Java 中的私有方法吗? (答案) \
提示:可以,在同一个类中可以,但不能在类外访问
35) Java 中接口和抽象类的区别?(答案)
提示:从Java 8开始,两者的区别变得模糊。但是,一个 Java 类仍然可以实现多个接口,但只能扩展一个类。
36) Java 中 DOM 和 SAX 解析器的区别?(答案) \
提示:DOM 会将整个 XML 文件加载到内存中,而 SAX 则不会。它是一个基于事件的解析器,可以用来解析大型文件,但 DOM 速度更快,更适合解析小文件。
37) Java 中 throw 和 throws 关键字的区别?(答案) \
提示:throws 声明方法在发生错误时可能抛出的异常,而 throw 关键字实际上会抛出异常。请参阅Java 基础知识:异常处理,了解更多关于 Java 异常处理的信息。
38) Java 中的故障安全和快速失败迭代器之间的区别?(答案)提示:故障安全迭代器在迭代过程中检测到底层集合的外部变化时
不会抛出ConcurrentModificationException
异常。fail-fast
39) Java 中迭代器和枚举的区别?(答案)
提示:迭代器还允许您在迭代时删除元素,而枚举不允许这样做。
**IdentityHashMap**
40) Java 中有什么? (答案)
提示:A Map
,它使用==
相等运算符而不是方法来检查相等性equals()
。
41) **String**
Java 中的池是什么?(答案)
提示:字面量池String
。记住,在 JDK 7 中,它从永久代空间移到了堆中。
42) **Serializable**
Java 中类可以包含不可序列化的字段吗?(答案**)
**提示:可以,但你需要将其设为静态或瞬态。
43)Java 中 this 和 super 的区别? (答案)
提示:this 指的是当前实例,而 super 指的是超类的实例。
44) Java 中**Comparator**
和的 区别? (答案) \ 提示:定义自定义排序,定义对象的自然顺序,例如 的字母顺序。 请参阅完整的 Java 大师课,了解有关 Java 排序的更多信息。**Comparable**
Comparator
Comparable
String
45) Java 中**java.util.Date**
和 的 区别?(答案) 提示:前者包含日期和时间,而后者仅包含日期部分。**java.sql.Date**
46)为什么在 Java 的类中声明 wait 和 notify 方法 **Object**
?(答案)
提示:因为它们需要锁,而锁只能对对象可用。
47)为什么 Java 不支持多重继承?(答案)
提示:由于使用 C++ 的体验不好,所以不支持,但在 Java 8 中,某种意义上它确实支持多重继承 ---Type
现在 Java 中只是不支持多重继承。
48) Java 中 checked 异常和非checked异常的区别?(答案)
提示:如果是checked异常,你必须使用catch块来处理异常;如果是unchecked异常,那就由你自己决定了,编译不会打扰你。
49)Java 中 Error 和 Exception 的区别?(答案)
提示:我打字太累了,请查看答案
50)Java 中竞争条件和死锁的区别?(答案)
提示:两者都是并发应用程序中发生的错误,一个是由于线程调度而发生的,而另一个是由于编码不当而发生的。请参阅Java 中的多线程和并行计算,了解有关死锁、竞争条件和其他多线程问题的更多信息。
其他资源
- Java 面试指南:200 多个面试问题和答案
- Spring 框架面试指南 --- 200+ 问题与解答
- 准备面试 作者:约翰·桑梅兹
- Markham 揭秘 Java 编程面试
- 破解编码面试 --- 189 个问题和答案
- 求职面试的数据结构和算法分析
- 过去 5 年的 130 多个 Java 面试题
- 深入理解 Java 面试 - 免费样本 PDF
- 深入理解 Spring Boot 面试 - 免费样本 PDF
结束语
谢谢,你终于读完了这篇文章……祝你的编程面试好运!这当然不容易,但这些问题肯定会对你有所帮助。它也会激励你学习更多。
如果您喜欢这篇文章,请与您的朋友和同事分享,并且不要忘记在 Twitter 上关注javinpaul!
PS ---如果您需要一些免费资源来学习 Java,您可以查看我最喜欢的免费 Java 课程列表来开始您的准备。
PSS---我没有提供图中分享的面试问题的答案“代码中创建了多少个String对象?”你能猜一下并解释一下吗?
另外,如果你正在准备今年的 Java 面试,你也可以在 Gumroad 上获取我的 Java + Spring 面试 + SQL 捆绑包,使用代码friends20还可获得 20% 的折扣
鏂囩珷鏉ユ簮锛�https://dev.to/javinpaul/50-core-java-interview-questions-with-answers-for-programmers-3bc