面试系列(一)
面试题目清单:
- spring需要哪些配置完成类的初始化,对象初始化流程的是怎么样的,阐述resource的作用;
- json格式的http请求需要如何设置header,400是什么原因
- 是否使用过事务,哪些情况使编程事务不生效
- hashmap是否线程安全,为什么?
- IO密集型和计算密集型的服务区别是什么?
- 对Mysql进行翻页查询的流程是怎么样的?
- 如果使用过springboot,稍微阐述下如果需要自己管理数据源需要做什么?
- 如果做过dubbo服务调用,阐述如何实现多版本多实现的兼容?
- 如果使用过redis,简单介绍使用过哪些数据结构及场景?
- 如果使用过缓存,阐述下使用过哪些cache以及如何实现线程安全?
- 如果了解多线程,说一下threadpool 的参数和用法
- 编程题:判断一个字符串中有多少种AAB类型的子串,比如“好好学习,好好学习,天天向上”中有2种AAB情况,不计算重复项,
注意:好好学学吧 的这种情况 只会计算 好好学 不会计算 学学吧情况。
问题回答:
(1)spring需要哪些配置完成类的初始化,对象初始化流程的是怎么样的,阐述resource的作用;
XML配置方式:spring需要配置bean 填写bean id 和 class 所在的包路径。
对象初始化流程:首先spring会帮我们准备一个容器,启动ApplicationContent,然后通过创建bean工厂,通过扫描所有的bean形成生成BeanDefinition、合成BeanDefinition、通过类装载器、bean初始化实例与填充属性、执行Aware、初始化所有实例对象。
resource的作用:激活一个命名资源(namedresource)的依赖注入,把一个bean注入到当前的类中。
(2)json格式的http请求需要如何设置header,400是什么原因
Content-type: application/json
400的原因:
(3)是否使用过事务,哪些情况使编程事务不生效
1、mysql数据库的引擎是不支持事务操作。
2、Spring的AOP中,如果注入的方法是private,事务是不生效的。
3、事务代码和代码执行入口的不在统一线程上,事务不生效。
4、事务情况不是出现在 运行期异常(java.lang.RuntimeException及其子类
(4)hashmap是否线程安全,为什么?
Hashmap不是线程安全的,HashMap不保证遍历的顺序和插入的顺序是一致的,在put过程中,会有resize操作,在resize操作的时候会造成线程不安全
(5)IO密集型和计算密集型的服务区别是什么?
IO密集型中任务的大部分时间都在等待IO操作完成,较少消耗CPU资源。
计算密集型任务的特点是要进行大量的计算,消耗CPU资源。
(6)对Mysql进行翻页查询的流程是怎么样的?
不清楚
(7)如果使用过springboot,稍微阐述下如果需要自己管理数据源需要做什么?
通过维护一个数据源信息列表,利用@Bean进行动态数据源类的注册。在配置的核心实现里,需要将默认的配置数据源注册上去。其中lookupKey这里随便取了个默认名,以lookupKey名称切换数据源,达到管理我们的数据源。
(8)如果做过dubbo服务调用,阐述如何实现多版本多实现的兼容?
在配置dubbo service 和 reference 时加入 version="1.0.0" 的版本控制。
(9)如果使用过redis,简单介绍使用过哪些数据结构及场景?
String 但存的用于存储 用户登录的session 或 token 用于访问有效性使用。
Hash 存储、读取、修改用户属性
(10)如果使用过缓存,阐述下使用过哪些cache以及如何实现线程安全?
不清楚
(11)如果了解多线程,说一下threadpool 的参数和用法
new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds,runnableTaskQueue, handler);
- corePoolSize: 线程池核心线程数
- maximumPoolSize:线程池最大数
- keepAliveTime: 空闲线程存活时间
- unit: 时间单位
- workQueue: 线程池所使用的缓冲队列
- threadFactory:线程池创建线程使用的工厂
- handler: 线程池对拒绝任务的处理策略
corePoolSize:线程池的核心线程数,线程池中运行的线程数永远不会超过 corePoolSize 个,默认情况下可以一直存活。
maximumPoolSize:线程池允许的最大线程数。如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。值得注意的是如果使用了无界的任务队列这个参数就没什么效果。
keepAliveTime: 默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize。