高途Java开发一面面经
《面试题目》
- 自我介绍
- 算法题:LeetCode 20 有效的括号(用栈实现)
==和equals的区别?a=100,b=100,a == b结果是 true 还是 false?- String 是 Java 的基础数据类型吗?
- Java 的基础数据类型有哪些?
- String 是否可以被缓存复用(intern)?
- 什么情况下会发生栈溢出?什么情况下会发生堆溢出?
- 用 Java 写一段会触发堆溢出的代码
- 事务注解失效的场景有哪些?
- 事务注解失效的解决方法?
- 对 Skill 和 MCP 有了解吗?
- 反问:在后端方向学习上有什么建议?
《参考解析》
==与equals的区别:==对基本类型比较的是值,对引用类型比较的是内存地址(是否指向同一对象);equals是 Object 类定义的方法,默认实现等同于==,但像 String、Integer 等类重写了equals,比较的是内容/数值是否相等。a=100, b=100的==判断:如果 a、b 是基本类型 int,==比较的是值,结果为 true;如果是 Integer 包装类型,由于-128~127范围内的 Integer 会走缓存池(IntegerCache),100 在缓存范围内,a==b仍为 true,但超出该范围(如 200)用Integer.valueOf装箱则会返回 false。- 栈溢出与堆溢出:栈溢出(StackOverflowError)通常由方法递归调用过深、栈帧不断压入超出线程栈大小导致,典型代码是无终止条件的递归;堆溢出(OutOfMemoryError: Java heap space)通常由持续创建大对象且无法被回收(如死循环往集合里 add 对象且未清理引用)导致堆内存耗尽。
- 事务注解失效的常见场景:方法内部自调用(this.method() 绕过代理)、方法非 public 修饰、异常被 try/catch 吞掉未抛出、抛出的异常不是默认回滚的 RuntimeException(需显式配置 rollbackFor)、数据库引擎不支持事务(如 MyISAM)、@Transactional 所在类未被 Spring 管理等。解决方法核心是保证事务方法必须经过 Spring AOP 代理调用,并正确配置回滚规则。