极速高级java开发工程师基础知识

极速高级java开发工程师基础知识



一、设计模式

1.七大设计原则

单一职责原则(一个类只有一个职责)
里氏替换原则(子类可以使用父类的方法)
依赖倒置原则(针对接口编程)
接口隔离原则(一个接口只能有一个职责)
合成复用原则(尽量使用合成或聚合而不要使用继承来扩展类的功能)
迪米特法则(一个类尽量减少对其他类的依赖)
开闭原则(对修改关闭,对扩展开放)

2.快速记忆

创建型:工厂、抽象工厂、原型、建造者、单例
结构型:时(适配器)代(代理)结(桥接)合(组合),装(装饰器)外(外观)向(享元)
行为型
观(观察者)模(模板)策(策略)状(状态)备(备忘录)
迭(迭代器)访(访问者)命(命令)中(中介)解(解释器)职(责任链)
在这里插入图片描述

二、Spring全家桶

1.spring5.0的新特性

1、升级了JDK1.8
2、反应式编程
3、全面引入注解编程
4、函数式编程
5、引入REST风格
6、HTTP2.0的支持
7、全面去servlet化
8、引入@Nullable(空对象模式)

2.使用spring能够带来哪些好处?

1、简化开发
2、提供了很多内置方案(BOP(面向Bean编程)IOC AOP)
3、声明式事务管理
4.提供了很多工具类

3.BeanFactory与ApplicationContext有什么区别?

1、ApplicationContext是BeanFactory的实现类。
2、BeanFactory是面向顶层的设计(抽象)。而ApplicationContext是面向用户的。
3、ApplicationContext功能更加丰富,api最全,一般会认为ApplicationContext就是IOC

4.SpringBean的生命周期

1、如果是singleton类型,则是从容器的启动开始至容器的销毁
2、如果是prototype类型,在调用前创建,在调用后销毁

5.spring各个作用域之间的区别

1、singleton作用域是全局的,在任何地方都可以通过IOC容器拿到
2、prototype是每次调用会返回一个bean
3、request是在一次请求的发起和结束之间
4、session是一个会话的创建和失效期间

6.spring中的Bean是线程安全的吗?

是否安全与spring无关,自行解决是否安全。

三、Mysql介绍与性能优化

1、事务的特性,原子性,持久性,隔离性是通过什么技术实现的?
原子性:通过undo日志进行数据回滚
持久性:通过redo日志和双写缓冲实现(写入page会先写入双写缓冲区)
隔离性:MVCC(提供快照)和LBCC(加锁)
2、InnoDB实现了哪些事务隔离级别

隔离级别脏读不可重复读幻读
未提交读可能可能可能
已提交读不可能可能可能
不可重复读不可能不可能可能(InnoDB可以解决,通过LBCC)
串行化不可能不可能不可能

3、性能优化(五个方面)
第一点:sql语句和索引优化(可以通过一些工具分析慢查询,或者用explain)
第二点:表结构和存储引擎的优化
第三点:架构上的优化(增加缓存、主从复制、读写分离)
第四点:配置文件优化(增加服务端连接数、减少客户端连接数)
第五点:硬件优化、业务优化(对高并发场景进行分担)

四、JVM性能优化

1、类加载的流程
加载->验证->准备->解析->初始化->使用->卸载

2、双亲委派机制
当一个类收到加载请求的时候,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果父类不能加载,反馈给子类,由子类完成加载。

类加载器有:启动类加载器、扩展类加载器、系统类加载器、自定义加载器

3、GC两种判定方法
1、引用计数器法
2、GCRoot可达性算法

4、GC三种收集算法
1、标记-清理
2、标记-整理
3、复制

5、GC收集器有哪些
1、GMS(标记—清除)
2、G1(标记—整理)

6、JVM调试工具
jmap、 jstack、 jconsole、 jhat

7、JVM内存分区
栈区(引用地址)
堆区(初始化的对象、成员变量)
方法区(类的信息、常量)
本地方法栈(主要为Native服务)
程序计数器(记录当前线程的执行行号)

8、JVM堆分区
新生代(Eden+Survivor)
老年代

五、Netty

1、BIO、NIO、AIO的区别
BIO:同步阻塞
NIO:同步非阻塞(多路复用)
AIO:异步非阻塞
2、TCP的三次握手
第一次握手
客户主动(active open)去connect服务器,并且发送SYN 假设序列号为J,
服务器是被动打开(passive open)

第二次握手
服务器在收到SYN后,它会发送一个SYN以及一个ACK(应答)给客户,
ACK的序列号是 J+1表示是给SYN J的应答,新发送的SYN K 序列号是K

第三次握手
客户在收到新SYN K, ACK J+1 后,也回应ACK K+1 以表示收到了,
然后两边就可以开始数据发送数据了

六、多线程

1、Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

七、Redis

1、Redis支持的数据类型?

String字符串:string类型是Redis最基本的数据类型,一个键最大能存储512MB。
Hash(哈希):Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
List(列表):Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
Set(集合):集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
zset(sorted set:有序集合):Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

2、什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免?
缓存穿透
一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。
如何避免?
1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。
缓存雪崩
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。
如何避免?
1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期
3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

七、Kafka、Zookeeper

八、MyBatis源码分析

九、数据结构与算法


总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值