《互联网大厂 Java 求职者面试三轮问答及答案》
第一轮: 面试官:请你简单介绍一下 Java 的基本数据类型有哪些? 王铁牛:Java 的基本数据类型有 byte、short、int、long、float、double、char、boolean 这八种。 面试官:不错,那你说说这些基本数据类型在内存中的存储方式有什么不同呢? 王铁牛:嗯……这个……我不太清楚。 面试官:没关系,我们继续下一个问题。在 Java 中,如何实现字符串的拼接? 王铁牛:可以使用“+”运算符或者 String.concat()方法来实现字符串的拼接。
第二轮: 面试官:谈谈你对多线程的理解吧。 王铁牛:多线程就是可以同时执行多个任务的机制,比如在一个程序中同时处理多个用户的请求。 面试官:很好,那你知道线程的创建方式有哪些吗? 王铁牛:好像有继承 Thread 类和实现 Runnable 接口这两种方式吧。 面试官:那你能分别举例说明一下吗? 王铁牛:(沉默片刻)这个……我有点记不清了。
第三轮: 面试官:说说你对 HashMap 的工作原理的理解。 王铁牛:HashMap 是基于哈希表实现的,它通过哈希函数将键映射到桶中,然后在桶中存储键值对。 面试官:不错,那你知道 HashMap 的哈希冲突是怎么解决的吗? 王铁牛:(挠挠头)这个我不太明白。 面试官:没关系,今天的面试就到这里吧,你可以回家等通知。
答案:
- Java 的基本数据类型在内存中的存储方式:
- byte、short、int、long 是整数类型,存储在栈内存中,它们的大小分别为 1 字节、2 字节、4 字节、8 字节。
- float、double 是浮点数类型,存储在栈内存中,它们的大小分别为 4 字节、8 字节。
- char 是字符类型,存储在栈内存中,占用 2 字节。
- boolean 是布尔类型,存储在栈内存中,占用 1 字节。
- 线程的创建方式:
- 继承 Thread 类:通过继承 Thread 类,重写 run()方法来创建线程。示例代码如下:
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()方法来创建线程。示例代码如下:
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();
}
}
- HashMap 的工作原理:
- HashMap 是基于哈希表实现的,它通过哈希函数将键映射到桶中。哈希函数是根据键的哈希码计算出桶的索引位置。
- 当向 HashMap 中插入键值对时,首先计算键的哈希码,然后根据哈希码找到对应的桶。如果桶中没有冲突,直接将键值对插入到桶中;如果桶中已经有其他键值对,就会发生哈希冲突。
- HashMap 解决哈希冲突的方式是使用链表或红黑树。当桶中的链表长度超过阈值(默认是 8)时,会将链表转换为红黑树,以提高查询效率。
- HashMap 的哈希冲突解决方式:
- 当发生哈希冲突时,HashMap 会使用链表或红黑树来存储冲突的键值对。
- 如果桶中的链表长度小于等于 8,并且桶中的元素个数小于等于 64,就会使用链表来存储冲突的键值对。
- 如果桶中的链表长度大于 8,或者桶中的元素个数大于 64,就会将链表转换为红黑树,以提高查询效率。
希望以上内容对你有所帮助,祝你求职顺利!