【吐血整理】2022年Java 基础高频面试题及答案(收藏)

本篇文章给大家总结一些值得收藏的2022年精选Java基础高频面试题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

【吐血整理】2022年Java 基础高频面试题及答案(收藏)_第1张图片

小伙伴们有兴趣想了解更多相关学习资料请点赞收藏+评论转发+关注我之后私信我,注意回复【000】即可获取更多免费资料!

1、面向对象的三个基本特征?

2、访问修饰符public,private,protected,以及不写时的区别?

3、下面两个代码块能正常编译和执行吗?

4、基础考察,指出下题的输出结果

5、用最有效率的方法计算2乘以8?

6、&和&&的区别?

7、String 是 Java 基本数据类型吗?

8、String 类可以继承吗?

不行。String 类使用 final 修饰,无法被继承。

9、String和StringBuilder、StringBuffer的区别?

String:String 的值被创建后不能修改,任何对 String 的修改都会引发新的 String 对象的生成。

StringBuffer:跟 String 类似,但是值可以被修改,使用 synchronized 来保证线程安全。

StringBuilder:StringBuffer 的非线程安全版本,没有使用 synchronized,具有更高的性能,推荐优先使用。

10、String s = new String("xyz") 创建了几个字符串对象?

一个或两个。如果字符串常量池已经有“xyz”,则是一个;否则,两个。

当字符创常量池没有 “xyz”,此时会创建如下两个对象:

一个是字符串字面量 "xyz" 所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,此时该实例也是在堆中,字符串常量池只放引用。

另一个是通过 new String() 创建并初始化的,内容与"xyz"相同的实例,也是在堆中。

11、String s = "xyz" 和 String s = new String("xyz") 区别?

两个语句都会先去字符串常量池中检查是否已经存在 “xyz”,如果有则直接使用,如果没有则会在常量池中创建 “xyz” 对象。

另外,String s = new String("xyz") 还会通过 new String() 在堆里创建一个内容与 "xyz" 相同的对象实例。

所以前者其实理解为被后者的所包含。

12、== 和 equals 的区别是什么?

13、两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

14、什么是反射

15、深拷贝和浅拷贝区别是什么?

16、并发和并行有什么区别?

17、构造器是否可被 重写?

18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

19、Java 静态变量和成员变量的区别。

20、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

21、初始化考察,请指出下面程序的运行结果。

22、重载(Overload)和重写(Override)的区别?

23、为什么不能根据返回类型来区分重载?

24、抽象类(abstract class)和接口(interface)有什么区别?

抽象类只能单继承,接口可以多实现。

抽象类可以有构造方法,接口中不能有构造方法。

抽象类中可以有成员变量,接口中没有成员变量,只能有常量(默认就是 public static final)

抽象类中可以包含非抽象的方法,在 Java 7 之前接口中的所有方法都是抽象的,在 Java 8 之后,接口支持非抽象方法:default 方法、静态方法等。Java 9 支持私有方法、私有静态方法。

抽象类中的方法类型可以是任意修饰符,Java 8 之前接口中的方法只能是 public 类型,Java 9 支持 private 类型。

设计思想的区别:

接口是自上而下的抽象过程,接口规范了某些行为,是对某一行为的抽象。我需要这个行为,我就去实现某个接口,但是具体这个行为怎么实现,完全由自己决定。

抽象类是自下而上的抽象过程,抽象类提供了通用实现,是对某一类事物的抽象。我们在写实现类的时候,发现某些实现类具有几乎相同的实现,因此我们将这些相同的实现抽取出来成为抽象类,然后如果有一些差异点,则可以提供抽象方法来支持自定义实现。

我在网上看到有个说法,挺形象的:

普通类像亲爹 ,他有啥都是你的。

抽象类像叔伯,有一部分会给你,还能指导你做事的方法。

接口像干爹,可以给你指引方法,但是做成啥样得你自己努力实现。

25、Error 和 Exception 有什么区别?

Error 和 Exception 都是 Throwable 的子类,用于表示程序出现了不正常的情况。区别在于:

Error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题,比如内存溢出,不可能指望程序能处理这样的情况。

Exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题,也就是说,它表示如果程序运行正常,从不会发生的情况。

26、Java 中的 final 关键字有哪些用法?

27、阐述 final、finally、finalize 的区别。

28、try、catch、finally 考察,请指出下面程序的运行结果。

29、try、catch、finally 考察2,请指出下面程序的运行结果。

30、try、catch、finally 考察3,请指出下面程序的运行结果。

31、JDK1.8之后有哪些新特性?

32、wait() 和 sleep() 方法的区别

33、线程的 sleep() 方法和 yield() 方法有什么区别?

34、线程的 join() 方法是干啥用的?

35、编写多线程程序有几种实现方式?

36、Thread 调用 start() 方法和调用 run() 方法的区别

37、线程的状态流转

【吐血整理】2022年Java 基础高频面试题及答案(收藏)_第2张图片

一个线程可以处于以下状态之一:

NEW:新建但是尚未启动的线程处于此状态,没有调用 start() 方法。

RUNNABLE:包含就绪(READY)和运行中(RUNNING)两种状态。线程调用 start() 方法会会进入就绪(READY)状态,等待获取 CPU 时间片。如果成功获取到 CPU 时间片,则会进入运行中(RUNNING)状态。

BLOCKED:线程在进入同步方法/同步块(synchronized)时被阻塞,等待同步锁的线程处于此状态。

WAITING:无限期等待另一个线程执行特定操作的线程处于此状态,需要被显示的唤醒,否则会一直等待下去。例如对于 Object.wait(),需要等待另一个线程执行 Object.notify() 或 Object.notifyAll();对于 Thread.join(),则需要等待指定的线程终止。

TIMED_WAITING:在指定的时间内等待另一个线程执行某项操作的线程处于此状态。跟 WAITING 类似,区别在于该状态有超时时间参数,在超时时间到了后会自动唤醒,避免了无期限的等待。

TERMINATED:执行完毕已经退出的线程处于此状态。

线程在给定的时间点只能处于一种状态。这些状态是虚拟机状态,不反映任何操作系统线程状态。

38、synchronized 和 Lock 的区别

1)Lock 是一个接口;synchronized 是 Java 中的关键字,synchronized 是内置的语言实现;

2)Lock 在发生异常时,如果没有主动通过 unLock() 去释放锁,很可能会造成死锁现象,因此使用 Lock 时需要在 finally 块中释放锁;synchronized 不需要手动获取锁和释放锁,在发生异常时,会自动释放锁,因此不会导致死锁现象发生;

3)Lock 的使用更加灵活,可以有响应中断、有超时时间等;而 synchronized 却不行,使用 synchronized 时,等待的线程会一直等待下去,直到获取到锁;

4)在性能上,随着近些年 synchronized 的不断优化,Lock 和 synchronized 在性能上已经没有很明显的差距了,所以性能不应该成为我们选择两者的主要原因。官方推荐尽量使用 synchronized,除非 synchronized 无法满足需求时,则可以使用 Lock。

39、synchronized 各种加锁场景的作用范围

40、如何检测死锁?

41、怎么预防死锁?

42、为什么要使用线程池?直接new个线程不是很舒服?

43、线程池的核心属性有哪些?

44、说下线程池的运作流程。

45、线程池有哪些拒绝策略?

46、List、Set、Map三者的区别?

47、ArrayList 和 LinkedList 的区别。

48、ArrayList 和 Vector 的区别。

49、介绍下 HashMap 的底层数据结构

我们现在用的都是 JDK 1.8,底层是由“数组+链表+红黑树”组成,如下图,而在 JDK 1.8 之前是由“数组+链表”组成。

【吐血整理】2022年Java 基础高频面试题及答案(收藏)_第3张图片

50、为什么要改成“数组+链表+红黑树”?

主要是为了提升在 hash 冲突严重时(链表过长)的查找性能,使用链表的查找性能是 O(n),而使用红黑树是 O(logn)。

51、那在什么时候用链表?什么时候用红黑树?

对于插入,默认情况下是使用链表节点。当同一个索引位置的节点在新增后超过8个(阈值8):如果此时数组长度大于等于 64,则会触发链表节点转红黑树节点(treeifyBin);而如果数组长度小于64,则不会触发链表转红黑树,而是会进行扩容,因为此时的数据量还比较小。

对于移除,当同一个索引位置的节点在移除后达到 6 个,并且该索引位置的节点为红黑树节点,会触发红黑树节点转链表节点(untreeify)。

52、HashMap 的默认初始容量是多少?HashMap 的容量有什么限制吗?

默认初始容量是16。HashMap 的容量必须是2的N次方,HashMap 会根据我们传入的容量计算一个大于等于该容量的最小的2的N次方,例如传 9,容量为16。

 53、HashMap 的插入流程是怎么样的?

【吐血整理】2022年Java 基础高频面试题及答案(收藏)_第4张图片

54、HashMap 的扩容(resize)流程是怎么样的? 

55、除了 HashMap,还用过哪些 Map,在使用时怎么选择?

56、HashMap 和Hashtable 的区别?

57、Java 内存结构(运行时数据区)

58、什么是双亲委派模型?

59、Java虚拟机中有哪些类加载器?

60、类加载的过程

61、介绍下垃圾收集机制(在什么时候,对什么,做了什么)?

62、GC Root有哪些?

63、垃圾收集有哪些算法,各自的特点?

最后

金九银十的季节,相信有不少同学正准备跳槽。

我将我最近的原创的文章进行了汇总:原创汇总,其中有不少面试高频题目解析,很多都是我自己在面试大厂时遇到的,我在对每个题目解析时都会按较高的标准进行深入剖析,可能只看一遍并不能完全明白,但是相信反复阅读,定能有所收获。

小伙伴们有兴趣想了解更多相关学习资料请点赞收藏+评论转发+关注我之后私信我,注意回复【000】即可获取更多免费资料!

你可能感兴趣的:(后端,面试,职场和发展,java,jvm,github)