【Java 八股】亚信科技面经学习笔记2

1 阅读6分钟

1. 自我介绍

(可根据个人经历填写)

2. Java 的基本类型?String 算不算?

  • 基本数据类型(8 种):byteshortintlong``floatdouble``charboolean
  • String 是引用数据类型,不是基本类型

3. 为什么使用 String 时可以直接 String s = "abc"

这是 Java 为简化开发提供的语法糖,JVM 会自动把双引号字符串识别为 String 对象,并保存在字符串常量池中。

4. 为什么说 String 是引用类型,不是基本类型?

  • 基本类型直接存储在栈内存
  • String 对象实例存储在堆内存,栈中只保存对象的引用地址

5. String、StringBuilder、StringBuffer 区别?

  • String:不可变字符序列,每次修改生成新对象,修改性能差
  • StringBuffer:可变字符序列,线程安全(带 synchronized),性能较差
  • StringBuilder:可变字符序列,线程不安全性能最好

使用场景:

  • 少量操作:String
  • 多线程大量操作:StringBuffer
  • 单线程大量操作:StringBuilder

6. String 可以被继承吗?可以被重载 / 重写吗?

  • Stringfinal 修饰,不能被继承
  • 可以重载
  • 不能重写(因为不能被继承)

7. 重写、重载、继承是什么?

  • 重写:子类继承父类后,重新实现父类方法;方法名 + 参数列表必须相同
  • 重载:同一个类中,方法名相同,参数列表(类型 / 个数 / 顺序)不同
  • 继承:子类复用父类的属性和方法,实现代码复用

8. B 继承 A,B 中能调用 A 的 methodA 吗?怎么调用?

  • methodAprivate不能调用
  • public / protected:可以直接调用
  • B 重写了 methodA,想调用父类原方法:super.methodA()

9. 常用集合有哪些?

两大类:Collection 系列、Map 系列

Collection

  • List(有序可重复)

    • ArrayList:底层数组,查询快、增删慢
    • LinkedList:底层双向链表,查询慢、增删快
  • Set(无序不重复)

    • HashSet:无序,基于 HashMap
    • LinkedHashSet:保持插入顺序
    • TreeSet:自然排序
  • Queue(队列)

    • ArrayDeque:数组双端队列
    • ConcurrentLinkedQueue:无锁线程安全队列
    • DelayQueue:延迟队列,用于定时任务

Map(键值对)

  • HashMap:数组 + 链表 / 红黑树,线程不安全,性能高
  • ConcurrentHashMap:分段锁 + CAS,高并发安全
  • HashTable:全方法 synchronized,线程安全但性能差,已淘汰

10. Arrays.asList(数组) 后,修改数组内容,集合会变吗?

会变。集合底层直接引用原数组,数组内容修改,集合内容同步改变。

11. 集合 list.toArray() 后,修改集合,数组会变吗?

不会变toArray()新建数组并复制内容,和原集合脱离关系,互不影响。

12. int 1 + int 2 + String 3 = ?

  • 先算:1 + 2 = 3
  • 再算:3 + "3" 触发字符串拼接
  • 结果: "33"

13. 红黑树的特性?

  1. 每个节点只能是 红色或黑色
  2. 根节点是黑色
  3. 每个叶子节点(NIL 空节点)是黑色
  4. 不能有两个连续的红色节点
  5. 任意节点到其所有叶子节点的路径,黑色节点数量相同(黑高相同)

14. Set 是有序的吗?

  • HashSet无序
  • LinkedHashSet保持插入顺序
  • TreeSet自然排序整体 Set 不保证有序,只有特定实现类有序。

15. Hashtable 和 HashMap 区别?

  • HashMap线程不安全,性能高,允许 key/value 为 null
  • Hashtable线程安全(全方法 synchronized),性能差,已淘汰

16. HashMap 和 Hashtable 扩容区别?

  • HashMap

    • 默认容量:16
    • 扩容因子:0.75
    • 扩容机制:达到容量 × 因子 → 扩容为原来 2 倍
  • Hashtable

    • 默认容量:11
    • 扩容机制:扩容为原来 2 倍 + 1

17. 什么是哈希算法?

将任意长度的输入,通过散列函数计算出固定长度的散列值。应用:

  • HashMap 寻址
  • MD5 加密
  • 文件完整性校验

18. HashMap 和 Hashtable 的 key/value 可以为 null 吗?

  • Hashtablekey 和 value 都不能为 null
  • HashMap最多一个 key 为 null,value 可以多个为 null

19. MyBatis-Plus 条件构造器?

核心是 Wrapper 及其子类:

  • QueryWrapper:查询条件
  • UpdateWrapper:更新条件
  • LambdaQueryWrapper:Lambda 写法,防字段写错作用:不写 SQL 即可构建复杂 WHERE 条件。

20. 前后端分页查询,后端怎么接收?

  • 前端:GET 请求,pageNumpageSize 拼在 URL
  • Controller 层:使用 @RequestParam 接收分页参数

21. MyBatis Mapper 层接收参数用什么注解?

@Param("参数名")

22. MyBatis XML 用什么接收参数?

  • #{}:预编译占位符,防 SQL 注入,推荐
  • ${}:直接字符串拼接,有注入风险,不推荐

23. SQL 中 limit 怎么用?

用于分页,放在 SQL 最后:

sql

limit 起始下标, 条数

示例:limit 0,10 → 第 1~10 条数据

24. 根据姓氏模糊查询学生表(SQL + XML)

SQL:

sql

select * from student where name like '张%';

XML:

xml

<select id="findBySurname" resultType="Student">
    select * from student where name like concat(#{lastName},'%')
</select>

25. MyBatis-Plus 模糊查询怎么写?

java

运行

queryWrapper.like("name", "张");

26. 查询所有人的所有成绩(学生表 + 成绩表)

sql

select s.name, c.score
from student s
join score c on s.id = c.student_id;

27. SQL 常用关键字?多表查询用什么?

关键字:selectfromwheregroup byhavingorder bylimit

多表查询:

  • join(内连接、左连接、右连接)
  • 或在 where 中写关联条件

28. 查询语文及格的同学?求语文平均分?

查询及格:

sql

select s.name
from student s
join score c on s.id = c.student_id
where c.subject = '语文' and c.score >= 60

求平均分:

sql

select avg(c.score) from score c where c.subject = '语文';

29. Spring 事务?

使用注解:@Transactional作用:保证一组数据库操作要么全部成功,要么全部回滚。包含:传播行为、隔离级别(如读已提交、可重复读)。

30. Spring 事务失效场景?

  1. 方法不是 public
  2. 异常被 try-catch 吃掉,未抛出
  3. 抛出非 RuntimeException/Error,且未配置 rollbackFor
  4. 同类内部方法调用(this.method()),未走代理
  5. 数据库引擎不支持事务(如 MyISAM)

31. final、finally、finalize 区别?

  • final:关键字,修饰类不可继承、方法不可重写、变量不可变
  • finally:异常处理,try-catch-finally一定会执行
  • finalize:Object 方法,GC 回收前调用(已废弃

32. final 修饰类的作用?

类成为最终类,不能被继承(如 String)。

33. final 和 static 区别?

  • final限制不可变 / 不可继承
  • static属于类,全局共享一份,优先于对象加载

34. static 关键字特点?

  1. 属于,不属于对象
  2. 内存中只有一份,所有对象共享
  3. 可直接用 类名.方法/变量 调用
  4. 类加载时初始化,优先于对象
  5. 静态方法不能直接访问非静态成员

35. final 修饰的类可以被事务回滚吗?

可以回滚final 不影响 Spring 事务,只要方法抛出异常、满足回滚规则,就会回滚。