发现最近很多学生找我咨询Java的面试题,说网上找的不全,没有答案的。所以花了好久时间整理771页,1500多道常见面试题及详细解答!按照模块划分有清晰目录,希望对正在找工作的同学有帮助!
列举了众多 IT 公司面试真题,对应聘 Java 程序员职 位的常见考点和知识体系都进行的分类和归纳整理。本题集包含了常见的算法、面试题,也包含了新的高级技术,比如:微服务架构 等技术的面试题目。本题集非常全面,对于工作 1-5 年左右的 java 程序员面试有非常好的指导作用。
哈哈,应该没有比这更全的面试题了吧!
第一篇:面试题汇总
Java 基础、语法
1.Java 跨平台原理(字节码文件、虚拟机)
C/C++语言都直接编译成针对特定平台机器码。如果要跨平台,需要使用相应
的编译器重新编译。
Java 源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码
文件再解释成机器码运行。解释是通过 Java 虚拟机来执行的。
字节码文件不面向任何具体平台,只面向虚拟机。Java 虚拟机是可运行 Java 字节码文件的虚拟计算机。不同平台的虚拟机是不同
的,但它们都提供了相同的接口。
Java 语言具有一次编译,到处运行的特点。就是说编译后的.class 可以跨平台运
行,前提是该平台具有相应的 Java 虚拟机。但是性能比 C/C++要低。
Java 的跨平台原理决定了其性能没有 C/C++高
2.Java 的安全性
语言层次的安全性主要体现在:Java 取消了强大但又危险的指针,而代之以引用。由于指针可进行移动运算,
指针可随便指向一个内存区域,而不管这个区域是否可用,这样做是危险的,因
为原来这个内存地址可能存储着重要数据或者是其他程序运行所占用的,并且使
用指针也容易数组越界。
垃圾回收机制:不需要程序员直接控制内存回收,由垃圾回收器在后台自动回收
不再使用的内存。避免程序忘记及时回收,导致内存泄露。避免程序错误回收程
序核心类库的内存,导致系统崩溃。
异常处理机制:Java 异常机制主要依赖于 try、catch、finally、throw、throws
五个关键字。
强制类型转换:只有在满足强制转换规则的情况下才能强转成功。
底层的安全性可以从以下方面来说明
Java 在字节码的传输过程中使用了公开密钥加密机制(PKC)。
在运行环境提供了四级安全性保障机制:
字节码校验器 -类装载器 -运行时内存布局 -文件访问限制
3.Java 三大版本
Java2 平台包括标准版(J2SE)、企业版(J2EE)和微缩版(J2ME)三个版本:
Standard Edition(标准版) J2SE 包含那些构成 Java 语言核心的类。比如:数据库连接、接口定义、输入/输出、网络编程
Enterprise Edition(企业版) J2EE 包含 J2SE 中的类,并且还包含用于开发企业
级应用的类。
比如 servlet、JSP、XML、事务控制
Micro Edition(微缩版) J2ME 包含 J2SE 中一部分类,用于消费类电子产品的软
件开发。
比如:呼机、智能卡、手机、PDA、机顶盒
他们的范围是:J2SE 包含于 J2EE 中,J2ME 包含了 J2SE 的核心类,但新添加
了一些专有类
应用场合,API 的覆盖范围各不相同。
4.什么是 JVM?什么是 JDK? 什么是 JRE?
JVM :JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,它是整个 java
实现跨平台的最核心的部分,所有的 java 程序会首先被编译为.class 的类文件,
这种类文件可以在虚拟机上执行,也就是说 class 并不直接与机器的操作系统相
对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执
行。JVM 是 Java 平台的基础,和实际的机器一样,它也有自己的指令集,并且
在运行时操作不同的内存区域。 JVM 通过抽象操作系统和 CPU 结构,提供了
一种与平台无关的代码执行方法,即与特殊的实现方法、主机硬件、主机操作系统无关。JVM 的主要工作是解释自己的指令集(即字节码)到 CPU 的指令集或
对应的系统调用,保护用户免被恶意程序骚扰。 JVM 对上层的 Java 源文件是
不关心的,它关注的只是由源文件生成的类文件(.class 文件)。
JRE:JRE 是 java runtime environment(java 运行环境)的缩写。光有 JVM
还不能让 class 文件执行,因为在解释 class 的时候 JVM 需要调用解释所需要的
类库 lib。在 JDK 的安装目录里你可以找到 jre 目录,里面有两个文件夹 bin 和
lib,在这里可以认为 bin 里的就是 jvm,
lib 中则是 jvm 工作所需要的类库,而 jvm
和 lib 和起来就称为 jre。所以,在你写完 java 程序编译成.class 之后,你可以
把这个.class 文件和 jre 一起打包发给朋友,这样你的朋友就可以运行你写程序
了(jre 里有运行.class 的 java.exe)。JRE 是 Sun 公司发布的一个更大的系统,
它里面就有一个 JVM。JRE 就与具体的 CPU 结构和操作系统有关,是运行 Java
程序必不可少的(除非用其他一些编译环境编译成.exe 可执行文件……),JRE
的地位就象一台 PC 机一样,我们写好的 Win32 应用程序需要操作系统帮我们
运行,同样的,我们编写的 Java 程序也必须要 JRE 才能运行。
JDK:JDK 是 java development kit(java 开发工具包)的缩写。每个学 java
的人都会先在机器上装一个 JDK,那 让我们看一下 JDK 的安装目录。在目录下
面有六个文件夹、一个 src 类库源码压缩包、和其他几个声明文件。其中,真正
在运行 java 时起作用的是以下四个文件夹:bin、include、lib、jre。现在我们
可以看出这样一个关系,JDK 包含 JRE,而 JRE 包含 JVM。
bin:最主要的是编译器(javac.exe)include:java 和 JVM 交互用的头文件
lib:类库
jre:java 运行环境
(注意:这里的 bin、lib 文件夹和 jre 里的 bin、lib 是不同的)总的来说 JDK
是用于 java 程序的开发,而 jre 则是只能运行 class 而没有编译的功能。eclipse、
idea 等其他 IDE 有自己的编译器而不是用 JDK bin 目录中自带的,所以在安装
时你会发现他们只要求你选 jre 路径就 ok 了。
JDK,JRE,JVM 三者关系概括如下:
jdk 是 JAVA 程序开发时用的开发工具包,其内部也有 JRE 运行环境 JRE。JRE
是 JAVA 程序运行时需要的运行环境,就是说如果你光是运行 JAVA 程序而不是
去搞开发的话,只安装 JRE 就能运行已经存在的 JAVA 程序了。JDk、JRE 内部
都包含 JAVA 虚拟机 JVM,
JAVA 虚拟机内部包含许多应用程序的类的解释器和
类加载器等等。
5.Java 三种注释类型
共有单行注释、多行注释、文档注释 3 种注释类型。使用如下:
单行注释,采用“//”方式.只能注释一行代码。如://类成员变量
多行注释,采用“/*...*/”方式,可注释多行代码,其中不允许出现嵌套。如:
/*System.out.println("a");System.out.println("b");
System.out.println("c");*/
文档注释,采用“/**...*/”方式。如:
/**
* 子类 Dog
* @author Administrator
**/
public class Dog extends Animal{}
6.8 种基本数据类型及其字节数
数据类型
关键字 字节数
数值型
整数型
byte
1
short
2
int
4
long
8
浮点型
float
4
double 8
布尔型
boolean 1(位)字符型
char
2
7.i++和++i 的异同之处
共同点:
1、i++和++i 都是变量自增 1,都等价于 i=i+1
2、如果 i++,++i 是一条单独的语句,两者没有任何区别
3、i++和++i 的使用仅仅针对变量。 5++和++5 会报错,因为 5 不是变量。
不同点:
如果 i++,++i 不是一条单独的语句,他们就有区别 i++ :先运算后增 1。如:
int x=5;
int y=x++;
System.out.println("x="+x+", y="+y);
//以上代码运行后输出结果为:x=6, y=5
++i : 先增 1 后运算。如:
int x=5;
int y=++x;System.out.println("x="+x+", y="+y);
//以上代码运行后输出结果为:x=6, y=6
8.&和&&的区别和联系,|和||的区别和联系
&和&&的联系(共同点):
&和&&都可以用作逻辑与运算符,但是要看使用时的具体条件来决定。
操作数 1&操作数 2,操作数 1&&操作数 2,
表达式 1&表达式 2,表达式 1&&表达式 2,
情况 1:当上述的操作数是 boolean 类型变量时,&和&&都可以用作逻辑与运
算符。
情况 2:当上述的表达式结果是 boolean 类型变量时,&和&&都可以用作逻辑
与运算符。
表示逻辑与(and),当运算符两边的表达式的结果或操作数都为 true 时,整个运
算结果才为 true,否则,只要有一方为 false,结果都为 false。
&和&&的区别(不同点):
(1)、&逻辑运算符称为逻辑与运算符,&&逻辑运算符称为短路与运算符,也可
叫逻辑与运算符。
对于&:无论任何情况,&两边的操作数或表达式都会参与计算。对于&&:当&&左边的操作数为 false 或左边表达式结果为 false 时,&&右边
的操作数或表达式将不参与计算,此时最终结果都为 false。
综上所述,如果逻辑与运算的第一个操作数是 false 或第一个表达式的结果为
false 时,对于第二个操作数或表达式是否进行运算,对最终的结果没有影响,
结果肯定是 false。推介平时多使用&&,因为它效率更高些。
、&还可以用作位运算符。当&两边操作数或两边表达式的结果不是 boolean
类型时,&用于按位与运算符的操作。
|和||的区别和联系与&和&&的区别和联系类似
9.用最有效率的方法算出 2 乘以 8 等于多少
使用位运算来实现效率最高。位运算符是对操作数以二进制比特位为单位进行操
作和运算,操作数和结果都是整型数。对于位运算符“<<”, 是将一个数左移 n
位,就相当于乘以了 2 的 n 次方,那么,一个数乘以 8 只要将其左移 3 位即可,
位运算 cpu 直接支持的,效率最高。所以,2 乘以 8 等于几的最效率的方法是 2
<< 3
10.基本数据类型的类型转换规则
基本类型转换分为自动转换和强制转换。
自动转换规则:容量小的数据类型可以自动转换成容量大的数据类型,也可
以说低级自动向高级转换。这儿的容量指的不是字节数,而是指类型表述的范围。强制转换规则:高级变为低级需要强制转换。
如何转换:
(1)赋值运算符“=”右边的转换,先自动转换成表达式中级别最高的数据类
型,再进行运算。
(2)赋值运算符“=”两侧的转换,若左边级别>右边级别,会自动转换;若左
边级别 == 右边级别,不用转换;若左边级别 < 右边级别,需强制转换。
(3)可以将整型常量直接赋值给 byte, short, char 等类型变量,而不需要进行强
制类型转换,前提是不超出其表述范围,否则必须进行强制转换。
11.if 多分支语句和 switch 多分支语句的异同之处
相同之处:都是分支语句,多超过一种的情况进行判断处理。
不同之处:switch 更适合用于多分支情况,就是有很多种情况需要判断处理,判断条件类
型单一,只有一个入口,在分支执行完后(如果没有 break 跳出),不加判断
地执行下去;而 if—elseif---else 多分枝主要适用于分支较少的分支结构,判断类
型不是单一,只要一个分支被执行后,后边的分支不再执行。switch 为等值判
断(不允许比如>= <=),而 if 为等值和区间都可以,if 的使用范围大。
12.while 和 do-while 循环的区别
while 先判断后执行,第一次判断为 false,循环体一次都不执行
do while 先执行 后判断,最少执行 1 次。
如果 while 循环第一次判断为 true, 则两种循环没有区别。
13.break 和 continue 的作用
break: 结束当前循环并退出当前循环体。
break 还可以退出 switch 语句
continue: 循环体中后续的语句不执行,但是循环没有结束,继续进行循环条件
的判断(for 循环还会 i++)。continue 只是结束本次循环。
14.请使用递归算法计算 n!
package com.bjsxt;import java.io.File;
public class $ {
public static void main(String[] args) {
String path = "D:/301SXT";
test(path);
}
private static void test(String path) {
File f = new File(path);
File[] fs = f.listFiles();
if (fs == null) {
return;
}
for (File file : fs) {
if (file.isFile()) {
System.out.println(file.getPath());
} else {
test(file.getPath());
}
}
}
15.递归的定义和优缺点递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递
归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理
解。
递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但运行效率较低。所以一般不提倡用递归算
法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。
递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
关注我,领取全套电子书籍