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

98 阅读4分钟

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

第一轮: 面试官:请你简单介绍一下 Java 的基本数据类型有哪些? 王铁牛:有 byte、short、int、long、float、double、char、boolean 这几种。 面试官:不错,那你说说这些基本数据类型在内存中的存储方式有什么不同? 王铁牛:嗯……这个……(挠挠头)不太清楚。 面试官:基本数据类型在栈内存中存储,它们的值直接存储在栈内存中,而引用数据类型存储在堆内存中,栈内存中存储的是对象的引用。

面试官:再说说 Java 中的面向对象特性有哪些? 王铁牛:有封装、继承、多态。 面试官:很好,那你举例说明一下封装的作用吧。 王铁牛:封装可以隐藏对象的内部实现细节,只对外提供必要的接口,这样可以提高代码的安全性和可维护性。

第二轮: 面试官:谈谈你对多线程的理解。 王铁牛:多线程就是可以同时执行多个任务的机制。 面试官:那在 Java 中如何创建和启动一个线程呢? 王铁牛:可以通过继承 Thread 类或实现 Runnable 接口来创建线程,然后调用 start()方法启动线程。 面试官:不错,那你说说线程的生命周期有哪些状态? 王铁牛:有新建、就绪、运行、阻塞、死亡这几种状态。 面试官:能详细说说阻塞状态吗? 王铁牛:(思考片刻)阻塞状态就是线程因为等待某个条件而暂停执行,比如等待锁、等待 IO 操作完成等。

面试官:再问你一个关于多线程的问题,谈谈线程安全的概念。 王铁牛:线程安全就是多个线程同时访问共享资源时,不会出现数据不一致的情况。 面试官:那在 Java 中如何实现线程安全呢? 王铁牛:可以使用同步代码块、同步方法或使用线程安全的类,比如 ConcurrentHashMap 等。

第三轮: 面试官:讲讲你对集合框架的了解,比如 ArrayList 和 LinkedList 的区别。 王铁牛:ArrayList 是基于数组实现的,查询快,插入和删除慢;LinkedList 是基于链表实现的,查询慢,插入和删除快。 面试官:不错,那你说说 ArrayList 的扩容机制是怎样的? 王铁牛:(犹豫了一下)好像是当数组满了之后,会创建一个新的数组,然后将原来数组中的元素复制到新数组中。 面试官:非常好,那你再说说 LinkedList 的插入和删除操作是如何实现的? 王铁牛:(一脸茫然)这个……不太清楚。 面试官:LinkedList 是通过修改链表的指针来实现插入和删除操作的,不需要像 ArrayList 那样移动大量的元素。

面试官:好了,今天的面试就到这里,你可以回去等通知了。

答案:

  • Java 的基本数据类型在内存中的存储方式:基本数据类型在栈内存中存储,它们的值直接存储在栈内存中,而引用数据类型存储在堆内存中,栈内存中存储的是对象的引用。例如,int num = 10;num是基本数据类型,它的值10直接存储在栈内存中;String str = "hello";str是引用数据类型,它在栈内存中存储的是指向堆内存中"hello"字符串对象的引用。
  • 线程的生命周期状态:新建状态是指线程对象已经创建,但还没有调用 start()方法;就绪状态是指线程对象已经创建并且调用了 start()方法,等待 CPU 调度;运行状态是指线程获得 CPU 资源正在执行;阻塞状态是指线程因为等待某个条件而暂停执行,比如等待锁、等待 IO 操作完成等;死亡状态是指线程执行完毕或因异常等原因终止。
  • ArrayList 的扩容机制:当 ArrayList 的数组满了之后,会创建一个新的数组,其大小通常是原来数组的 1.5 倍,然后将原来数组中的元素复制到新数组中。例如,初始容量为 10 的 ArrayList,当添加第 11 个元素时,会创建一个大小为 15 的新数组,然后将原来 10 个元素复制到新数组中。
  • LinkedList 的插入和删除操作实现:LinkedList 是通过修改链表的指针来实现插入和删除操作的。在链表中,每个元素都包含一个指向下一个元素的指针,插入和删除操作只需要修改相关元素的指针即可,不需要像 ArrayList 那样移动大量的元素。例如,在链表的头部插入一个元素,只需要将新元素的指针指向原来的头元素,然后将头指针指向新元素即可;删除一个元素,只需要将前一个元素的指针指向后一个元素即可。