Java面试题汇总含答案(2022最新版)

Java常见面试题及答案,每道都是认真筛选出的高频面试题,助力大家能找到满意的工作!

下载链接全部面试题及答案PDF

1、什么是 Class 文件? Class 文件主要的信息结构有哪些?

Class 文件是一组以 8 位字节为基础单位的二进制流。各个数据项严格按顺序排列。

Class 文件格式采用一种类似于 C 语言结构体的伪结构来存储数据。这样的伪结构仅仅有两种数据类型:无符号数和表。

无符号数:是基本数据类型。以 u1、u2、u4、u8 分别代表 1 个字节、2 个字节、4 个字节、8 个字节的无符号数,能够用来描写叙述数字、索引引用、数量值或者依照 UTF-8 编码构成的字符串值。

表:由多个无符号数或者其它表作为数据项构成的复合数据类型。全部表都习惯性地以 _info 结尾。

2、并发编程三个必要因素是什么?

原子性:

原子,即一个不可再被分割的颗粒。原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。

可见性:

一个线程对共享变量的修改,另一个线程能够立刻看到。(synchronized,volatile)

有序性:

程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)

3、说下有哪些类加载器?

Bootstrap ClassLoader(启动类加载器) Extention ClassLoader(扩展类加载器) App ClassLoader(应用类加载器)

4、线程的调度策略

线程调度器选择优先级最高的线程运行,但是,如果发生以下情况,就会终止线程的运行:

1、 线程体中调用了yield方法让出了对cpu的占用权利

2、 线程体中调用了sleep方法使线程进入睡眠状态

3、 线程由于IO操作受到阻塞

4、 另外一个更高优先级线程出现

5)在支持时间片的系统中,该线程的时间片用完

5、用Java写一个冒泡排序。

冒泡排序几乎是个程序员都写得出来,但是面试的时候如何写一个逼格高的冒泡排序却不是每个人都能做到,下面提供一个参考代码:

public class BubbleSortTest {

  public static void main(String[] args) {

  int[] arr = new int[]{-12,3,2,34,5,8,1};
  //冒泡排序
  for(int i = 0;i < arr.length-1;i++){
    for(int j = 0;j <arr.length-1-i;j++){
      if(arr[j] >arr[j+1]){
      int temp = arr[j];
      arr[j] = arr[j+1];
      arr[j+1] = temp;
      }
    }
  }
  //遍历
  for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]+"\t");
  }

  }
}

6、Java对象的布局了解过吗?

对象头区域此处存储的信息包括两部分:1、对象自身的运行时数据( MarkWord ),占8字节 存储 hashCode、GC 分代年龄、锁类型标记、偏向锁线程 ID 、 CAS 锁指向线程 LockRecord 的指针等, synconized 锁的机制与这个部分( markwork )密切相关,用 markword 中最低的三位代表锁的状态,其中一位是偏向锁位,另外两位是普通锁位。2、对象类型指针( Class Pointer ),占4字节 对象指向它的类元数据的指针、 JVM 就是通过它来确定是哪个 Class 的实例。

实例数据区域 此处存储的是对象真正有效的信息,比如对象中所有字段的内容

对齐填充区域 JVM 的实现 HostSpot 规定对象的起始地址必须是 8 字节的整数倍,换句话来说,现在 64 位的 OS 往外读取数据的时候一次性读取 64bit 整数倍的数据,也就是 8 个字节,所以 HotSpot 为了高效读取对象,就做了"对齐",如果一个对象实际占的内存大小不是 8byte 的整数倍时,就"补位"到 8byte 的整数倍。所以对齐填充区域的大小不是固定的。

7、解释什么是Tomcat Valve?

Tomcat Valve——Tomcat 4引入的新技术,它允许您将Java类的实例链接到一个特定的Catalina容器。

8、同步方法和同步块,哪个是更好的选择?

同步块是更好的选择,因为它不会锁住整个对象(当然你也可以让它锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。

同步块更要符合开放调用的原则,只在需要锁住的代码块锁住相应的对象,这样从侧面来说也可以避免死锁。

9、运行时常量池的作用是什么?

运行时常量池是方法区的一部分,Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表,用于存放编译器生成的各种字面量与符号引用,这部分内容在类加载后存放到运行时常量池。一般除了保存 Class 文件中描述的符号引用外,还会把符号引用翻译的直接引用也存储在运行时常量池。

运行时常量池相对于 Class 文件常量池的一个重要特征是动态性,Java 不要求常量只有编译期才能产生,运行期间也可以将新的常量放入池中,这种特性利用较多的是 String 的 intern 方法。

运行时常量池是方法区的一部分,受到方法区内存的限制,当常量池无法再申请到内存时会抛出 OutOfMemoryError。

10、如果你提交任务时,线程池队列已满,这时会发生什么

有俩种可能:

1、 如果使用的是无界队列 LinkedBlockingQueue,也就是无界队列的话,没关系,继续添加任务到阻塞队列中等待执行,因为 LinkedBlockingQueue 可以近乎认为是一个无穷大的队列,可以无限存放任务

2、 如果使用的是有界队列比如 ArrayBlockingQueue,任务首先会被添加到ArrayBlockingQueue 中,ArrayBlockingQueue 满了,会根据maximumPoolSize 的值增加线程数量,如果增加了线程数量还是处理不过来,ArrayBlockingQueue 继续满,那么则会使用拒绝策略RejectedExecutionHandler 处理满了的任务,默认是 AbortPolicy

11、如何写一段简单的死锁代码?

这个笔试的话频率也挺高(遇见笔试的公司要三思啊),所以这里直接给出一个答案(有很多版本的)。

12、栈帧都有哪些数据?

JVM的运行是基于栈的,和C语言的栈类似,它的大多数数据都是在堆里面的,只有少部分运行时的数据存在于栈上。

在JVM中,每个线程栈里面的元素,就叫栈帧。

栈帧包含:局部变量表、操作数栈、动态连接、返回地址等。

13、float f=3.4;是否正确?

答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;。

14、形参与实参

形参:全称为“形式参数”,是在定义方法名和方法体的时候使用的参数,用于接收调用该方法时传入的实际值;实参:全称为“实际参数”,是在调用方法时传递给该方法的实际值。

15、BIO、NIO、AIO 有什么区别?

BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。

NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。

AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

16、什么是自旋

很多synchronized里面的代码只是一些很简单的代码,执行时间非常快,此时等待的线程都加锁可能是一种不太值得的操作,因为线程阻塞涉及到用户态和内核态切换的问题。既然synchronized里面的代码执行得非常快,不妨让等待锁的线程不要被阻塞,而是在synchronized的边界做忙循环,这就是自旋。如果做了多次忙循环发现还没有获得锁,再阻塞,这样可能是一种更好的策略。

17、我们可以在 hashcode() 中使用随机数字吗?

答案

http://javarevisited.blogspot.sg/2011/10/override-hashcode-in-java-example.html

不行,因为对象的 hashcode 值必须是相同的。参见答案获取更多关于 Java 中重写 hashCode() 方法的知识。

18、你所知道网络协议有那些?

1、 HTTP:超文本传输协议

2、 FTP:文件传输协议

3、 SMPT:简单邮件协议

4、 TELNET:远程终端协议

5、 POP3:邮件读取协议

19、构造器Constructor是否可被override

在讲继承的时候我们就知道父类的私有属性和构造方法并不能被继承,所以Constructor也就不能被override,但是可以overload,所以你可以看到一个类中有多个构造函数的情况。

20、什么是双亲委派机制?

双亲委派机制的意思是除了顶层的启动类加载器以外,其余的类加载器,在加载之前,都会委派给它的父加载器进行加载。这样一层层向上传递,直到祖先们都无法胜任,它才会真正的加载。

21、讲讲什么情况下会出现内存溢出,内存泄漏?

22、乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

23、线程与进程的区别?

24、Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什么的?有什么区别?

25、用代码演示三种代理

27、分代收集算法

28、同步方法和同步块,哪个是更好的选择?

29、Java 中的编译期常量是什么?使用它又什么风险?

30、Java死锁以及如何避免?

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

32、ArrayList 和 LinkedList 的区别是什么?

33、观察者模式应用场景

34、Array与ArrayList有什么不一样?

35、实例化数组后,能不能改变数组长度呢?

36、Java 中,Maven 和 ANT 有什么区别?

37、方法区的作用是什么?

38、接口和抽象类有什么区别?

39、原型模式的应用场景

40、ConcurrentHashMap 和 Hashtable 的区别?

[下载链接博主已将以上这些面试题整理成了一个面试手册,是PDF版的

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 您好,以下是Java基础面试题2022最新版汇总): 1. Java中的四种访问修饰符是什么?它们分别代表什么含义? 答:Java中的四种访问修饰符是public、protected、default和private。它们分别代表公共的、受保护的、默认的和私有的含义。 2. Java中的八种基本数据类型是什么? 答:Java中的八种基本数据类型是byte、short、int、long、float、double、char和boolean。 3. Java中的自动装箱和拆箱是什么? 答:Java中的自动装箱和拆箱是指将基本数据类型自动转换为对应的包装类类型,以及将包装类类型自动转换为对应的基本数据类型。 4. Java中的final关键字有哪些用途? 答:Java中的final关键字有三种用途:用于修饰变量,表示该变量的值不可改变;用于修饰方法,表示该方法不可被重写;用于修饰类,表示该类不可被继承。 5. Java中的抽象类和接口有什么区别? 答:Java中的抽象类和接口都不能被实例化,但是抽象类可以包含非抽象方法,而接口只能包含抽象方法。另外,一个类只能继承一个抽象类,但是可以实现多个接口。 6. Java中的多态是什么? 答:Java中的多态是指同一个方法可以根据不同的对象调用出不同的行为。它实现的方式有两种:重载和重写。 7. Java中的异常处理机制是什么? 答:Java中的异常处理机制是指通过try-catch-finally语句块来捕获和处理程序运行时可能出现的异常情况,保证程序的稳定性和可靠性。 8. Java中的线程是什么?如何创建线程? 答:Java中的线程是指程序执行的最小单位,它可以独立运行,也可以与其他线程共享资源。创建线程的方式有两种:继承Thread类和实现Runnable接口。 9. Java中的集合框架有哪些?它们之间有什么区别? 答:Java中的集合框架包括List、Set、Map和Queue等。它们之间的区别在于:List是有序的、可重复的集合;Set是无序的、不可重复的集合;Map是键值对的集合;Queue是先进先出的队列。 10. Java中的反射是什么?有什么作用? 答:Java中的反射是指在程序运行时动态地获取类的信息,并可以在运行时操作类的属性和方法。它的作用在于:可以实现动态代理、动态生成代码、动态加载类等功能。 ### 回答2: Java是一种广泛使用的编程语言,它的应用覆盖多个领域,包括机器学习、大数据、企业级应用等。而Java开发人员也是当前市场上非常火热的职业之一。为了进入一家Java开发企业或者获取Java开发岗位,需要通过Java基础面试。 下面我将介绍Java基础面试题,并提供一些答案和解释: 1. 什么是Java? Java是一种面向对象的编程语言,被广泛应用于开发各种应用程序,包括Web应用程序、移动应用程序、桌面应用程序等。 2. 什么是面向对象编程? 面向对象编程是一种编程范型,它将程序分解为对象,每个对象都有自己的数据和方法,对象之间可以相互交互。面向对象编程通常具有封装、继承和多态等特性。 3. Java应用程序的基本结构是什么? Java应用程序的基本结构包括类定义,变量定义,方法定义和语句执行。 4. 什么是Java虚拟机? Java虚拟机是Java平台的核心组件之一,它提供了一个运行Java程序的环境。Java虚拟机可以在不同的操作系统上运行Java程序,实现了跨平台运行的目的。 5. 什么是Java语言的基本数据类型? Java语言的基本数据类型包括byte、short、int、long、float、double、boolean和char。 6. 如何声明一个变量? 在Java中,声明一个变量需要指定变量的类型和名称。例如,int count = 10; 7. 什么是包? 包是在Java中管理类和接口的一种方式。包可以将相关的类和接口组织在一起,以便更好地管理代码。 8. 什么是Java中的异常? 异常是在程序执行期间出现的错误,它包含了错误信息、错误类型和错误的上下文。 9. 什么是Java中的多线程? 多线程是Java中一种并发处理的方法,它允许程序同时执行多个任务。Java中的线程可以通过继承Thread类或实现Runnable接口来创建。 10. Java中的继承关系是什么? 继承是Java中一种对象之间的关系,它允许子类继承父类的属性和方法。子类可以通过继承父类来扩展自己的功能。 以上是常见的Java基础面试题,希望能够对Java开发者提供帮助。在面试过程中,还需要我们展示自己的编程能力和实际应用经验。只有掌握了扎实的Java基础、熟悉常见的应用场景、具备实际经验并且具备坚实的编程能力,才能获得Java开发岗位。 ### 回答3: Java作为目前最热门的编程语言之一,在面试中也是一个重点考察的领域。下面对于Java基础面试题进行汇总和解答。 1. Java常见的数据类型有哪些? 答:Java常见的数据类型有基本数据类型和引用数据类型两种。基本数据类型包括byte、short、int、long、float、double、boolean、char;引用数据类型包括类、数组、接口。 2. int和Integer有什么区别? 答:int是Java中的一种基本数据类型,使用时直接声明并赋值即可;而Integer是int的包装类型,是一个对象,需要通过new来进行初始化,也可以使用自动装箱和拆箱进行转换。 3. String和StringBuilder的区别? 答:String是一个不可变的类,一旦创建就不能修改,修改需要重新创建对象;StringBuilder是一个可变的类,可以通过append、insert等方法修改字符串,节省内存和时间。 4. 抽象类和接口的区别? 答:抽象类和接口都是用于描述行为的概念,但是抽象类更偏向于在类层次结构中描述一种抽象的类,它可以拥有抽象方法和具体实现方法,可以有构造函数,但不能被实例化;而接口更偏向于描述一种能力,只能包含抽象方法、常量和默认方法,不能有构造函数,需要实现接口才能使用。 5. 静态和非静态的区别? 答:静态属性或方法属于类,而非静态属性或方法属于实例,也就是说同一个类属性或方法,静态的只有一份,非静态每次实例化时都有自己的一份;静态变量在类的加载时初始化,公用一份内存,一旦被修改,则所有的对象都会共享该值;非静态变量在每次实例化时初始化,属于独立变量。 6. final关键字的作用? 答:final关键字可以修饰类、方法和变量,表示不可修改、不可继承或不可重写。final修饰的变量是一个常量,一旦初始化后就不能修改;final修饰的方法不能被子类重写;final修饰的类不能被继承。 7. try-catch-finally语句的应用? 答:try-catch-finally语句用于捕获程序中的异常,在try块中尝试执行一段可能会出现异常的代码,如果出现异常则会转到catch块中处理异常,最后无论是否出现异常都会执行finally块中的语句。finally块一般用于释放资源或进行清理操作,如关闭数据库、文件等。 8. 在Java中如何实现多线程? 答:Java中实现多线程有两种方式:继承Thread类和实现Runnable接口。继承Thread类需要重写run方法,而实现Runnable接口需要实现run方法。另外,还可以使用线程池、同步锁、信号量、线程等待等方式实现多线程。 9. 快速判断一个字符串是否是数字? 答:可以使用正则表达式或Java自带的API进行判断。正则表达式可以使用\d+匹配数字,Java自带的API可以使用try-catch捕获NumberFormatException异常来判断。 10. Java中的反射是什么? 答:Java中的反射是指程序在运行时可以动态获取和操控类的信息和对象的属性或方法,包括类的名称、属性和方法。可以通过反射来获取类的所有信息,包括私有的成员变量和方法,也可以在运行时创建对象、调用方法等。但是由于反射操作需要消耗一定的资源,因此不适合在频繁执行的代码中使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农code之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值