《互联网大厂 Java 求职者面试三轮提问及答案》

86 阅读5分钟

以下是《互联网大厂 Java 求职者面试三轮提问及答案》:

第一轮: 面试官:请你简单介绍一下 Java 的基本数据类型有哪些? 王铁牛:有 byte、short、int、long、float、double、char、boolean 这几种。 面试官:不错,那你说说在 Java 中,基本数据类型和引用数据类型的区别是什么? 王铁牛:基本数据类型直接存储值,而引用数据类型存储的是对象的引用。 面试官:很好,那你能举例说明吗? 王铁牛:比如 int 是基本数据类型,它直接存储整数数值;而 String 是引用数据类型,它存储的是指向字符串对象的引用。

第二轮: 面试官:谈谈你对多线程的理解吧。 王铁牛:多线程就是可以同时执行多个任务的机制。 面试官:那在 Java 中创建线程有哪些方式呢? 王铁牛:可以通过继承 Thread 类或者实现 Runnable 接口来创建线程。 面试官:那这两种方式有什么区别呢? 王铁牛:继承 Thread 类方式简单,但不利于代码复用;实现 Runnable 接口方式更灵活,适合多个线程共享资源。

第三轮: 面试官:说说你对 HashMap 的了解吧。 王铁牛:HashMap 是用于存储键值对的集合,它基于哈希表实现。 面试官:那 HashMap 的底层原理是什么呢? 王铁牛:它通过哈希函数将键映射到数组的索引位置,然后在该位置进行插入、删除和查找操作。 面试官:那在什么情况下会发生哈希冲突呢? 王铁牛:当不同的键通过哈希函数计算出相同的索引位置时,就会发生哈希冲突。

面试官:今天的面试就到这里,你可以先回去等通知,我们会尽快给你回复。

答案:

  • Java 的基本数据类型:
    • byte:字节型,占 1 个字节,范围是 -128 到 127。
    • short:短整型,占 2 个字节,范围是 -32768 到 32767。
    • int:整型,占 4 个字节,范围是 -2147483648 到 2147483647。
    • long:长整型,占 8 个字节,范围是很大的整数。
    • float:单精度浮点数,占 4 个字节。
    • double:双精度浮点数,占 8 个字节。
    • char:字符型,占 2 个字节,存储一个字符。
    • boolean:布尔型,占 1 位,只有 true 和 false 两个值。
  • 基本数据类型和引用数据类型的区别:
    • 基本数据类型直接存储值,它们在栈上分配内存,速度快。例如 int a = 10; 直接在栈上存储 10 这个值。
    • 引用数据类型存储的是对象的引用,即指向对象在堆上的地址。例如 String str = "Hello"; "Hello" 字符串对象在堆上创建,str 存储的是指向该对象的引用。
  • 在 Java 中创建线程的方式:
    • 继承 Thread 类:通过继承 Thread 类,重写 run() 方法来定义线程的执行逻辑。然后创建线程对象并调用 start() 方法启动线程。例如:
class MyThread extends Thread {
    @Override
    public void run() {
        // 线程执行的逻辑
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}
- 实现 Runnable 接口:定义一个实现了 Runnable 接口的类,重写 run() 方法。然后创建线程对象并将实现了 Runnable 接口的对象作为参数传递给 Thread 的构造函数,最后调用 start() 方法启动线程。例如:
class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 线程执行的逻辑
    }
}

public class Main {
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
    }
}
- 区别:继承 Thread 类方式简单,直接子类就是线程,但不利于代码复用,因为只能继承一个类;实现 Runnable 接口方式更灵活,多个线程可以共享同一个实现了 Runnable 接口的对象,适合多个线程共享资源的情况。
  • HashMap 的底层原理:
    • HashMap 基于哈希表实现,通过哈希函数将键映射到数组的索引位置。当插入键值对时,首先计算键的哈希值,然后根据哈希值确定在数组中的索引位置。如果该位置没有冲突,就直接将键值对存储在该位置;如果有冲突,就通过链表或红黑树来解决冲突。
    • 哈希函数的设计目的是尽可能均匀地将键分布在数组的各个位置,以提高查找效率。常用的哈希函数有除留余数法等。
    • 在发生哈希冲突时,HashMap 会使用链表来存储冲突的键值对。如果链表长度超过一定阈值(默认 8),会将链表转换为红黑树,以提高查找效率。
  • 哈希冲突发生的情况:
    • 当不同的键通过哈希函数计算出相同的索引位置时,就会发生哈希冲突。例如,两个键的哈希值相同,但它们是不同的对象。这可能是由于哈希函数的局限性或键的分布不均匀导致的。
    • 在 HashMap 中,通过链表或红黑树来处理哈希冲突,以保证在发生冲突时能够快速地查找和插入键值对。