Java基础:
1:HashMap是怎么存储数据
https://zhuanlan.zhihu.com/p/79507868
hashMap底层是通过数组加链表数据结构,数组体现了查询速度快,链表体现增加、删除快,在存储元素时调用put方法对key值进行hash计算得到hashcode值,hashcode值和数组长度取模就可以得到存储数组下标位置,当存储的数组下标没有元素直接进行存储,如果有元素则根据equals比较两个对象是否相等,如果相等就替换,不相等说明是不同的对象就链接在数组下标下面形成链表
2:hashMap为什么线程不安全
1.在JDK1.7中,当并发执行扩容操作时会造成环形链和数据丢失的情况。
2.在JDK1.8中,在并发执行put操作时会发生数据覆盖的情况。
3:如何让HashMap变成线程安全
1.替换成Hashtable,Hashtable通过对整个表上锁实现线程安全,因此效率比较低
2.使用Collections类的synchronizedMap方法包装一下
3.使用ConcurrentHashMap,它使用分段锁来保证线程安全
4:synchronized作用方法和代码块有什么区别
对加锁的范围,作用于方法要大于作用于代码块,一般加锁作用于范围越小越好
5:线程池的工作原理
当线程池中有任务需要执行时,线程池会判断如果线程数量没有超过核心数量就会新建线程池进行任务执行,如果线程池中的线程数量已经超过核心线程数,这时候任务就会被放入任务队列中排队等待执行;如果任务队列超过最大队列数,并且线程池没有达到最大线程数,就会新建线程来执行任务;如果超过了最大线程数,就会执行拒绝执行策略
3:Java线程池七个参数详解
https://blog.youkuaiyun.com/ye17186/article/details/89467919
框架:
1:mybatis中执行一条查询SQL语句的执行过程是怎样的
首先通过SqlSessionFactoryBuilder的build方法加载配置文件得到SqlSessionFactory会话工厂,通过会话工厂的openSession打开会话,得到SqlSession,通过SqlSession里面的增删改查,API方法去执行sql语句,最后关闭手动会话连接
mybatis缓存
一级缓存作用于sqlSerssion,默认开启
二级缓存作用于整个sql查询namespace,在查询时用cache关键字开启缓存
springboot的启动方式
springboot加载配置文件方式
1:@Value 2:Environment对象注入获取 3:PropertySource注解等
组件:
RabbitMQ的工作模式
简单模式,工作模式,订阅模式,路由模式,主题模式
RabbitMQ的交换机有几种
直连交换机,扇形交换机,主题交换机,头交换机
Linux系统
1:Linux系统的top命令可以查看什么数据
可以查看系统CPU占比,内存使用量,IO,系统进程等
2:springCloud的常用组件介绍
- Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
- Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
- Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
- Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
- Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务