引言:本人目前是大四的科班软件工程专业学生,正在面临实习找工作,自己总结了一些常见的JavaSE里基础的面试题,同时分享给大家。
第一部分——Java基础知识
1. Oracle公司为什么收购SUN公司?
答:从程序开发体系来讲,开发分为4层:操作系统、数据库、中间件、编程语言,Oracle公司为了与微软竞争,所以才收购SUN公司。
Oracle公司与微软公司在开发体系上的区别:
序号 | 开发体系 | Oracle | 微软 |
---|---|---|---|
1 | 操作系统 | UNIX | Windows |
2 | 数据库 | Oracle数据库 | SQL Server数据库 |
3 | 中间件 | OAS | IIS |
4 | 编程语言 | Java | C# |
2. Java语言的运行机制?
答:Java程序文件的后缀都是“.java”,而任何一个“.java”程序首先必须经过编译,编译成一个“.class”文件(字节码文件),然后在计算机上执行,但是解释程序的计算机不是真的计算机,而是Java虚拟机(JVM)。Java虚拟机读取并处理编译的与平台无关的“.class”文件,Java解释器负责将Java虚拟机的代码在特定平台上运行。
3. JRE和JDK的区别?
答:JRE是指:Java运行环境,包括Java虚拟机、Java核心类库和支持文件。它不包含开发工具——编译器、调试器和其他工具。
JDK是Java开发工具包,它包含开发工具和编译器。
4. CLASSPATH和JVM的关系?
答:每次使用Java指令执行“.class”文件时,都会启动JVM,JVM通过CLASSPATH给出路径加载所需要的类文件,可以通过 SET CLASSPATH 设置类的加载路径。
5. Java中的数据类型有哪些?请举例说明。
答:Java数据类型分为:基本数据类型和引用数据类型。
基本数据类型包括: byte,short,int,long,float,double,char,boolean。
引用数据类型包括: 类(class),接口(interface),数组等。
6. 如何快速计算出2的3次方?
答:直接采用 2 * 2 * 2 的方式不是最快的,因为需要调用数学计算过程(同理,使用Math函数也是如此),由于计算机的数据是按位保存的,所以用移位的速度最快。
/**
1. @author 学徒钝子生
2. @date : 2023/9/12
*/
public class Demo {
public static void main() {
int a = 2;
// 左移两位
System.out.println(a<<2);
}
}
7. 请解释&和&&,|和||的区别?
答:
当它们作为逻辑运算符:
与运算分为普通与(&)和短路与(&&):
&: 所有逻辑判断条件都要执行。
&&: 如果前面的逻辑判断条件返回假(false),后面的逻辑判断条件均不在判断,直接返回假(false)。
或运算分为普通或(|)和短路或(||):
|: 所有逻辑判断条件都要执行。
||: 如果前面的逻辑判断条件返回真(true),后面的逻辑判断条件均不在判断,直接返回真(true)。
当它们作为位运算符:
位运算包括:与运算(&)和或运算(|),没有(&&)和(||)。
第二部分——面向对象
1. 面向过程和面向对象的区别?
答:
面向过程: 是以实现程序基本功能为主,开发过程只针对问题本身,不做模块化设计,因此,在后续代码维护时较为困难,同时,相似的程序块复用性差。
面向对象: 采用子模块化设计,每一个模块都需要单独存在,并且可以被重复使用。
2. 简述面向对象的三大特性?
封装性: 将不需要外界知道的信息隐藏起来,同时把对象的属性和行为看成一个整体,将二者“封装”在一个独立单位(对象)中。
继承性: 在已有的程序结构上继续扩充新的功能,即:将反映事物一般特性的类在其基础上派生出反映特殊事物的类。
多态性: 允许程序中出现同名现象。Java中包含两个形式的多态:方法的重载和对象多态。
方法重载: 方法名相同,方法的参数个数或参数类型不同。
对象多态: 子类对象可以和父类对象进行相互转换,而且根据其子类的不同,完成的功能也不同。
3. 类与对象的概念?
答:类: 类描述的是公共特性,类必须通过对象才可以使用。
对象: 具体的某一个可以使用的、代表个性的事物。
4. 什么是声明对象?
答:声明对象是指未开辟堆内存的对象,直接使用会有NullPointException(空指针异常),对象通过new进行堆空间开辟,有了堆内存引用的对象,称为声明对象。
5. 什么是GC垃圾回收机制?
答:GC垃圾回收机制就是:当GC检测到一个堆中的某个对象不在被栈内存所引用时,就会不定期的对这个栈内存所指向的堆内存中的对象进行回收。有了GC机制,开发者不需要考虑内存回收的问题,也不用担心内存泄漏的问题了。
6. 请编写一个数组排序的操作。
答:不要一上来就调用“java.util.Arrays.sort()”方法,面试官考察的是你对于排序的算法能力,调用方法谁不会,可以先自己写一个排序方法(我用的是冒泡排序),写完以后,最后在补充一句:可以直接用JDK里的“java.util.Arrays.sort()”方法完成排序。
/**
3. @author 学徒钝子生
4. @date : 2023/9/14
*/
public class Sort {
public static void main(String[] args) {
int[] dataArray = new int[] {3, 1, 9, 4, 6, 8, 7, 5, 2, 0};
sort(dataArray);
show(dataArray);
}
/**
* 冒泡排序
* @param array 需要排序的数组
*/
public static void sort(int[] array){
for (int i = 0; i < array.length; i++) { // i控制外层循环排序总体的次数
for (int j = 0; j < array.length - 1; j++) { // j控制内层循环每次排序的控制
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
/**
* 展示排序后的结果
* @param array 排序后的数组
*/
public static void show(int[] array) {
for (int arr : array) {
System.out.print(arr + " "); // 空格分割
}
System.out.println(); // 换行
}
}
7. 请编写一个一维数组转置的操作。
答:
/**
5. @author 学徒钝子生
6. @date : 2023/9/14
*/
public class Reverse {
public static void main(String[] args) {
int[] dataArray = new int[] {3, 1, 9, 4, 6};
reverse(dataArray);
show(dataArray);
}
/**
* 实现一维数组的转置操作
* @param array 需要转置的一维数组
*/
public static void reverse(int[] array) {
int length = array.length / 2; // 转置的次数
int head = 0; // 头标
int tail = array.length - 1; // 尾标
for (int i = 0; i < length; i++) {
int temp = array[head]; // 把 头标所指向的数 赋值给 临时变量temp
array[head] = array[tail]; // 把 尾标所指向的数 赋值给 头标所指向的数
array[tail] = temp; // 把 临时变量temp 赋值给 尾标所指向的数
head++; // 头标+1
tail--; // 尾标-1
}
}
/**
* 展示转置后的结果
* @param array 转置后的数组
*/
public static void show(int[] array) {
for (int arr : array) {
System.out.print(arr + " "); // 空格分割
}
System.out.println(); // 换行
}
}
8. 请解释String类中“==”和“equals()”的区别?
答:
“==” 是Java中提供的关系运算符,主要的功能是进行数值相等判断,如果用在String上表示的是内存地址的比较。
“equals()” 是专门负责进行字符串(对象)内容比较的。
9. 请解释String类的两种对象实例化方式的区别?
答:直接赋值(=): 只会开辟一个堆内存空间,并且会自动保存在对象池中以供下次使用。
构造方法(new): 开辟两个堆内存空间,其中一个会变成垃圾,并且不会入池,用户可以使用intern()方法手动入池。
10. Java中常用的内存区域有哪些?
答:
栈内存: 保存引用的堆内存的地址
堆内存: 保存每个对象具体的属性值
全局数据区: 保存static类型的属性
全局代码区: 保存所有方法的定义