JavaSE常见面试题——持续更新中

引言:本人目前是大四的科班软件工程专业学生,正在面临实习找工作,自己总结了一些常见的JavaSE里基础的面试题,同时分享给大家。

第一部分——Java基础知识

1. Oracle公司为什么收购SUN公司?
答:从程序开发体系来讲,开发分为4层:操作系统、数据库、中间件、编程语言,Oracle公司为了与微软竞争,所以才收购SUN公司。
Oracle公司与微软公司在开发体系上的区别:

序号开发体系Oracle微软
1操作系统UNIXWindows
2数据库Oracle数据库SQL Server数据库
3中间件OASIIS
4编程语言JavaC#

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类型的属性
全局代码区: 保存所有方法的定义

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学徒钝子生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值