面试官:请简要介绍一下Java中的多线程。
王铁牛:多线程就是多个线程同时执行呗,能提高程序效率。
面试官:那如何创建一个线程呢?
王铁牛:可以继承Thread类或者实现Runnable接口。
面试官:不错,回答正确。那说说线程池的作用和优势吧。
王铁牛:线程池能复用线程,减少创建和销毁线程的开销,提高性能。
第一轮结束。
面试官:谈谈JVM的内存结构。
王铁牛:嗯……有堆、栈、方法区啥的。
面试官:那对象在JVM中是如何分配内存的?
王铁牛:不太清楚,大概是在堆里吧。
面试官:讲讲Spring框架的核心特性。
王铁牛:这个嘛,能依赖注入啥的。
第二轮结束。
面试官:说说HashMap的底层实现原理。
王铁牛:就是数组加链表嘛。
面试官:当HashMap发生哈希冲突时怎么办?
王铁牛:呃……不太记得了。
面试官:简述一下MyBatis的工作流程。
王铁牛:就是发SQL啥的,具体不太明白。
第三轮结束。
面试官:今天的面试就到这里,回去等通知吧。
多线程:创建线程的方式有继承Thread类和实现Runnable接口。继承Thread类时,重写run方法定义线程执行逻辑;实现Runnable接口时,实现run方法,然后将其作为参数传入Thread类的构造函数创建线程对象。线程池的作用是复用线程,减少线程创建和销毁的开销,提高性能。
JVM内存结构:主要包括堆、栈、方法区。堆用于存储对象实例;栈用于存储局部变量、方法调用等;方法区存储类信息、常量、静态变量等。对象在JVM中的内存分配主要在堆中,通过new关键字创建对象时,JVM会在堆中分配内存空间,并对对象的成员变量进行初始化。
Spring框架核心特性:依赖注入,通过配置文件或注解将对象之间的依赖关系注入到对象中;面向切面编程,通过切面来实现横切关注点,如日志记录、事务管理等;IoC容器,负责创建、管理和装配对象。
HashMap底层实现原理:基于数组和链表实现。当向HashMap中插入键值对时,首先计算键的哈希值,然后根据哈希值找到对应的数组下标。如果该下标为空,则直接插入新的键值对;如果不为空,则通过链表或红黑树来解决哈希冲突。
MyBatis工作流程:首先读取配置文件,创建SqlSessionFactory;然后通过SqlSessionFactory创建SqlSession;接着通过SqlSession执行SQL语句,如查询、插入、更新、删除等;最后处理结果集,关闭SqlSession。