用问答的方式检验自己的知识结构

86 阅读5分钟

背景

在技术人员的生涯中,每天都在不停的学习各种知识,但是学习的效率与学习的结果每个人都不太一样。为了监督自己坚持学习以及温故知新,我会定期让我的老师给我出题,以问答的方式去检验一下自己的知识结构,这种方式对我而言很有效,分享出来希望与大家共勉。

问题与思考

模拟角色,Java高级工程师

1、SpringBoot优势?SpringBoot starter启动原理?有没有打包封装一个starter的经验?

这个问题刚听到时有点愣,突然发现自己并没有关注过这块的知识

SpringBoot的优势:

我觉得最核心的就是删繁就简,对一些通用功能进行了封装,而使用SpringBoot搭建项目只要引入一些相关的包,即可完成开箱即用的操作。 具体而言:

(1)可以通过SpringBoot创建独立的Spring应用,个人认为这为微服务理念的实现提供了一种解决方式;

(2)内嵌Tomcat、Jetty或Undertow,这样,我们在平时研发的时候,就省去了打包装载都Tomcat容器发布的功能,可以通过jar包的方式发布研发好的功能;

(3)提供了可以自用的starter来简化构建配置,我们创建项目时,只需要引入一些核心包,就可以启动一个SpringBoot项目,这非常方便快捷;

(4)生态资源很丰富,除了核心功能外,提供了指标监控、运行状况检查、外部化配置等功能延伸,同时可以支持与其他组件的多种形式的融合,延展性很好;

(5)约定大于配置的思想,开箱即用

starter启动原理

starter主要作用:引入模块所需的相关jar包,自动配置各自模块所需的属性

springboot加载时做了些什么工作

(1)pom文件中引入相关jar包,例如spring、springmvc、mybatis、mysql-connector-Java相关jar...

(2)配置web.xml(Listener配置、Filter配置、Servlet配置、log4j配置...)、配置数据库连接、配置Spring事务、配置视图解析器

(3)开启注解、自动扫描功能

(4)配置完成后部署Tomcat、启动调试

如何做的? springboot启动时会去pom文件中引入依赖的starter包中寻找resources/META-INF/spring.factories文件,再根据文件中配置的jar包去扫描项目所依赖的jar包;根据spring.factories配置加载AutoConfigure类;根据@Conditional注解的条件,进行自动配置并将Bean注入到Spring Context上下文中

自己还真没有亲自开发过一个jar包作为springboot的启动项加载,这个是欠缺的地方。

2、ArrayList与LinkedList的区别?

我觉得最核心的区别在于ArrayList底层存储是数组的结构,LinkedList底层则是双链表的结构

3、线程池设置常用的参数?

这个我经常性的是根据具体情况参考方法说明来设置的,比如说线程池的核心线程数、等待策略等

4、乐观锁、悲观锁的区别

我觉得最大的区别是两者假设的前提是不一样的,也就是设计思维是不一样的,乐观锁的设计理念是基于锁内容不总是会被占用,而悲观锁的设计思维是基于锁内容总是会被占用。

5、HashMap与ConcurrentHashMap的区别?

最重要的一个区别应该是线程安全性。

6、Redis常用的功能?缓存穿透、缓存雪崩原因及解决方式?分布式锁这块?红锁?

.....

7、io这块,异步io,同步IO,同步非阻塞IO用过哪些,怎么用的?

举了netty的例子

8、数据库索引的分类?索引的原理?innodb schema下要索引的方式,原理是什么,需要注意什么?

这一下子没想起来

说明平时的工作没有对这一块进行归类总结

数据库索引类型有普通索引、组合索引、全文索引、唯一索引、主键索引

(1)普通索引,基本的索引,没有任何限制,主要是用于加快查询,但是数据是可以重复的;

(2)组合索引,可以在多个字段上创建索引,但是只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用;

(3)全文索引,用来查找文本中关键字,这个感觉跟elasticsearch有类似点;

(4)唯一索引,索引列的值必须唯一,但是允许有控制。这也可以用于组合索引,如果是组合索引,列值的组合必须唯一;

(5)主键索引,这其实是特殊的唯一索引,一个表中智能有一个主键,一般我会在建表的时候同时创建主键索引

个人认为,适当的索引可以提高查询性能,但是不宜过多,因为索引也是需要占用存储空间的,增加索引或者删除索引对数据库有一定影响。

innodb支持事物,采用行锁,支持高并发,数据和索引文件都存在.ldb文件里,并且都缓存在内存里;但是有一点,select count(*)需要扫描全表,统计所有数据

innodb的体系结构有内存结构,线程,磁盘文件三部分;存储结构,逻辑存储单元主要分为表空间、段、区和页。

9、数据库优化的经验

......

10、工作这些年,最自豪的使用技术经验分享

......

总结

短短三十几分钟,我看到了我混乱的知识结构,很多知识没有形成体系,好多细节问题以及底层原理了解浮于表面,要沉下心认真梳理了,否则只是空架子,加油吧