导航菜单
首页 >  java程序员面试笔试真题与解析答案视频  > 3万字80道Java基础经典面试题总结(2024修订版)

3万字80道Java基础经典面试题总结(2024修订版)

大家好,我是哪吒。

本系列是《10万字208道Java经典面试题总结(附答案)》的2024修订版。

目录1、说说跨平台性2、Java是如何实现跨平台性的?3、JDK 和 JRE 有什么区别?4、为何要配置Java环境变量?5、Java都有哪些特性?6、== 和 equals 的区别是什么?7、Java中有哪些数学函数?8、Java中有哪些位运算符?9、说说运算符的优先级10、final 在 java 中有什么作用?11、使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?12、this 和super 关键字的作用13、在 Java 中,为什么不允许从静态方法中访问非静态变量?14、final 与 static 的区别?15、int可以强制转换为byte吗?16、char 型变量中能存储一个中文汉字吗?17、byte类型127+1等于多少18、为什么数组的起始索引是0而不是1?19、什么是机器语言?20、什么是汇编语言?21、Java属于什么语言?22、JAVA中有几种基本数据类型,各自占用多少字节呢?23、数据类型之间的如何转换?24、说说Java中的数据类型提升25、Object类有哪些常用方法?26、equals和hashcode的关系27、String str="i"与 String str=new String(“i”)一样吗?28、String s = "nezha";s = s + " soft";这两行代码执行后,原始的 String 对象中的内容到底变了没有?29、如何将字符串反转?30、String 类的常用方法都有那些?31、String s = new String("nezha");创建了几个字符串对象?32、想新建一个java.lang.String类,能建成功吗?这个类会被类加载器加载吗?为什么?33、String类可以被继承吗?34、String,Stringbuffer,StringBuilder 的区别?35、“+”连接符的效率为何低?36、说说缓冲区数据结构bytebuffer37、hashcode是什么?有什么作用?38、Java 创建对象有几种方式39、说说对象创建的过程40、对象间的四种关系41、说说隐式参数和显式参数42、说说Java参数可变43、普通类和抽象类有哪些区别?44、接口和抽象类有什么区别?45、default方法是什么?46、说说Java中多态的实现原理47、构造器可以被重写吗?48、说说Java Bean的命名规范49、Java内部类是什么,有哪些应用场景?50、静态内部类与非静态内部类有什么区别51、throw 和 throws 的区别?52、final、finally、finalize 有什么区别?53、trycatch的执行顺序54、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?55、常见的异常类有哪些?56、开发中,你是如何处理异常的?57、NoClassDefFoundError 和 ClassNotFoundException 有什么区别?58、聊聊记录日志的规范59、哪些内容需要记在日志里?60、Log4j有哪些日志级别?61、什么是 java 序列化?什么情况下需要序列化?62、序列化使用场景有哪些?63、使用序列化和反序列化的注意事项64、为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么?65、Java反射是什么?有哪些应用场景66、java 中都有哪些引用类型?67、枚举是什么,有哪些特点?68、泛型是什么,有哪些应用场景?69、java 中 IO 流分为几种?70、BIO、NIO、AIO 有什么区别?71、BIO、NIO、AIO有哪些应用场景72、简述一下BIO的编程流程73、NIO的三大核心部分是什么?74、NIO中buffer的四大属性是什么?75、对比一下BIO和NIO?76、FileChannel是做什么的?77、简述一下Selector选择器78、lambda表达式是什么,有哪些应用场景?79、Java8 ::是什么,有哪些应用场景?80、Java 8中parallel是干嘛的?81、System.exit(0)的作用是什么?82、Arrays.stream和Stream.of有什么区别?

1、说说跨平台性

我们希望编写好的代码和程序,最好可以在任意平台和环境下运行,而不需要根据不同的平台,编写不同的代码。

比如,我编写的一个博客管理系统,我希望它可以在windows中运行,也可以在Linux环境下运行,也可以在MacOS环境下运行。

这就是跨平台特性,节省开发和运维成本。

2、Java是如何实现跨平台性的?

Java实现跨平台性的关键在于JVM虚拟机,Java语言编写的程序会被编译成与平台无关的字节码文件,这些字节码文件可以在任何装有Java虚拟机的系统上运行,因为Java字节码不针对特定的操作系统或硬件,而是设计成一种中间代码,可以在不同平台上被解释执行。

JVM是Java跨平台的核心组件。它作为一个运行时环境,负责加载字节码并将其解释或编译为特定平台的机器代码。每个操作系统都有其专用的JVM实现,例如Windows、Linux和macOS等。

Java源码只需编译一次,将java文件编译成class文件,就可以通过安装在Windows或Linux中的JVM中运行。

在这里插入图片描述

3、JDK 和 JRE 有什么区别?

JDK是Java开发工具包,它包含了JRE和开发工具(如javac编译器和java程序运行工具等),主要用于Java程序的开发。而JRE是Java运行环境,它只包含了运行Java程序所必须的环境,主要用于Java程序的运行。

JDK面向的是Java开发者,提供了Java开发工具,如编译工具(javac)和打包工具(jar)等,方便开发者进行Java程序的开发和调试。而JRE面向的是Java程序的使用者,只要安装了JRE,就可以在对应的操作系统上运行Java程序。

JDK由JRE和Java开发工具组成,包含了Java语言所必须的类库和Java虚拟机(JVM),以及编译器和调试器等开发工具。而JRE只包含Java虚拟机(JVM)和Java语言所必须的类库,这些类库对于开发来说是足够的,但对于开发过程中的编译和调试并不足够。

在这里插入图片描述

4、为何要配置Java环境变量?

path环境变量的作用就是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找。而我们通常情况下配置的path变量,就是这个目录的完整路径。

简而言之,就是运行某个命令需要某些参数时,如果当前目录下找不到,则自动去环境变量中寻找。

5、Java都有哪些特性?

这是一道没有标准回答的面试题,按照下面的内容陈列即可,回答是切记刻板背诵。

(1)面向对象

Java是一个面向对象的语言,万物皆对象。

面向对象是一种程序设计规范,其基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。

程序就是由无数个对象+对象的行为组装而成,当程序请求某个对象时,实际上就是通过一个请求,将“你自己的对象”传递给程序,程序经过一系列匪夷所思的操作,再将一个新的对象返给你。

从底层角度而言,每一个对象都是由其它对象组成的,只是它们的维度、粒度不同而已。

每一个对象都有不同的属性。

比如芯片+电路板组成了内存,内存+硬盘+cpu+机箱组成了电脑,芯片、电路板、内存、硬盘、CPU、机箱、电脑,都是一个对象,只不过粒度不同罢了。

对象具有属性、方法,在内存中的地址都是唯一的。

(2)分布式

分布式系统对于用户而言,他们面对的就是一个服务器,提供用户需要的服务而已,而实际上这些服务是通过背后的众多服务器组成的一个分布式系统,因此分布式系统看起来像是一个超级计算机一样。

(3)健壮性

为了获得可靠性,Java在一些关键领域进行了限制,从而迫使程序员在程序开发中及早地发现错误。

因为Java是强类型化的语言,它在编译时检查代码。当然不管怎样,在运行时也检查代码。许多难以跟踪的bug,在运行时通 常难以再现,这种情况在Java中几乎不可能产生。因为使编写好的程序在不同的运行条件下,以可预见的方式运行是Java的关键特性之一。

在传统的编程环境中,内存管理是一件困难、乏味的工作。例如,在C/C++中,程序员必须手动分配和释放所有动态内存。Java通过为您管理内存的分配和释放,可以从根本上消除这些问题(事实上,释放内存完全是自动的,因为Java为不再使用的对象提供了垃圾回收功能)。

(4)安全性

Java取消了强大但又危险的指针,而代之以引用。由于指针可进行移动运算,指针可随便指向一个内存区域,而不管这个区域是否可用,这样做是危险的,因为原来这个内存地址可能存储着重要数据或者是其他程序运行所占用的,并且使用指针也容易数组越界。

垃圾回收机制:不需要程序员直接控制内存回收,由垃圾回收器在后台自动回收不再使用的内存。避免程序忘记及时回收,导致内存泄露。避免程序错误回收程序核心类库的内存,导致系统崩溃。

异常处理机制:Java异常机制主要依赖于try、catch、finally、throw、throws五个关键字。

强制类型转换:只有在满足强制转换规则的情况下才能强转成功。

Java在字节码的传输过程中使用了公开密钥加密机制(PKC)。

在运行环境提供了四级安全性保障机制:字节码校验器 -类装载器 -运行时内存布局 -文件访问限制。

(5)体系结构中立

编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要有Java运行时系统,就可以在许多处理器上运行。Java编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易地在任何机器上解释执行,而且还可以迅速地翻译成本地机器的代码。

字节码实现了结构中立,与计算机结构无关。

(6)可移植性

Java语言之中最大的特点在于其可移植性的支持,所谓的可移植性指的是同一个程序可以在不同的操作系统之间任意的进行部署,这样就减少了开发的难度,在Java里面如果要想实现可移植性的控制,那么主要依靠的是JVM(Java 虚拟机)。Java虚拟机是一个由软件和硬件模拟出来的计算机,所有的程序只要有Java虚拟机的支持,那么就可以实现程序的执行,并且不同的操作系统上会有不同版本的JVM存在,这样就可以实现移植性。

(7)解释性

有人说Java是编译型的。因为所有的Java代码都是要编译的,.java不经过编译就无法执行。 也有人说Java是解释型的。因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释型的。

(8)高性能

即时编译器可以监控经常执行哪些代码并优化这些代码以提高速度。更为复杂的优化是消除函数调用(即内联)。即时编译器知道哪些类已经被加载。基于当前加载的类集,如果特定的函数不会被覆盖,就可以使用内联。必要时,还可以撤销优化。

(9)多线程

指的是这个程序(一个进程)运行时产生了不止一个线程。

(10)动态性

Java本质为静态语言,而不是动态语言。动态语言显著的特点是在程序运行时,可以改变程序结构或变量类型,典型的动态语言有Python、ruby、javascript等。Java不是动态语言,但Java具有一定的动态性,表现在以下几个方面:

反射机制;动态字节码操作;动态编译;执行其他脚本代码; 6、== 和 equals 的区别是什么?

(1)类型与定义

==是一个操作符,用于比较两个变量的值。对于基本数据类型,它比较的是变量存储的值是否相等;对于引用类型,它比较的是两个引用是否指向内存中的同一地址(即是否是同一个对象的引用)。 equals()是Object类中的一个方法,用于比较两个对象的内容是否相等。默认情况下,它比较的是对象的内存地址(即是否是同一个对象),但该方法可以被重写以提供自定义的比较逻辑。

(2)运行速度

==:由于只是比较引用或内存地址,所以通常比equals()方法更快。

equals():由于可能需要执行更复杂的比较逻辑(尤其是在被重写的情况下),因此其运行速度可能慢于==。

(3)可重写性

==:不可重写,其行为是固定的。 equals():可以被重写以提供自定义的相等性判断逻辑。

下面程序的输出结果是什么?

public class Main {public static void main(String[] args) { Integer a = 1;Integer b = 2;Integer c = 3;Integer d = 3;Integer e = 321;Integer f = 321;Long g = 3L;Long h = 2L; System.out.println(c==d);//trueSystem.out.println(e==f);//falseSystem.out.println(c==(a+b));//trueSystem.out.println(c.equals(a+b));//trueSystem.out.println(g==(a+b));//trueSystem.out.println(g.equals(a+b));//falseSystem.out.println(g.equals(a+h));//true}}

当 "=="运算符的两个操作数都是 包装器类型的引用,则是比较指向的是否是同一个对象,而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。另外,对于包装器类型,equals方法并不会进行类型转换。

第一个和第二个输出结果没有什么疑问。第三句由于 a+b包含了算术运算,因此会触发自动拆箱过程(会调用intValue方法),因此它们比较的是数值是否相等。而对于c.equals(a+b)会先触发自动拆箱过程,再触发自动装箱过程,也就是说a+b,会先各自调用intValue方法,得到了加法运算后的数值之后,便调用Integer.valueOf方法,再进行equals比较。同理对于后面的也是这样,不过要注意倒数第二个和最后一个输出的结果(如果数值是int类型的,装箱过程调用的是Integer.valueOf;如果是long类型的,装箱调用的Long.valueOf方法)。

7、Java中有哪些数学函数?

Java中提供了一些数学函数,位于java.lang.Math类中。这些函数包括以下几种:

基本数学函数:abs、max、min。 指数函数:exp、log、pow。 三角函数:sin、cos、tan、asin、acos、atan。 双曲函数:sinh、cosh、tanh、asinh、acosh、atanh。 随机数函数:random。

8、Java中有哪些位运算符?

(1)与运算符 &

只有两个位都是1,结果才是1

package com.nezha.javase; public class Test {public static void main(String[] args) {int x = 129;int y = 128;System.out.println("x 和y 与的结果是:"+(x&y)); // 128}}

x 二进制 10000001;

y 二进制 10000000;

根据与运算符的运算规律,只有两个位都是1,结果才是1,可以知道结果就是10000000,即128。

(2)或运算符 |

两个位只要有一个为1,那么结果就是1,否则就为0。

package com.nezha.javase; public class Test {public static void main(String[] args) {int x = 129;int y = 128;System.out.println("x 和y 或的结果是:"+(x|y)); // 129}}

(3)非运算符 ~

如果位为0,结果是1,如果位为1,结果是0。

(4)异或运算符 ^

两个操作数的位中,相同则结果为0,不同则结果为1。

(5)左移运算符

移位运算符的右操作数要完成模32的运算。

1

相关推荐: