Java面试准备:15个Java面试问题

并非所有的访谈都将重点放在算法和数据结构上—通常,访谈通常只侧重于您声称是专家的语言或技术。在此类访谈中,通常没有任何“陷阱”问题,而是它们要求您利用内存和使用该语言的经验–换句话说,它们测试您对编程语言的了解。

但是,忘记像Java这样的语言的所有来龙去脉很容易,因为简单地说,我们不会处理诸如“ JVM管理哪种内存?”这样的问题。 和“用示例描述多态”。 以一天为周期。

这篇文章概述了Java访谈中提出的一些常见问题。 由于特定于Java的问题可能相差很大,因此本文旨在指导您思考各种不同类型的问题以及应该准备的主题。

今天,我们将讨论与以下内容有关的面试问题和答案:

  • Java生态系统
  • Java类
  • 介面
  • 遗产
  • 多线程
  • 内存管理
  • 馆藏
  • 异常处理
  • 序列化
  • 辛格尔顿

让我们开始吧!

问题1:Java独立于平台意味着什么?

Java按照一次编写即可在任何地方运行的原则工作。 编写Java程序后,它将被编译为字节码,然后可以在任何Java虚拟机或JVM上运行。

字节码的编译是Java互操作性背后的魔力。 不同的操作系统和硬件体系结构具有为自己定制的JVM,并且所有JVM都可以运行相同的字节码。 因此,如果您在Linux上编写Java程序,它将在为Windows操作系统设计的JVM上无缝运行,从而使代码与基础硬件和操作系统无关。

Q2:解释JRE,JDK和JVM的概念

  • JRE(Java运行时环境)包括Java虚拟机和标准Java API(核心类和支持文件)。 JRE包含的内容足以执行Java应用程序,但不足以对其进行编译。
  • JDK(Java开发工具包)是JRE加上Java编译器,以及一组用于编译和调试代码的其他工具。 JRE由Java平台库,Java虚拟机(JVM),Java插件和Java Web Start组成,以运行Java应用程序。 JRE作为独立版本不包含编译器和调试工具。 如果需要开发Java程序,则需要完整的Java SDK。 JRE不足以进行程序开发。 只有完整的Java SDK包含Java编译器,该编译器会将您的.java源文件转换为字节码.class文件。
  • JVM(Java虚拟机)是规范的实现,详细描述了JVM的预期行为。 任何符合JVM规范的实现都应该能够运行编译为Java字节码的代码,而与最初编写该代码的语言无关。 在Java编程语言中,所有源代码都首先以纯文本文件编写,扩展名为.java。 然后,这些源文件由javac编译器编译为.class文件。 .class文件不包含处理器本身的代码。 相反,它包含字节码-Java虚拟机的机器语言。 然后,Java启动器工具将使用Java虚拟机的实例运行您的应用程序。

问题3:如何在Java中将实体包标记为私有?

没有私有包的显式修饰符。 在没有任何修饰符的情况下,类或成员变量是程序包私有的。 标记为包私有的成员仅在其自己的包中可见。 考虑下面的类。

私有包是私有的一种较宽泛的形式。 关于package-private的一件好事是,您可以使用它来授予对单元测试类本来认为私有的方法的访问权。 因此,如果您使用没有其他用途的帮助程序类,而是为了帮助您的公共类完成客户端需要做的事情,则有必要将它们打包为私有,这是很有意义的,因为您希望使库用户尽可能简单。

有哪些替代方案?

Object类提供了一个回调方法finalize(),当该对象变为垃圾时可以在该对象上调用该方法。 对象的finalize()实现没有任何作用-您可以覆盖finalize()进行清理,例如释放资源。

finalize()方法可由系统自动调用,但是何时调用,即使调用,也不确定。 因此,您不应依赖此方法为您进行清理。 例如,如果您在执行I / O之后没有在代码中关闭文件描述符,并且您希望finalize()为您关闭它们,则文件描述符可能用完了。

以下是一些替代方案:

  • try-with-resources惯用法可以用来清理对象。 这需要实现AutoCloseable接口。
  • 垃圾回收对象时使用PhantomReference进行清理
  • 使用Cleaner类执行清除操作。
  • 实现close()方法,该方法进行清理并记录该方法的调用。

Q5:是否可以按下面的代码片段所示更改最终数组的内容?

final int[] array = new int[5];
array[0] = 1;

它可能看起来违反直觉,但实际上我们可以更改数组的内容,即使它被标记为final。 数组变量指向内存中放置数组内容的特定起始位置。 位置或内存地址无法更改。 例如,以下代码将无法编译:

final int[] array = new int [5]
array = new int[10];

但是,以下代码将起作用。

public class FinalArrayExample {final int[] array = new int[5];// allowedvoid changeArrayContents(int i, int val) {array[i] = val;}// not allowed and will not compile/*void changeArray() {array = new int [10]}*/}

什么时候应该使用其中一个?

抽象类不能被实例化,但是可以被子类化。 抽象类通常包含抽象和非抽象方法,子类被迫为其提供实现。

接口是完全“抽象类”,用于将相关方法与空主体组合在一起。

以下是抽象类和接口之间的四个主要区别:

  • 抽象类可以具有最终变量,静态变量或类成员变量,而接口只能具有默认为final和static的变量。
  • 抽象类可以具有静态,抽象或非抽象方法。 接口可以具有静态,抽象或默认方法。
  • 抽象类的成员可以具有对私有,受保护或公共的不同可见性。 而在接口中,所有方法和常量都是公共的。
  • 一个类只能扩展另一个类,但是可以实现多个接口。 同样,一个接口可以扩展多个接口。 接口从不实现类或接口。

当子类共享状态或使用通用功能时,请使用抽象类。 或者,您需要声明非静态,非最终字段,或者需要除public之外的访问修饰符。

如果您期望不相关的类将实现您的接口,请使用接口。 例如,接口Comparable和Cloneable由许多不相关的类实现。 接口还用于需要多重继承类型的实例。

你能给个例子吗?

多态是在编程中针对不同的基础形式或数据类型呈现相同接口的能力。 多态是指您可以将对象视为某物的通用版本,但是当您访问它时,代码将确定其确切的类型并调用关联的代码。 这意味着多态性使您的代码可以与不同的类一起使用,而无需知道它正在使用哪个类。

多态性用于使应用程序更具模块化和可扩展性。 您可以创建根据需要选择的可互换对象,而不必使用混乱的条件语句来描述不同的操作过程。 这是多态性的基本目标。

多态的经典示例是Shape类。 我们从父类Shape派生CircleTriangleRectangle类,它公开了抽象方法draw()。 派生类为draw()方法提供了其自定义实现。 现在,通过在每个对象上调用draw()方法,很容易呈现所有包含在同一数组中的不同类型的形状。 这使我们drawTriangle()为每种形状创建单独的绘制方法,例如drawTriangle()drawCircle()等。

Q8:主要方法可以重载吗?

是的,主要方法是静态方法,可以重载。 但是,即使您指定一个或两个命令行参数,当JVM启动您的类时,也只会使用public static void main(String[] args) 。 但是,可以以编程方式调用main方法的重载版本。

问题9:如何在每次调用调用时将多个参数传递给方法?

我们可以使用varargs功能将可变数量的参数传递给方法。 下面是将相同类型的多个参数传递给方法的示例。

public void childrenNames(string... names) {for(int i= 0; i < names.length; i++)system.out.println(names[i]);}
  • 类型名称后跟三个点,一个空格,然后是变量名称。
  • varargs变量被视为数组。
  • varargs变量必须出现在方法签名的最后。
  • 由于上述原因,方法签名中只能有一个变量。

可以按以下方式调用上述方法: 调用Varargs方法

childrenNames();
childrenNames("Jane");
childrenNames("Jane", "Tom", "Peter");

Q10:信号量可以用作互斥量吗?

如果信号量可以发出的许可数设置为1,则它有可能充当互斥量。但是,两者之间最重要的区别是,对于互斥量,同一线程必须调用获取并随后释放。互斥锁,而在二进制信号量的情况下,不同的线程可以在信号量上调用获取和释放。

这将我们引向“所有权”的概念。 互斥锁由获取它的线程拥有,直到它释放为止,而对于信号量则没有所有权的概念。

需要多线程复习吗? 请查看本文“ Java多线程和并发:进行高级工程访谈时应了解的知识”。

Q11:解释可外部化的界面

Serializable接口为我们的类对象提供了自动序列化功能。 另一方面,Externalizable接口提供了一种实现自定义序列化机制的方法。 实现Externalizable接口的类负责保存和恢复其自己实例的内容。

Externalizable接口扩展了Serializable接口,并提供了两种方法来序列化和反序列化对象: writeExternal()readExternal()

问题12:如果一个代码块引发多个异常,该如何处理?

一段代码片段引发的多种类型的异常可以由多个catch块子句后跟try块来处理。 下面是一个示例异常处理片段:

oid process(int val)  {try {if (val == 1)//checked exceptionthrow new FileNotFoundException();if (val == 2)// runtime exceptionthrow new NullPointerExxception();if (val == 3)// error exceptionthrow new StackOverflowError} catch (RuntimeException re) {// catches all unchecked  exceptions} catch (Exception e) {// catches all checked exceptions} catch (Error err) {// catches all errors}}

问题13:如果要使用集合,如何确定HashSet和TreeSet之间?

最初,您可能希望使用HashSet,因为它会给您带来更好的时间复杂度,但不能保证该集的迭代顺序。 特别是,它不能保证顺序会随着时间的推移保持恒定。

因此,如果您想保持顺序,最好使用TreeSet,因为它以升序而不是按插入顺序存储键。 它不是线程安全的。 但是,请记住,TreeSet不是线程安全的,而HashSet是线程安全的。

问题14:可以通过哪些方法来改善Java应用程序的内存占用?

您可以采取以下三个关键步骤来改善内存占用量:

  • 限制局部变量的范围。 每次弹出堆栈顶部的作用域时,该作用域中的引用都会丢失,这会使对象有资格进行垃圾回收。
  • 不需要时将变量引用显式设置为null。 这将使对象有资格进行垃圾回收。
  • 避免终结器。 它们会降低程序性能,并且不能保证任何事情。

问题15:实现单例类的最佳方法是什么?

根据乔什·布洛赫(Josh Bloch)实现单例的最佳方法是为单例使用枚举类型。 因为Java确保仅创建一个枚举的单个实例,所以通过枚举实现的单例类可以免受反射和序列化攻击。

class Demonstration {public static void main( String args[] ) {Superman superman = Superman.INSTANCE;superman.fly();}
}enum Superman {INSTANCE;private final String name = "Clark Kent";private String residence = "USA";public void fly() {System.out.println("I am flyyyyinggggg ...");}
}

精通

这篇文章涵盖了很多有关Java编程语言的内容,从Java生态系统(问题1)到多线程(问题10)和异常(问题12)不等。 这些是您可以期望的Java面试问题的类型。 最好使用上面概述的材料作为您要学习的主题和可能遇到的问题类型的指南。

但是,这里的材料只是划伤表面。 还有更多的概念需要重新研究或探索,例如面向对象的编程,静态变量和方法重载。

学习愉快! 家

翻译自: https://www.javacodegeeks.com/2019/12/java-interview-prep-15-java-interview-questions.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中字符编码使用_python中字符编码是什么?如何转换字符?

屏幕前我们看到的文字&#xff0c;在计算机中也是这样表示吗&#xff1f;事实上&#xff0c;我们所有的信息电脑是无法直接理解的&#xff0c;同样我们所要表达的信息&#xff0c;计算机也不能看懂。这就需要架起一个理解的桥梁&#xff0c;也就是编码帮助我们相互之间进行翻译…

mysql grant proxy on_MySQL 5.7权限的介绍

MySQL支持的权限如下&#xff1a;ALL或ALL PRIVILEGES 代表指定权限等级的所有权限。ALTER 允许使用ALTER TABLE来改变表的结构&#xff0c;ALTER TABLE同时也需要CREATE和INSERT权限。重命名一个表需要对旧表具有ALTER和DROP权限&#xff0c;对新版具有CREATE和INSERT权限。AL…

python 3.9 发布计划_Python 3.9.0 beta4 发布

Python 3.9.0b4 发布了&#xff0c;Python 3.9 目前仍在开发中&#xff0c;此版本 3.9.0b4 是五个计划的 beta 版本预览中的第四个。Beta 版本预览旨在为广大社区提供测试新功能和错误修复以及准备其项目以支持新功能版本的机会。 Python 3.9 部分主要新功能和变更&#xff1a;…

java junit 异常_JUnit:使用Java 8和Lambda表达式测试异常

java junit 异常在JUnit中&#xff0c;有许多方法可以在测试代码中测试异常&#xff0c;包括try-catch idiom JUnit Rule和catch-exception库。 从Java 8开始&#xff0c;我们还有另一种处理异常的方法&#xff1a;使用lambda表达式。 在这篇简短的博客文章中&#xff0c;我将演…

mysql排插问题_MySQL一次数据插入故障记录

某天突然收到报警&#xff0c;数据库大量事务等待&#xff0c;进到数据库后发线大量的插入操作被阻塞&#xff0c;且都是同一个表的。通过 show engine innodb status 发现插入操作都是在等待索引 idx_create_time(create_time) 的 insert intention lock(跟 gap 锁互斥)&#…

python getopt.getopt_python 参数格式化getopt

命令行参数格式化需要python getopt模块&#xff1a;1.python 命令行参数格式化写道try:options,args getopt.getopt(sys.argv[1:],"hp:i:",["help","ip","port"])except getopt.GetoptError:sys.exit()for name,value in options:i…

使用Zuul和Spring Boot创建API网关

介绍 使用微服务时&#xff0c;通常具有对系统的统一访问点&#xff08;也称为API Gateway &#xff09;。 消费者仅与API网关交谈&#xff0c;而不与服务直接交谈。 这掩盖了您的系统由多个较小的服务组成的事实。 API网关还可帮助解决常见的挑战&#xff0c;例如身份验证&…

纯净pe工具_微PE工具箱2.0

(特殊时期&#xff0c;在家时间多一些&#xff0c;突然想到多年的公众号&#xff0c;重启试试&#xff0c;嗯就先每一天推荐一个软件吧)微PE工具箱(WinPE)是一款非常好用的PE系统(独立的预安装环境)&#xff0c;非常纯净&#xff0c;是装机维护得力的助手。安装简单&#xff0c…

sping jdbc 链接mysql_Spring Boot JDBC 连接数据库示例

文本将对在spring Boot构建的Web应用中&#xff0c;基于MySQL数据库的几种数据库连接方式进行介绍。包括JDBC、JPA、MyBatis、多数据源和事务。JDBC 连接数据库1、属性配置文件(application.properties)spring.datasource.urljdbc:mysql://localhost:3306/testspring.datasourc…

二分查找递归与非递归的时间比较_我们说一说Python的查找算法!

相信大家在面试开发岗和算法岗时&#xff0c;评委最喜欢问的就是&#xff1a;您能给我说一下查找和排序算法有哪些&#xff1f;今天咱们就说一说Python中最常用的查找算法&#xff0c;下期我们再推出排序算法。首先要明白查找是查什么&#xff1f;我们希望能给定一个值&#xf…

ambari mysql error code: 1665_ambari安装中常见的问题

1.openssl版本问题错误如下&#xff1a;ERROR 2018-09-11 14:51:40,101 NetUtil.py:96 - EOF occurred in violation of protocol (_ssl.c:579)ERROR 2018-09-11 14:51:40,101 NetUtil.py:97 - SSLError: Failed to connect. Please check openssl library versions.解决方法&a…

jsf 自定义属性_如何在JSF中实现自定义密码强度指示器

jsf 自定义属性使用JavaScript验证密码强度是一项常见任务。 在本文中&#xff0c;我将展示如何向基于JSF的Web应用程序添加密码强度指示器。 的 PrimeFaces中的密码组件已经具有密码强度的反馈指示符&#xff0c;但是它有两个主要缺点&#xff1a; 反馈指示器没有响应&#…

python编写代码时零_python – KeyError:运行打包代码时为0L

我有一个名为rra.py的脚本,它具有以下skelton结构&#xff1a;usn""usnl[]from bs4 import BeautifulSoupimport reimport asysimport globimport osimport sysimport sysdef inputIndex():#some processsingdef getval():#some processingdef parsehtml():#some pro…

python读取sqlserver的数据_Python:使用并发未来进程P读取sqlserver数据

我是一个从未使用过任何并行处理方法的新手。我希望从SQL Server读取大量数据(即至少200万行)&#xff0c;并希望使用并行处理来加快读取速度。下面是我使用并发未来进程池进行并行处理的尝试。在class DatabaseWorker(object):def __init__(self, connection_string, n, resul…

OAuth 2.0 Java指南:5分钟保护您的应用程序安全

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 现代应用程序依赖于用户身份验证&#xff0c;但是它可能给Java开发人员带来困难的挑战&#xff0c;以及一系列特定于框…

flutter从0到1构建大前端应用 pdf_前端骨架屏都是如何生成的

作者&#xff1a;SHERlocked93转发链接&#xff1a;https://mp.weixin.qq.com/s/j2XzwLPnalDCNaKkfjH-0Q前言相比于早些年前后端代码紧密耦合、后端工程师还得写前端代码的时代&#xff0c;如今已发展到前后端分离&#xff0c;这种开发方式大大提升了前后端项目的可维护性与开发…

java 查找排序_Java类库中的一些常用的查找排序

查找是一种试图在数据集或者数组中发现某一目标值的操作排序是使列表中的元素按照自然顺序进行排序的一种操作Java的类库中包含来一些可以实现对数组或者列表实现查找和排序的方法。例如&#xff1a;Arrays.binarySearch和Collections.sort一个比较器对象可以用来定义对对象进行…

python保存所有变量值_如何在当前python会话中保存所有变量?

繁星coding这是使用spyderlib函数保存Spyder工作区变量的方法#%% Load data from .spydata filefrom spyderlib.utils.iofuncs import load_dictionaryglobals().update(load_dictionary(fpath)[0])data load_dictionary(fpath)#%% Save data to .spydata filefrom spyderlib…

java jtextarea 滚动条_java 在JTextArea中显示 滚动条

我的代码为什么不显示垂直滚动条是那里错了么如果有错求高手修改importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.util.*;publicclassCai{privateJFrame_fra...我的代码为什么不显示垂直滚动条 是那里错了么 如果有错 求高手修改import javax.swing.*…

zipkin 自定义采样率_分组,采样和批处理– Java 8中的自定义收集器

zipkin 自定义采样率在第一篇文章的后续部分&#xff0c;这一次我们将编写一些更有用的自定义收集器&#xff1a;用于按给定的标准进行分组&#xff0c;采样输入&#xff0c;批量处理以及在固定大小的窗口上滑动。 分组&#xff08;计数事件&#xff0c;直方图&#xff09; 假…