《互联网大厂Java求职者面试:核心知识大考验》

42 阅读5分钟

面试官:请简要介绍一下Java中的多线程。

王铁牛:多线程就是可以在一个程序里同时执行多个任务嘛。比如我一边听歌一边写代码。

面试官:那如何创建一个线程呢?

王铁牛:可以通过继承Thread类或者实现Runnable接口来创建。

面试官:回答得不错。那说说线程池的作用和原理吧。

王铁牛:线程池能复用线程,减少线程创建和销毁的开销。原理嘛,就是预先创建一些线程,放到池子里,有任务就从池子里拿线程来执行。

面试官:很好,第一轮表现不错。接下来第二轮,讲讲HashMap的底层实现。

王铁牛:HashMap底层是数组加链表,后来链表长度超过8会转成红黑树。

面试官:那HashMap在多线程环境下会有什么问题?

王铁牛:会出现数据丢失、死循环啥的。

面试官:怎么解决这些问题呢?

王铁牛:不太清楚,瞎答一个,用ConcurrentHashMap。

面试官:第二轮表现一般啊。最后一轮,说说Spring的核心特性。

王铁牛:Spring能依赖注入,管理bean。

面试官:那Spring Boot的优势在哪里?

王铁牛:它简单,能快速搭建项目。

面试官:MyBatis的工作原理呢?

王铁牛:这个……不太会,大概是能操作数据库吧。

面试官:今天的面试就到这里,回去等通知吧。

答案

  1. 多线程:多线程是指在一个程序中可以同时执行多个任务。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。继承Thread类时,需要重写run方法,在run方法中编写线程执行的逻辑。实现Runnable接口时,需要实现run方法,然后将实现类的实例作为参数传递给Thread类的构造函数来创建线程。
  2. 创建线程:继承Thread类创建线程时,直接继承Thread类,并重写run方法。实现Runnable接口创建线程时,先定义一个类实现Runnable接口,实现run方法,然后通过Thread类的构造函数创建线程对象,并将实现类的实例作为参数传入。
  3. 线程池:线程池的作用是复用线程,减少线程创建和销毁的开销,提高系统性能。其原理是预先创建一定数量的线程,存放在线程池中。当有任务提交时,从线程池中获取线程来执行任务。如果线程池中的线程都在忙碌,任务会被放入队列中等待。当线程执行完任务后,会返回线程池继续等待新任务。
  4. HashMap底层实现:HashMap底层是数组加链表的结构。初始时,HashMap创建一个指定大小的数组。当添加键值对时,通过计算键的哈希值,然后对数组长度取模,得到在数组中的索引位置。如果该位置为空,则直接插入新的键值对。如果该位置不为空,则形成链表,新的键值对添加到链表末尾。当链表长度超过8时,会将链表转换为红黑树,以提高查找效率。
  5. HashMap在多线程环境下的问题:在多线程环境下,HashMap可能会出现数据丢失和死循环问题。比如在扩容时,可能会导致链表形成环形结构,从而在后续查找时陷入死循环。同时,如果多个线程同时对HashMap进行写操作,可能会导致数据覆盖,造成数据丢失。
  6. 解决HashMap多线程问题:使用ConcurrentHashMap可以解决上述问题。ConcurrentHashMap采用分段锁机制,将数据分成多个段,每个段有自己的锁。在进行写操作时,只对需要修改的段加锁,其他段可以继续读写,从而提高并发性能。
  7. Spring的核心特性:Spring的核心特性包括依赖注入(DI)和控制反转(IoC)。依赖注入是指将对象的依赖关系通过配置或注解的方式注入到对象中,而不是在对象内部自行创建依赖对象。控制反转是指将对象的创建和管理控制权从应用程序代码转移到Spring容器中。Spring还提供了面向切面编程(AOP)、事务管理、Bean管理等功能。
  8. Spring Boot的优势:Spring Boot的优势在于它提供了一种快速、简单的方式来创建独立的、生产级别的Spring应用程序。它采用了约定大于配置的原则,减少了大量的样板代码。通过自动配置功能,Spring Boot能够自动配置许多常见的组件和功能,使得开发者可以更专注于业务逻辑的实现。同时,Spring Boot还集成了各种常用的框架和工具,方便开发者构建微服务等应用。
  9. MyBatis的工作原理:MyBatis是一个基于Java的持久层框架。其工作原理是通过读取XML配置文件或注解,获取SQL语句和映射关系。当执行数据库操作时,MyBatis会根据映射关系将Java对象转换为SQL语句所需的参数,然后执行SQL语句,并将结果集按照映射关系转换为Java对象返回。MyBatis内部使用了Executor执行器来执行SQL,通过Configuration配置对象管理各种配置信息,通过MappedStatement对象存储SQL语句和映射关系等。