盒子
盒子
文章目录
  1. 1. 介绍下最近做过的两个项目
  2. 2. JAVA访问修饰符
  3. 3. error与exception的区别
  4. 4. Stringbuffer,StringBuilder的区别及扩容机制
  5. 5. 重写、重载区别
  6. 6. HashMap底层实现,如何解决hash碰撞
  7. 7. ArrayList与LinkedList区别
  8. 8. synchronized、ReentrantLock实现原理及使用场景
  9. 9. CopyOnWriteArrayList实现原理及使用场景
  10. 10. volatile实现原理
  11. 11. 线程池实现原理,几个重要参数
  12. 12. JVM运行时数据区结构
  13. 12.1 GC ROOT有哪些?
  14. 13. 垃圾回收算法及垃圾回收器
  15. 14. 说说双亲委派模型,如何打破
  16. 15. Redis数据类型
  17. 16. redis为什么是单线程
  18. 17. MySQL乐观锁、悲观锁如何实现
  19. 18. Mysql索引存储数据的数据结构及原因
  20. 19. Spring如何解决循环依赖
  21. 20. Spring AOP实现
  22. 21. Spring事务传播属性
  23. 22. Spring如何管理事务的
  24. 23. Spring框架bean生命周期
  25. 24. SrpingMVC request请求流程
  26. 25. SpringBoot自动配置如何实现

SAP面试总结

机会是留给有准备的人的,哎,春节几天没有复习基础知识,面试前一天看了看之前写的博客,发现好多重复问到的问题,然而,并想不起如何作答~~ 这是一次惨痛的教训

1. 介绍下最近做过的两个项目

项目都是传统的项目,面试官可能不感兴趣,没有继续问下去,接下来开始基础知识的空袭了

2. JAVA访问修饰符

请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用

3. error与exception的区别

error和exception的区别,CheckedException,RuntimeException的区别

4. Stringbuffer,StringBuilder的区别及扩容机制

String,StringBuffer,StringBuilder的区别及扩容机制

5. 重写、重载区别

重写(Override)
重写是子类对父类允许访问方法的实现过程进行重新编写,返回值与形参都不能改变
重载(Overload)
重载是在一个类中,方法名字相同,而参数不同,返回类型可以相同,可以不同。

区别点 重载方法 重写方法
参数列表 必须修改 一定不能修改
返回类型 可以修改 一定不能修改
异常 可以修改 可以减少或删除,一定不能抛出新的或更广的异常
访问 可以修改 一定不能做更严格的限制(可以降低限制)
分派类型 静态分派,由静态类型确定,在类加载时确定 动态分派,由动态类型确定,在运行时确定

ps扩展补充: 动态分配由虚方法表实现,虚方法表中存在各个方法的实际入口地址,若未重写方法,则子父类该方法地址相同,
若重写,则子类方法指向重写后的地址

6. HashMap底层实现,如何解决hash碰撞

HashMap是线程安全的吗,并发下使用的Map是什么

7. ArrayList与LinkedList区别

ArrayList和LinkedList有什么区别

8. synchronized、ReentrantLock实现原理及使用场景

synchronized实现原理

ReentrantLock内部组成

synchronized和ReentrantLock之间的选择

9. CopyOnWriteArrayList实现原理及使用场景

CopyOnWriteArrayList实现原理

10. volatile实现原理

Java并发机制底层实现原理之volatile

11. 线程池实现原理,几个重要参数

ThreadPoolExecutor及ThreadFactory

12. JVM运行时数据区结构

JVM内存结构

12.1 GC ROOT有哪些?

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI引用的对象

13. 垃圾回收算法及垃圾回收器

哪几种垃圾收集器,各自的优缺点

14. 说说双亲委派模型,如何打破

简单说说你了解的类加载器,可以打破双亲委派么,怎么打破

15. Redis数据类型

五种数据类型

16. redis为什么是单线程

注意,redis单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块仍然用了多个线程。
官方答案
因为redis是基于内存的操作,CPU不是redis的瓶颈,redis的瓶颈最有可能是机器内存与网络带宽,既然单线程容易实现并且CPU不会成为瓶颈,顺理成章采用单线程方案。
性能指标
关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万请求。
详细原因
1)不需要各种锁的性能消耗
2)单线程多进程集群方案
3)避免了上线文切换和竞争条件导致的CPU消耗

17. MySQL乐观锁、悲观锁如何实现

乐观锁:
使用数据版本(Version)、使用时间戳(timestamp)
悲观锁
SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE

18. Mysql索引存储数据的数据结构及原因

采用B+树

  • B+树就是一种多叉树,是由二叉搜索树不断演化而来,为了满足区间快速查询,B+树的叶子节点通过双向链表串联起来
  • 使用双向链表是为了支持顺序与倒叙查询,虽然双向链表相对于单向链表会浪费一倍的空间,但对于硬盘来说微乎其微
  • 索引存在于硬盘中,为了提升查询速度,二叉改为m叉,降低树的高度,减少磁盘IO
  • B+树的子节点树不超过m个,超过则分裂,同时也不能少于m/2个,少于则合并

参考:MySQL 索引为啥要选择B+树

19. Spring如何解决循环依赖

单例setter循环依赖

20. Spring AOP实现

Spring AOP的实现原理

21. Spring事务传播属性

讲讲Spring事务的传播属性

22. Spring如何管理事务的

Spring如何管理事务的

23. Spring框架bean生命周期

Spring框架中bean的生命周期

24. SrpingMVC request请求流程

SpringMVC运行原理

25. SpringBoot自动配置如何实现

SpringBoot自动配置实现原理

支持一下
扫一扫,支持沈健
  • 微信扫一扫
  • 支付宝扫一扫