2019年Java中高级面试题总结(7),228道系列查漏补缺!

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 228道2019年Java中高级面试题,哪些你还不会?

2019年Java面试题中高级系列228道

Java面试题(一)

第一篇更新1~20题的答案解析

第二篇更新21~50题答案解析

第三篇更新51~95题答案解析

Java面试题(二)

第四篇更新1~20题答案解析

第五篇更新21~50题答案解析

第六篇更新51~80题答案解析
image

Java 面试题(二)

81、说出几条 Java 中方法重载的最佳实践?

82、在多线程环境下,SimpleDateFormat 是线程安全的吗?

83、Java 中如何格式化一个日期?如格式化为 ddMMyyyy 的形式?

84、Java 中,怎么在格式化的日期中显示时区?

85、Java 中 java.util.Date 与 java.sql.Date 有什么区别?

86、Java 中,如何计算两个日期之间的差距?

87、Java 中,如何将字符串 YYYYMMDD 转换为日期?

89、如何测试静态方法?(答案)

90、怎么利用 JUnit 来测试一个方法的异常?

91、你使用过哪个单元测试库来测试你的 Java 程序?

92、@Before 和 @BeforeClass 有什么区别?

93、怎么检查一个字符串只包含数字?解决方案

94、Java 中如何利用泛型写一个 LRU 缓存?

95、写一段 Java 程序将 byte 转换为 long?

96、在不使用 StringBuffer 的前提下,怎么反转一个字符串?

97、Java 中,怎么获取一个文件中单词出现的最高频率?

98、如何检查出两个给定的字符串是反序的?

99、Java 中,怎么打印出一个字符串的所有排列?

100、Java 中,怎样才能打印出数组中的重复元素?

101、Java 中如何将字符串转换为整数?

102、在没有使用临时变量的情况如何交换两个整数变量的值?

103、接口是什么?为什么要使用接口而不是直接使用具体类?

104、Java 中,抽象类与接口之间有什么不同?

105、除了单例模式,你在生产环境中还用过什么设计模式?

106、你能解释一下里氏替换原则吗?

107、什么情况下会违反迪米特法则?为什么会有这个问题?

108、适配器模式是什么?什么时候使用?

109、什么是“依赖注入”和“控制反转”?为什么有人使用?

110、抽象类是什么?它与接口有什么区别?你为什么要使用过抽象类?

111、构造器注入和 setter 依赖注入,那种方式更好?

112、依赖注入和工程模式之间有什么不同?

113、适配器模式和装饰器模式有什么区别?

114、适配器模式和代理模式之前有什么不同?

115、什么是模板方法模式?
image

本次更新81~115题的答案解析

81、说出几条 Java 中方法重载的最佳实践?

下面有几条可以遵循的方法重载的最佳实践来避免造成自动装箱的混乱。
a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参数。
b)不要重载参数数量一致,而只是参数顺序不同的方法。
c)如果重载的方法参数个数多于 5 个,采用可变参数。

82、在多线程环境下,SimpleDateFormat 是线程安全的吗?

不是,非常不幸,DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat 限制在ThreadLocal 中。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。因此,从日期、时间处理的所有实践来说,我强力推荐 joda-time 库。

83、Java 中如何格式化一个日期?如格式化为 ddMMyyyy的形式?

Java 中,可以使用 SimpleDateFormat 类或者 joda-time 库来格式日期。DateFormat 类允许你使用多种流行的格式来格式化日期。参见答案中的示例代码,代码中演示了将日期格式化成不同的格式,如 dd-MM-yyyy 或 ddMMyyyy。

84、Java 中,怎么在格式化的日期中显示时区?

使用SimpleDateFormat来实现格式化日期,但是DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如将SimpleDateFormat 限制在 ThreadLocal 中。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。因此,从日期、时间处理的所有实践来说,强力推荐 joda-time 库。

85、Java 中 java.util.Date 与 java.sql.Date 有什么区别?

86、Java 中,如何计算两个日期之间的差距?

87、Java 中,如何将字符串 YYYYMMDD 转换为日期?

89、如何测试静态方法?

可以使用 PowerMock 库来测试静态方法。

90、怎么利用 JUnit 来测试一个方法的异常?

对需要测试异常的代码使用try,catch语句块。比如:public void testException(){try{Long.parseLong(null);} catch(NumberFormatException expected){}}然后使用Junit的fail函数,对于没有抛出预期异常的代码

91、你使用过哪个单元测试库来测试你的 Java 程序?

92、@Before 和 @BeforeClass 有什么区别?

@Before :在每个测试方法之前都执行一次, 方法需要声明为public
@beforeclass :只在类中执行一次, 必须声明为public static

93、怎么检查一个字符串只包含数字?解决方案

用Java自带的函数、用正则表达式、用ascii码判断

94、Java 中如何利用泛型写一个 LRU 缓存?

这是一种混合的数据结构,我们需要在哈希表的基础上建立一个链表。但是Java已经为我们提供了这种形式的数据结构-LinkedHashMap!它甚至提供可覆盖回收策略的方法。唯一需要我们注意的事情是,改链表的顺序是插入的顺序,而不是访问的顺序。但是,有一个构造函数提供了一个选项,可以使用访问的顺序。

95、写一段 Java 程序将 byte 转换为 long?

96、在不使用 StringBuffer 的前提下,怎么反转一个字符串?

97、Java 中,怎么获取一个文件中单词出现的最高频率?

这是一道算法面试题,Java中文的比较多。
1、将文件内容存入String字符串中。
2、利用split()函数分割字符串,因为直接替换英文空格或者,逗号分隔就可以了,中文类似,分隔得到一个数组。
3、遍历数组中所有的单词,统计结果Map 中,key=单词,value=单词出现的次数。
4、使用TreeSet类型,对Map中的结果进行排序,依据统计次数。
5、输出最高的排序的前N名结果

98、如何检查出两个给定的字符串是反序的?

思路主要是,从开始字符,和另外一个从末尾字符比较,先判断长度是否相同,不同直接不可能反文。然后再比较。

99、Java 中,怎么打印出一个字符串的所有排列?

100、Java 中,怎样才能打印出数组中的重复元素?

101、Java 中如何将字符串转换为整数?

String s="123";
int i;
第一种方法:i=Integer.parseInt(s);
第二种方法:i=Integer.valueOf(s).intValue();

102、在没有使用临时变量的情况如何交换两个整数变量的值?

加减法、乘除法、异或法。欢迎大家关注我的公种浩【程序员追风】,2019年多家公司java面试题整理了1000多道400多页pdf文档,文章都会在里面更新,整理的资料也会放在里面。
image

103、接口是什么?为什么要使用接口而不是直接使用具体类?

接口用于定义 API。它定义了类必须得遵循的规则。同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使用可随机访问的 ArrayList,也可以使用方便插入和删除的 LinkedList。接口中不允许写代码,以此来保证抽象,但是 Java 8 中你可以在接口声明静态的默认方法,这种方法是具体的。

104、Java 中,抽象类与接口之间有什么不同?

Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个类只能继承一个类,但是可以实现多个接口。抽象类可以很好的定义一个家族类的默认行为,而接口能更好的定义类型,有助于后面实现多态机制。

105、除了单例模式,你在生产环境中还用过什么设计模式?

这需要根据你的经验来回答。一般情况下,你可以说依赖注入,工厂模式,装饰模式或者观察者模式,随意选择你使用过的一种即可。不过你要准备回答接下的基于你选择的模式的问题。

106、你能解释一下里氏替换原则吗?

首先,这是编译器的要求,如果不这么做,无法通过编译。其次,面向对象的编程,其中继承有个大原则,任何子类的对象都可以当成父类的对象使用。

107、什么情况下会违反迪米特法则?为什么会有这个问题?

迪米特法则建议“只和朋友说话,不要陌生人说话”,以此来减少类之间的耦合。

108、适配器模式是什么?什么时候使用?

适配器模式提供对接口的转换。如果你的客户端使用某些接口,但是你有另外一些接口,你就可以写一个适配去来连接这些接口。

109、什么是“依赖注入”和“控制反转”?为什么有人使用?

控制反转(IOC)是 Spring 框架的核心思想,用我自己的话说,就是你要做一件事,别自己可劲 new 了,你就说你要干啥,然后外包出去就好~依赖注入(DI) 在我浅薄的想法中,就是通过接口的引用和构造方法的表达,将一些事情整好了反过来传给需要用到的地方~

110、抽象类是什么?它与接口有什么区别?你为什么要使用过抽象类?

a.接口用于规范,抽象类用于共性.
b.声明方法的存在而不去实现它的类被叫做抽象类
c.接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。

111、构造器注入和 setter 依赖注入,那种方式更好?

每种方式都有它的缺点和优点。构造器注入保证所有的注入都被初始化,但是setter 注入提供更好的灵活性来设置可选依赖。如果使用 XML 来描述依赖,Setter 注入的可读写会更强。经验法则是强制依赖使用构造器注入,可选依赖使用 setter 注入。

112、依赖注入和工程模式之间有什么不同?

虽然两种模式都是将对象的创建从应用的逻辑中分离,但是依赖注入比工程模式更清晰。通过依赖注入,你的类就是 POJO,它只知道依赖而不关心它们怎么获取。使用工厂模式,你的类需要通过工厂来获取依赖。因此,使用 DI 会比使用工厂模式更容易测试。

113、适配器模式和装饰器模式有什么区别?

虽然适配器模式和装饰器模式的结构类似,但是每种模式的出现意图不同。适配器模式被用于桥接两个接口,而装饰模式的目的是在不修改类的情况下给类增加新的功能。

114、适配器模式和代理模式之前有什么不同?

这个问题与前面的类似,适配器模式和代理模式的区别在于他们的意图不同。由于适配器模式和代理模式都是封装真正执行动作的类,因此结构是一致的,但是适配器模式用于接口之间的转换,而代理模式则是增加一个额外的中间层,以便支持分配、控制或智能访问。

115、什么是模板方法模式?

模板方法提供算法的框架,你可以自己去配置或定义步骤。例如,你可以将排序算法看做是一个模板。它定义了排序的步骤,但是具体的比较,可以使用Comparable 或者其语言中类似东西,具体策略由你去配置。列出算法概要的方法就是众所周知的模板方法。

最后

欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持!

相关文章
|
4天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2
|
9天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
14天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
10天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
34 4
|
11天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
51 4
|
23天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
51 5
|
22天前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
18 1
|
1月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
28 3
|
1月前
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
96 0
Java面试题之cpu占用率100%,进行定位和解决
|
21天前
|
算法 Java
JAVA 二叉树面试题
JAVA 二叉树面试题
14 0