Advanced Java Viva Questions

2025年5月8日 | 8分钟阅读

Java是当今市场上需求最旺盛的语言之一。事实上,全球有千万开发者在使用Java编程语言,而且这个数字还在与日俱增。因此,如果你是一名Java开发者、有志于成为Java开发者的新人,或者是一名计算机科学专业的学生,你很可能会参加Java面试或Java口试。最常见的是,面试官会问高级Java问题来检验你的编程知识。

Advanced Java Viva Questions

下面是最常见的高级Java口试题:

1) Java中垃圾回收有什么用?

Java中垃圾回收的用途是识别并移除不再被程序所需、并且不必要地占用程序资源的那些对象,这些资源可以被其他对象释放并重用。Java中的对象在它对程序变得不可访问时,就会被垃圾回收。


2) 什么是Lambda表达式?

Lambda表达式,有时也称为lambda,是Java 8引入的新特性。它们为处理只有一个方法的接口提供了一种更简便的方式,并且经常用于程序员使用匿名类的地方。

有时,我们需要写很多行代码才能完成我们想要做的事情,而我们关心的只是打印某个语句。使用Lambda表达式,我们可以在一行内完成。因此,通过减少代码行数来提高程序效率。


3) 你对Java中的线程有什么理解?

线程是进程中一个单一的顺序控制流,一个进程可以包含两个或更多的“线程”。在Java中,线程由java.lang.Thread类创建和协调。

Java语言中的每个进程(或应用程序)都至少包含一个线程(也称为主线程)。根据程序员的需求,进程也可以包含多个线程来处理不同的任务,例如内存管理和I/O。


4) 从缓冲区读取和写入数据的语法是什么?

从缓冲区读取数据的语法

从缓冲区写入数据的语法


5) 为什么我们要在应用程序中使用多线程?为什么不坚持使用主线程?

主要有两个原因:

  • 首先,我们有时需要执行一项耗时任务。例如,我们可能需要查询数据库,或者从互联网上获取数据。我们可以在主线程上这样做,但主线程中的代码是按线性方式执行的。当主线程等待数据时,它无法执行任何其他操作。
  • 其次,主线程的执行将被挂起。它必须等待数据返回后才能执行下一行代码。对于用户来说,这可能会显得我们的应用程序已经崩溃或冻结,尤其是在处理UI应用程序时。

因此,我们不必占用主线程,而是可以创建多个线程并在这些线程上执行耗时任务。这将释放主线程,使其可以继续执行。这个过程称为多线程。它可以报告进度或接受用户输入,同时耗时任务在后台继续执行。


6) 在任何程序中,何时以及如何发生死锁?

当两个或多个线程被阻塞在锁上,并且每个被阻塞的线程都持有另一个阻塞线程想要的锁时,就会发生死锁。例如:线程1持有锁1并等待获取锁2,但线程2持有锁2并等待获取锁1。这会造成一种情况,即所有持有锁的线程都被阻塞,因此它们永远不会释放它们持有的锁,所以任何等待的线程实际上永远不会运行。


7) 为什么开发者使用BufferedReader来读取Java中的文件?

BufferedReader从输入流中读取文本,并将字符缓冲到字符数组中。从流(而不是文件)中读取数据块比一次只读取几个字符更有效。

因此,我们可以得出结论,BufferReader更精简、更快。此外,我们可以指定缓冲区的尺寸,默认为8k,这对于大多数用途来说也足够了。


8) 定义Java Nio。

在Java 1.4中,Java SDK添加了一个新的I/O包,称为Java.nio。该包被引入作为Java I/O的扩展,因为该包中的类以非阻塞方式实现了I/O。Java.nio包也旨在解决开发者在使用Java.io类处理文件系统时可能遇到的一些问题。


9) 定义JDBC驱动程序?

驱动程序就是一个Java库,包含实现JDBC API的类。由于所有JDBC驱动程序都必须实现相同的接口,因此更改应用程序使用的数据源并不困难。例如,如果一个应用程序使用SQLite数据库,然后我们决定稍后想使用MySQL数据库,我们所要做的就是使用MySQL JDBC驱动程序而不是SQLite驱动程序(当然,除了将数据迁移到MySQL DB之外)。

JDBC包含两个包:Java.sql(核心JDBC)和Javax.sql(可选JDBC)。在处理数据库服务器时,Javax.sql包中的API是必需的。我们稍后会讨论这些。所有流行的数据库都提供JDBC驱动程序。JDK自带一个名为derby的数据库,可用于桌面应用程序或原型开发。derby JDBC驱动程序也包含在JDK中。


10) 提及使用Java Sockets的优点和缺点。

Java Sockets的优点: Sockets因其灵活性和易于通信的协议而在Java编程中使用。它们还会产生低网络流量,例如HTML表单和CGI脚本,它们为每个新的数据请求创建并传输完整的网页。

Java Sockets的缺点: 通过Socket进行的通信只允许在应用程序之间发送原始数据包。


11) 你对同步有什么理解?它如何使多线程受益?

在多线程方面,同步是控制多个线程对共享资源的访问的过程。在Java中,我们可以同步方法和语句。每当我们同步Java程序中的任何方法时,它都允许一次只有一个线程执行。因此,如果一个线程正在使用同步方法,所有想要执行同一方法或在同一类中初始化的任何其他同步方法的其他线程将在运行线程执行完成之前挂起。


12) 解释使用JSTL核心标签的用途,并举例说明。

JSTL <c: forEach > 是一个迭代标签,用于循环或重复嵌套的主体内容固定次数。此标签是Java循环(如while、do-while或for)的替代品。

程序

输出

Advanced Java Viva Questions

13) 你对JavaMail有什么理解?

JavaMail是一个在Java编程中广泛使用的API,用于方便地在Internet上执行邮件操作,例如编写、读取、发送和接收电子邮件

它是一个协议无关且平台无关的框架,作为Java SE平台的可选包提供,并且也被整合到Java EE平台中。

JavaMail API可用于进行许多其他事件。它可以用于注册用户(发送通知,如感谢您访问我的网站或订阅我们的新闻通讯)、忘记密码(通过邮件设置和更新新密码)、发送更新通知等。


14) 名称JavaMail API中使用的两个核心包。

包含JavaMail API核心类的两个包如下所示:

  1. mail
  2. mail.activation

15) 名称JSTL标签。

JSTL包含五种类型的标签:

  • 核心标签
  • 函数标签
  • 格式化标签
  • XML标签
  • SQL标签

16) 在Java中,谁创建Servlet的对象?

Web容器或Servlet容器负责创建Servlet的对象。


17) RequestDispatcher接口在Servlet中的作用是什么?

Servlet中的RequestDispatcher接口用于将请求转发到其他资源,例如HTML、Servlet或JSP。但是,它也可以用于包含另一个资源的内容。


18) 属性在Servlet中的作用是什么?

属性是一个Map对象,它使Servlet能够(主要是在一个Servlet与其他Servlet之间)共享信息。属性可以在请求、会话或应用程序范围内设置、获取或删除。


19) 什么是Session Tracking?Session Tracking的常用方法有哪些?

在JSP中,Session表示一个特定的时间间隔,用于在特定时间范围内跟踪和维护用户数据

Session Tracking是Web容器用于维护用户状态的机制。HTTP和Web服务器是无状态协议。因此,所有请求和响应都是独立的。每次用户向服务器发出请求时,都被视为新请求。为了防止这种情况并维护用户状态(识别特定用户),我们使用Session Tracking。

Session Tracking中常用的方法如下:

  • Cookies
  • HttpSession
  • 隐藏表单字段
  • URL重写

20) JSP是否允许在任何页面中使用exception隐式对象?

exception隐式对象仅为JSP错误页面创建,并使用isErrorPage属性定义。因此,我们不能在任何JSP页面中使用exception隐式对象。


21) 我们能否将请求从JSP页面转发到Servlet页面?

是的,我们可以使用JSP“forward action”标签,并通过指定Servlet的URL模式,将请求从JSP页面转发到Servlet。


22) JSP是可扩展技术吗?

JSP技术可以通过开发封装在标签库中的标签或自定义动作来扩展。


23) 定义静态初始化器。

在Java中,静态初始化器被定义为静态{}代码块,它只在构造函数或main方法调用之前运行一次。当用户想要执行复杂的计算来确定'n'值,或者当其值从数据库中获取时,它很有用。

示例

StaticInitializerExample.java


24) Java事务API(JTA)的用途是什么?

Java事务API(JTA)允许应用程序执行分布式事务,这些事务可以访问和更新多个网络计算资源上的数据。


25) 事务与分布式事务有何不同?

事务被定义为逻辑工作单元,它要么成功,要么不产生任何结果。相比之下,分布式事务可以访问和更新多个计算网络资源上的数据。


26) 列出不同的事务属性?

不同的事务属性如下:

  1. Required(必需),
  2. RequiresNew(必需新),
  3. Mandatory(强制),
  4. Supports(支持),
  5. NotSupported(不支持),
  6. Never(从不)