欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java高级面试题整理(附答案)

程序员文章站 2022-06-21 19:56:37
这是我收集的10道高级Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Java 知识,但这些问题都是容易在各种 Java 面试中被问到的,而且包括我的朋友和同事在内的许多程序员都觉 ......

这是我收集的10道高级java面试问题列表。这些问题主要来自 java 核心部分 ,不涉及 java ee 相关问题。你可能知道这些棘手的 java 问题的答案,或者觉得这些不足以挑战你的 java 知识,但这些问题都是容易在各种 java 面试中被问到的,而且包括我的朋友和同事在内的许多程序员都觉得很难回答。

1. 为什么等待和通知是在 object 类而不是 thread 中声明的?

一个棘手的 java 问题,如果 java编程语言不是你设计的,你怎么能回答这个问题呢。java编程的常识和深入了解有助于回答这种棘手的 java 核心方面的面试问题。

为什么 wait,notify 和 notifyall 是在 object 类中定义的而不是在 thread 类中定义

这是有名的 java 面试问题,招2~4年经验的到高级 java 开发人员面试都可能碰到。

这个问题的好在它能反映了面试者对等待通知机制的了解, 以及他对此主题的理解是否明确。就像为什么 java 中不支持多继承或者为什么 string 在 java 中是 final 的问题一样,这个问题也可能有多个答案。

为什么在 object 类中定义 wait 和 notify 方法,每个人都能说出一些理由。 从我的面试经验来看, wait 和 nofity 仍然是大多数java 程序员最困惑的,特别是2到3年的开发人员,如果他们要求使用 wait 和 notify, 他们会很困惑。因此,如果你去参加 java 面试,请确保对 wait 和 notify 机制有充分的了解,并且可以轻松地使用 wait 来编写代码,并通过生产者-消费者问题或实现阻塞队列等了解通知的机制。

为什么等待和通知需要从同步块或方法中调用, 以及 java 中的 wait,sleep 和 yield 方法之间的差异,如果你还没有读过,你会觉得有趣。为何 wait,notify 和 notifyall 属于 object 类? 为什么它们不应该在 thread 类中? 以下是我认为有意义的一些想法:

1) wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 java 中两个线程之间的通信机制。对语言设计者而言, 如果不能通过 java 关键字(例如 synchronized)实现通信此机制,同时又要确保这个机制对每个对象可用, 那么 object 类则是的正确声明位置。记住同步等待通知是两个不同的领域,不要把它们看成是相同的或相关的。同步是提供互斥并确保 java 类的线程安全,而 wait 和 notify 是两个线程之间的通信机制

2) 每个对象都可上锁,这是在 object 类而不是 thread 类中声明 wait 和 notify 的另一个原因。

3) 在 java 中为了进入代码的临界区,线程需要锁定并等待锁定,他们不知道哪些线程持有锁,而只是知道锁被某个线程持有, 并且他们应该等待取得锁, 而不是去了解哪个线程在同步块内,并请求它们释放锁定。

4) java 是基于 hoare 的监视器的思想(http://en.wikipedia.org/wiki/...。在java中,所有对象都有一个监视器。

线程在监视器上等待,为执行等待,我们需要2个参数:

  • 一个线程
  • 一个监视器(任何对象)

在 java 设计中,线程不能被指定,它总是运行当前代码的线程。但是,我们可以指定监视器(这是我们称之为等待的对象)。这是一个很好的设计,因为如果我们可以让任何其他线程在所需的监视器上等待,这将导致“入侵”,导致在设计并发程序时会遇到困难。请记住,在 java 中,所有在另一个线程的执行中侵入的操作都被弃用了(例如 stop 方法)。

2. 为什么java中不支持多重继承?

我发现这个 java 核心问题很难回答,因为你的答案可能不会让面试官满意,在大多数情况下,面试官正在寻找答案中的关键点,如果你提到这些关键点,面试官会很高兴。在 java 中回答这种棘手问题的关键是准备好相关主题, 以应对后续的各种可能的问题。

这是非常经典的问题,与为什么 string 在 java 中是不可变的很类似; 这两个问题之间的相似之处在于它们主要是由 java 创作者的设计决策使然。

为什么java不支持多重继承, 可以考虑以下两点:

1)第一个原因是围绕钻石