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

24 阅读5分钟

面试官:第一轮面试开始。首先问你,说说Java中的多线程如何实现资源共享?

王铁牛:嗯……可以用共享变量呗,多个线程访问同一个变量就能共享资源啦。

面试官:回答得还行。那再问你,线程池有哪些参数,分别有什么作用?

王铁牛:线程池有corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler这些参数。corePoolSize是核心线程数,maximumPoolSize是最大线程数,keepAliveTime是线程空闲时存活的时间,unit是时间单位,workQueue是任务队列,threadFactory是线程工厂,handler是拒绝策略。

面试官:不错,回答得挺准确。最后一个问题,HashMap在多线程环境下会出现什么问题?

王铁牛:会出现链表成环,然后死循环啥的吧。

面试官:好,第一轮面试结束。

第二轮面试开始。讲讲JVM的内存结构。

王铁牛:JVM内存结构包括堆、栈、方法区、程序计数器、本地方法栈。堆是存放对象实例的地方,栈是存放局部变量和方法调用的地方,方法区存放类信息、常量、静态变量等,程序计数器记录当前线程执行的字节码的行号,本地方法栈是执行本地方法的。

面试官:那类加载机制有哪些?

王铁牛:类加载机制有加载、验证、准备、解析、初始化。

面试官:准备阶段都做些什么?

王铁牛:准备阶段就是为类的静态变量分配内存并设置初始值。

面试官:第二轮面试结束。

第三轮面试开始。说说Spring的核心特性。

王铁牛:Spring的核心特性就是依赖注入和面向切面编程呗。

面试官:Spring Boot和Spring有什么区别?

王铁牛:Spring Boot更简单,它自动配置了很多东西,让开发更快速。

面试官:MyBatis的核心配置文件主要配置哪些内容?

王铁牛:呃……好像有数据库连接啥的吧。

面试官:好,三轮面试结束。回去等通知吧。

答案

Java中的多线程如何实现资源共享: 多个线程可以通过共享对象的方式来实现资源共享。例如,定义一个类,其中包含共享资源的成员变量,多个线程创建该类的实例,通过访问实例的成员变量来共享资源。同时,需要注意线程安全问题,可以使用synchronized关键字或者其他线程安全机制来保证资源的正确访问。

线程池有哪些参数,分别有什么作用

  1. corePoolSize:核心线程数,当提交的任务数小于corePoolSize时,线程池会创建新的线程来执行任务。
  2. maximumPoolSize:最大线程数,当提交的任务数大于corePoolSize且任务队列已满时,线程池会创建新的线程直到线程数达到maximumPoolSize。
  3. keepAliveTime:线程空闲时存活的时间,当线程数大于corePoolSize且线程空闲时间超过keepAliveTime时,多余的线程会被销毁。
  4. unit:时间单位,用于指定keepAliveTime的时间单位。
  5. workQueue:任务队列,用于存放提交的任务,当提交的任务数大于corePoolSize时,任务会被放入workQueue中。
  6. threadFactory:线程工厂,用于创建线程,可自定义线程的名称、优先级等。
  7. handler:拒绝策略,当提交的任务数大于maximumPoolSize且任务队列已满时,会调用handler来处理新提交的任务。

HashMap在多线程环境下会出现什么问题: 在多线程环境下,HashMap可能会出现链表成环导致死循环的问题。这是因为在扩容时,可能会导致链表的顺序发生变化,从而形成环形链表。当其他线程遍历该链表时,就会陷入死循环。

JVM的内存结构

  1. 堆:是JVM中最大的一块内存区域,用于存放对象实例。
  2. 栈:用于存放局部变量和方法调用的上下文。
  3. 方法区:存放类信息、常量、静态变量等。
  4. 程序计数器:记录当前线程执行的字节码的行号。
  5. 本地方法栈:执行本地方法。

类加载机制有哪些

  1. 加载:将类的字节码文件加载到内存中。
  2. 验证:验证字节码文件的正确性。
  3. 准备:为类的静态变量分配内存并设置初始值。
  4. 解析:将符号引用转换为直接引用。
  5. 初始化:执行类的静态代码块和静态变量的赋值操作。

准备阶段都做些什么: 准备阶段主要为类的静态变量分配内存并设置初始值。例如,对于静态变量int a = 10,在准备阶段会为a分配内存,但初始值为0,而不是10。10是在初始化阶段赋值的。

Spring的核心特性

  1. 依赖注入:通过IoC容器将对象之间的依赖关系注入到对象中,降低对象之间的耦合度。
  2. 面向切面编程(AOP):通过动态代理等方式,将横切关注点(如日志、事务等)与业务逻辑分离,提高代码的可维护性和复用性。

Spring Boot和Spring有什么区别

  1. Spring Boot是基于Spring构建的框架,它更加简单易用,提供了自动配置的功能,能够快速搭建起一个Spring应用。
  2. Spring Boot简化了Spring的配置过程,减少了大量的XML配置文件,采用了约定大于配置的原则。
  3. Spring Boot内置了Tomcat等服务器,开箱即用,而Spring需要手动配置服务器等环境。

MyBatis的核心配置文件主要配置哪些内容

  1. 数据库连接配置:包括数据库驱动、URL、用户名、密码等。
  2. 映射文件的位置:指定Mapper.xml文件的位置。
  3. 插件配置:可以配置MyBatis的插件,如分页插件等。
  4. 环境配置:可以配置多个数据库环境,方便切换。