1. 基础 - 数据 结构(数组、单/双向链表、二叉树、B树、 有/无向图 、哈希表、 压缩列表 、跳表、 位图、 队列 )1.1 算法 基础(GC算法、排序算法、链表遍历算法、二叉查找算法、递归、动态规划、一致性Hash算法、先进后出队列算法)2. 基础 -JVM 原理及调优(JVM内存划分、JVM类加载机制、对象的生命周期、GC垃圾回收器、参数调优)3. 基础 -Spring 源码及 应用(Bean生命周期、环形依赖)4. 网络编程 - Netty 通讯 原理(NIO模型)5. 并发编程 - 多 线程(线程池、锁、队列、拒绝策略)6. 微服务 - 开发框架 - Dubbo 、 HSF 、 SpringCloud7. 微服务 - 注册 中心高可用方案 - Eureka 、 Nacos、EDAS8. 微服务 - 配置 中心 - Nacos 、 Apollo 、 Spring cloud Config 、 Zookeeper 、 ETCD、 Disconf9. 微服务 - 限流 & 降级 - Hystrix 、 sentinel10. 微服务 - 网关 - Zuul 、 GateWay11. 微服务 - 全 链路追踪 - skywalking 、 Slueth 、 Zipkin12. 高可用 - 负载 均衡 - Nginx 、 LVS 、 Haproxy 、 Feign 、 Ribbon 、 Zookeeper13. 高可用 - 分布式 - 锁 - Reddision 、 ZK14. 高可用 - 分布式 - 事务 - TCC 、 Saga、Seata15. 高可用 - 高速 缓存方案 - Redis 、 Codis 、 Twemproxy 、 Cluster 、冷热备份、性能调优、数据迁移16. 高可用 - 异步 框架 - KafKa 、 RocketMQ 、 MNS 、 RabbitMQ 、原理及集群部署17. 高可用 - 调度 框架 - XXLJob18. 高可用 - 编码 规则 - 高可用 ID 服务 中心19. 高可用 -SLA20. 高可用 - 灰度方案21. 高可用 - 安全架构22. 高性能 - 性能调优、响应时间、吞吐量、高并发23. 模板 引擎 -Enjoy 、 Freemaker24. 规则 引擎 - Drools25. 工作 流引擎 - Activiti26. 分布 式日志框架 - ELK 、 Solr 、 Beats27. 数据库 - MYSQL 、阿里 RDS 、 MyCat 、索引、性能调优、灾备、分库分表( shardingspere )28. NoSQL-MongoDB 、集群、冷热备份、数据迁移、安全管理29. 连接 池 - hikaricp 、 druid30. 文档 - Swagger 、 YAPI31. DevOps 自动化 - Git 、 Gradle 、 Jenkins 、 Maven32. 容器 化 - K8S 、 Docker 、 Rancher33. 自动化运维 - Saltstack 、 Zabbix34. 监控 -Prometheus 、 Grafana35. 三方 - 支付、微信 ( JFinal )36. 业务 - 秒杀、详情页37. 设计模式(兜底、补偿、重试)、研发规范、应用 / 部署架构、技术选型( CAP 、 BASE 、通信原理、 CDN 、多级缓存、 MQ 、 SSO )38. 大数据 - 推荐系统、 Spark 全栈、 HDFS 、 Hbase 、 Flink 、 K afKa39. 区块链
一、JDK新特性
jdk1.8新特性知识点:
- Optional
Optional 类(java.util.Optional
) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
- Lambda表达式
Lambda 表达式也可称为闭包,是推动 Java 8 发布的最重要新特性。lambda表达式本质上是一个匿名方法。
口诀:左右遇一省括号,左侧推断类型省
语法:(parameters) -> expression 或 (parameters) ->{ statements; }
注:当一个接口中存在多个抽象方法时,如果使用lambda表达式,并不能智能匹配对应的抽象方法,因此引入了函数式接口的概念
- 函数式接口
value -> System.out.println(value)是一个Consumer函数式接口,可以采用list.forEach(System.out::println);方法引用的方式替换。
- *方法引用和构造器调用
使用操作符“::”将方法名和对象或类的名字分隔开
- Stream API
例子:set.stream().forEach(i-> System.out.println(i));
- 接口中的默认方法和静态方法
Java 8 对接口做了进一步的增强。
a. 在接口中可以添加使用 default 关键字修饰的非抽象方法。即:默认方法(或扩展方法)
b. 接口里可以声明静态方法,并且可以实现。
默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。
- 新时间日期API
Duration和Period
Duration用于计算两个时间间隔
Period用于计算两个日期间隔
二、集合特性
LinkedeList和ArrayList的区别
LinkedeList和ArrayList是常用的两种存储结构,都可以实现了List接口。
1、数据结构不同
ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的数据结构。
2、效率不同
当随机访问List(get和set操作)时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
当对数据进行增加和删除的操作(add和remove操作)时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
3、自由性不同
ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。
4、主要控件开销不同
ArrayList主要控件开销在于需要在lList列表预留一定空间;而LinkList主要控件开销在于需要存储结点信息以及结点指针信息。
JDK1.8 HashMap底层实现原理
最新实现原理:采用数组+链表+红黑树。
JDK 1.8 中引入了红黑树(查找时间复杂度为 O(logn))来优化这个问题,红黑树是许多平衡搜索树中的一种,可以保证在最坏的情况下基本动态集合操作的时间复杂度为O(logn),n为节点个数。
同时在扩容的时候,重哈希的计算方式大大简化,仅仅通过计算高出来的一位是1还是0进行拆分,如果是1,则位于新数组中相同的位置+旧数组长度的位置;如果是0,则位于新数组中相同的位置。不仅计算方式简单,而且还把之前的冲突分散到其他的桶里。
三、Object常用方法
Object类有12个成员方法,按照用途可以分为以下几种
1,构造函数
2,hashCode和equale函数用来判断对象是否相同,
3,wait(),wait(long),wait(long,int),notify(),notifyAll()
4,toString()和getClass,
5,clone()
6,finalize()用于在垃圾回收
四、java深克隆和浅克隆
基本概念
1、浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所拷贝的对象,而不复制它所引用的对象。
2、深复制(深克隆)
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
实现java深复制和浅复制的最关键的就是要实现Object中的clone()方法
。
五、其他
NIO
NIO原理
selector chanel选择
JDK
JAVA8十大新特性
默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期API
Spring
springBean加载机制
第一种:通过注解@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
第二种是:通过 在xml中定义init-method 和 destory-method方法
第三种是: 通过bean实现InitializingBean和 DisposableBean接口
springBean生命周期
实例化(容器寻找Bean定义将其实例化)
设置属性(依赖注入)
BeanNameAware setBeanName
BeanFactoryAware setBeanFactoy
BeanPostProcessor预初始化
InitializingBean afterPropertiesSet
调用定制的init-method方法
调用BeanPostProcessor后初始化方法
-----------------
容器关闭
DisposalbeBean destroy方法
调用定制destroy-method方法
各种接口方法分类
Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:
1、Bean自身的方法 : 这个包括了Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法
2、Bean级生命周期接口方法 : 这个包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法
3、容器级生命周期接口方法 : 这个包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,一般称它们的实现类为“后处理器”。
4、工厂后处理器接口方法 : 这个包括了AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工厂后处理器 接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。
Spring4.0增强和新功能
@Configuration注解、@Bean注解以及配置自动扫描、bean作用域
注:
(1)、@Bean注解在返回实例的方法上,如果未通过@Bean指定bean的名称,则默认与标注的方法名相同;
(2)、@Bean注解默认作用域为单例singleton作用域,可通过@Scope(“prototype”)设置为原型作用域;
(3)、既然@Bean的作用是注册bean对象,那么完全可以使用@Component、@Controller、@Service、@Ripository等注解注册bean,当然需要配置@ComponentScan注解进行自动扫描
设计思想&设计模式
- 单例模式
- 代理模式
- 工程模式
- 门面模式
- 观察者模式
代理模式是常用的Java设计模式。代理类主要负责为委托类预处理消息、过滤信息、把消息转发给委托类,以及事后处理信息等。
数据库高可用
服务高可用
限流&降级
反向代理
分布式存储
性能调优
代码Review