本文共 4137 字,大约阅读时间需要 13 分钟。
Java初级开发技术面试题
1. String与StringBuffer、StringBuilder的区别
线程安全性
- String:对象不可变,线程安全。
- StringBuffer:对方法和操作加了同步锁,线程安全。
- StringBuilder:未加同步锁,非线程安全。
性能
- String:每次修改生成新对象,性能较差。
- StringBuffer:基于数组操作,效率高。
- StringBuilder:相比StringBuffer性能稍优,但风险更高。
综上所述
- 少量数据:使用String。
- 单线程操作大量数据:使用StringBuilder。
- 多线程操作大量数据:使用StringBuffer。
2. Java堆、栈、方法区的理解
堆
- 存放新对象(如String、Object等)和数组。
- 可由所有线程共享,不存放其他对象引用。
栈
- 存放基本变量和对象引用地址。
- 基本变量存储具体值,对象引用存储堆中的地址。
方法区
3. Java中的==
和equals
方法区别
==
- 比较对象的引用地址。
- 基本类型按值比较,对象类型需指向同一对象。
equals
- 默认基于
==
比较,重写后如String可按值比较。 - 不重写时,
equals
与==
效果一致。
toString
- 方法用于将对象转换为字符串。
- 需重写
toString
方法实现内容输出。
4. ArrayList与LinkedList的区别
数据结构
- ArrayList:基于动态数组,线程不安全。
- LinkedList:基于双向链表,线程不安全。
性能
- 随机访问:ArrayList优于LinkedList。
- 插入删除:LinkedList优于ArrayList,但后期效率差。
适用场景
- 数据量小:两者差异不大。
- 特定需求:如栈、队列或双端队列时选LinkedList。
- 数据量大:优先选择ArrayList。
5. HTTP与TCP协议理解
核心区别
- 协议层级:HTTP在应用层,TCP在传输层。
- 连接类型:HTTP为短连接,TCP为长连接。
- 状态性:HTTP无状态,TCP可保持连接。
TCP连接特点
- 可靠性:保证数据完整无误。
- 流水线传输:无序序列化传输。
- 流量控制:通过窗口大小机制。
HTTP/1.1的改进
- 持久连接:通过
Keep-Alive
维持连接。 - 多路复用:HTTP/2支持同时发送多个请求。
6. 内部类访问外部类成员的原因
编译器机制
- 成员变量:编译器自动创建指向外部类对象的引用。
- 构造方法:参数传递外部类引用,初始化成员变量。
- 调用构造方法:默认传入外部类引用。
7. Ioc的理解
定义
- 控制反转技术,减少硬编码依赖。
- 使用容器管理对象生命周期和依赖关系。
工作流程
- 依赖注入:通过容器获取实现类。
- 装配:将类、接口和实现注册到容器。
- 配置:通过配置文件或注解定义关联规则。
8. 接口不能实例化的原因
实例化含义
接口特点
- 静态属性和方法声明,实际值存储在数据区。
- 没有实例化意义,占用内存空间。
9. 异常处理理解
定义
-捕捉和处理程序运行中出现的异常情况。
异常类型
- 编译时异常:如
FileNotFoundException
。 - 运行时异常:如
NullPointerException
。
处理方式
- 编译时异常:必须声明处理,调用者需处理。
- 运行时异常:不需声明,调用者可自由处理。
10. Spring Boot启动流程
步骤
创建SpringApplication:初始化后续步骤。 创建ApplicationContext:根据配置文件或注解选择类型。 加载applicationListener:执行启动步骤。 创建IOC容器:配置环境和注册Bean。 refresh()方法:完成IOC容器初始化。 执行CommandLineRunner:启动应用。 11. Spring Boot常用注解
核心注解
- @RestController:
@ResponseBody
和@Controller
的结合。 - @RequestMapping:定义请求映射,可结合
@GetMapping
。 - @Autowired:自动注入依赖Bean。
- @Component:用于组件扫描。
安注解
- @SpringBootApplication:包含
@Configuration
、@EnableAutoConfiguration
等。 - @Value:注入属性文件值。
12. Spring MVC实现原理
流程
DispatcherServlet:处理请求。 HandlerMapping:映射请求到处理器。 HandlerAdapter:适配处理器调用。 处理器:执行业务逻辑,返回ModelAndView
。 ViewResolver:查找实际View。 DispaterServlet:渲染并返回结果。 13. JVM类加载机制
类加载器
- 负责查找和装入类文件。
- 类的装载分为验证、准备、解析、初始化阶段。
14. sleep()
与wait()
方法区别
sleep()
- 休眠指定时间,线程释放锁。
- CPU空闲,其他线程继续执行。
wait()
- 放弃当前线程的对象锁,进入等待池。
- 唤醒需
notify()
或notifyAll()
.
15. 性能测试CPU占用分析
方法
进程查看:top
命令。 线程查看:top -H -p
。 堆栈查看:jstack
或jconsole
. 16. 事务隔离级别
级别
未提交读:最低隔离,可能脏读。 已提交读:修改未提交时不可读,可重复读。 可重复读:解决不可重复读,防幻读。 序列化:最高隔离,可能死锁。 17. 脏读、不可重复读、幻读
脏读
不可重复读
幻读
18. SQL书写顺序与执行顺序
书写顺序
SELECT FROM JOIN ON WHERE GROUP BY HAVING ORDER BY LIMIT 执行顺序
FROM JOIN ON WHERE GROUP BY HAVING SELECT ORDER BY LIMIT 19. MyISAM与InnoDB区别与作用
MyISAM
- 只支持表锁,不支持行锁。
- 不支持事务、外键、崩溃恢复。
InnoDB
适用场景
- 读密集表:MyISAM优于InnoDB。
- 写密集表:InnoDB优于MyISAM。
20. SQL优化建议
1. 建立索引
2. 避免全表扫描
3. 避免OR
连接
4. 函数运算
5. 避免IN
和NOT IN
6. 避免表达式操作
7. 不使用SELECT *
21. 动态代理实现方式
JDK动态代理
- 基于反射,需目标对象实现接口。
- 代理对象动态生成。
CGLIB动态代理
- 修改目标类字节码,生成子类代理。
- 不需目标对象实现接口。
区别
22. 事务传播行为
支持级别
- propagation_required:需传播,新事务或加入。
- propagation_supports:支持传播,非事务模式下执行。
- propagation_mandatory:强制传播,否则抛出异常。
- propagation_nested:嵌套事务执行。
- propagation_never:不支持传播。
- propagation_requires_new:新建事务,挂起现有。
23. Redis持久化
RDB
AOF
- 记录每次命令,持久化方式。
- 恢复时数据安全性高,但速度慢。
同时使用
配置
24. 缓存穿透与雪崩
穿透
- 缓存中无数据,数据库压力大。
- 解决方案:校验、Bitmap、短期空值缓存。
雪崩
- 多线程同时失效,数据库压力大。
- 解决方案:加锁、队列、预加载、双缓存。
25. Cookie与Session分布式存储
Cookie
Session
- 服务器存储,存在内存或数据库。
- 大型站点需专用Session服务器。
分布式存储
- 粘性Session:通过负载均衡器锁定服务器。
- 持久化Session:存储在数据库或其他持久化存储。
26. Spring循环依赖解决
三级缓存机制
- singletonObjects:一级缓存,已创建完成的单例。
- earlySingletonObjects:二级缓存,未创建完成的单例。
- singletonFactories:三级缓存,用于获取单例。
工作原理
- getEarlyBeanReference:支持 AwareBeanPostProcessor。
- 三级缓存协调:确保循环依赖解决。
27. Spring Boot跨域配置
方法级别
@CrossOrigin
注解,指定允许域名和有效期。
全局配置
- 定义
WebMvcConfigurer
bean,注册全局CORS配置。
示例
28. JVM垃圾回收算法
基本算法
- 引用计数:不可解决循环引用。
- 标记-清除:内存碎片问题。
- 复制算法:双倍内存占用。
- 标记-整理:优化空间利用。
分区算法
- 增量收集:实时垃圾回收。
- 分代收集:基于对象生命周期。
并行收集
29. JVM内存管理
###垃圾回收线程与内存分配
- 垃圾回收线程负责回收内存,内存分配线程负责分配。
- 两者并发执行,提升性能。
###垃圾回收策略
- 不同引用类型采用不同算法。
- 结合内存管理策略优化性能。
通过以上内容,希望能够全面覆盖技术面试中的核心问题,帮助应对面试挑战。
转载地址:http://excu.baihongyu.com/