java基础面试10题

时间:2023-3-4    作者:z    分类: 开发日记


1.JVM、JRE 和 JDK 的关系

Jvm:java虚拟机,类似于一个小型的计算机,它能够将java程序编译后的.class 文件解释给相应平台的本地系统执行,从而实现跨平台。

jre:是运行java程序所需要的环境的集合,它包含了jvm的标准实现和java的核心类库。

jdk:是针对java开发的产品,其中包含了java运行环境jre和java的工具以及基础类库。

2.什么是跨平台性?原理是什么?

跨平台性指的是java的一次编译,可以在多个平台运行,即一次编译到处运行。

原理:java程序编译成.class文件后,运行在平台上的java虚拟机会将程序逻辑解释给本地系统,让本地系统底层去执行,说白了就是java程序不会与系统的底层打交道,需要java虚拟机这个中介传话。只要平台上安装有java虚拟机,都能够在该平台运行java程序。

3.&和&&的区别?

&& 操作符具有短路功能, 当前置条件为false 时,将不会判断后置的条件。如 false && xxxx ,程序将不会去判断xxxx是否为true或者false,反之 true && xxxx 时才会去判断。而 & 运算符无论什么时候都会判断两边的条件,当两边的表达式为true时结果为true

4.用最有效率的方法计算 2 乘以 8

使用移位运算 :16 >> 1 为 16 / 2 8 << 1 为 2 * 8

5.在没有使用临时变量的情况如何交换两个整数变量的值?

1.使用加减法:

a = a + b;

b = a - b;

a = a - b;

在执行第一个步骤时,a的值会变为x+y,这时我们可以利用这个和值来通过两次减法来得到b的新值。最后一步同理。

2.使用位运算:

a = a ^ b;

b = a ^ b;

a = a ^ b;

在执行第一个步骤时,a和b的值会进行异或运算,得到一个新的值c。此时,a的值变成了c,而b的值还是原来的y。在第二步中,我们将c和y再次进行异或运算,得到的结果就是原来的x,这个结果就被赋值给了b。最后一步同理。

6.short s1 = 1; s1 = s1 + 1;有错吗? short s1 = 1; s1 += 1;有错吗?

在Java中,short类型的数值是16位的有符号整数,范围是从 -32768 到 32767。对于 short s1 = 1; s1 = s1 + 1; 这行代码来说,s1 + 1的结果是一个int类型的值,需要将其强制转换为short类型才能赋值给s1,因此这行代码会报错。而对于 short s1 = 1; s1 += 1; 这行代码来说,它等价于 s1 = (short)(s1 + 1); 其中加法运算的结果会自动进行类型转换,然后再将结果强制转换为short类型,所有这行代码是合法的,不会报错。

7.float f=3.4;是否正确?

因为3.4是一个双精度浮点数,Java中的浮点数默认为双精度浮点数,而将一个双精度浮点数直接赋值给一个单精度浮点数变量是不安全的,因为单精度浮点数只有23位有效数字,而双精度浮点数有53位有效数字,会造成精度损失。要想正确的赋值,应该在数字后面加上一个f或F,将其显示地声明为单精度浮点数,即可以这样写:float f = 3.4f;

8.手动实现一下冒泡排序(快速排序)

冒泡排序:

public static void bubbleSort(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换 arr[j] 和 arr[j+1] 的位置
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

快速排序:

public static void quickSort(int[] arr, int left, int right) {
    if (left < right) {
        // 执行一次 partition 操作,将数组划分为两个子数组
        int pivotIndex = partition(arr, left, right);
        // 对左边子数组进行快速排序
        quickSort(arr, left, pivotIndex - 1);
        // 对右边子数组进行快速排序
        quickSort(arr, pivotIndex + 1, right);
    }
}
// partition 操作:将数组划分为左右两个子数组,并返回分界点的位置
private static int partition(int[] arr, int left, int right) {
    // 选取最后一个元素作为基准值
    int pivot = arr[right];
    // i 指向左子数组的末尾
    int i = left - 1;
    for (int j = left; j < right; j++) {
        if (arr[j] < pivot) {
            // 将 arr[j] 和左子数组的末尾交换位置
            i++;
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    // 将基准值放到分界点的位置上
    int temp = arr[i + 1];
    arr[i + 1] = arr[right];
    arr[right] = temp;
    // 返回分界点的位置
    return i + 1;
}

9.实现打印指定行数的空心菱形的功能

public static void printHollowDiamond(int n) {
    if (n % 2 == 0) {
        // 如果 n 是偶数,则将其加1,使得最中间的行有奇数个星号
        n++;
    }
    // 打印上半部分菱形
    for (int i = 1; i <= n / 2 + 1; i++) {
        for (int j = 1; j <= n / 2 + 1 - i; j++) {
            System.out.print(" ");
        }
        System.out.print("*");
        for (int k = 1; k < 2 * (i - 1); k++) {
            System.out.print(" ");
        }
        if (i != 1) {
            System.out.print("*");
        }
        System.out.println();
    }
    // 打印下半部分菱形
    for (int i = n / 2; i >= 1; i--) {
        for (int j = 1; j <= n / 2 + 1 - i; j++) {
            System.out.print(" ");
        }
        System.out.print("*");
        for (int k = 1; k < 2 * (i - 1); k++) {
            System.out.print(" ");
        }
        if (i != 1) {
            System.out.print("*");
        }
        System.out.println();
    }
}

10.题目:将一个正整数分解质因数。

例如:输入 90,打印出 90=2*3*3*5。

public static void factorize(int n) {
    System.out.print(n + "=");
    for (int i = 2; i <= n; i++) {
        while (n % i == 0) {
            System.out.print(i);
            n /= i;
            if (n != 1) {
                System.out.print("*");
            }
        }
    }
}

标签: 开发日记 java基础