共计 7446 个字符,预计需要花费 19 分钟才能阅读完成。
网络
三次握手的起因?
三次握手 TCP 协定建设连贯的过程。
起因或目标是为了证实客户端和服务端都有发送和接管的能力。原理 :
第一次:客户端发送 SYN 包给服务端
第二次:服务端接管后在 SYN 包中的序列号 +1 (即 SYN+ACK 包) 发送给客户端
第三次:客户端收到服务端的 SYN 包后,在 SYN 包中的序列号 + 1 后 (ACK 包) 发送给服务端
为啥四次挥手?
四次挥手是 TCP 开释连贯的过程。
起因:客户端和服务端会各自发送 1 次和回复 1 次,共 4 次
tcp/udp 别离的利用场景?
tcp 准确度高,实用于文件传输,电子邮件等场景
udp 效率比拟高,实用于直播,网络语音等场景
Java
ArrayList 和 LinkedList 的区别、扩容机制以及底层实现
ArrayList 基于数组实现,因为应用下标查问,所以查问比拟快,增删数据会挪动数据,所以增删略慢
扩容:数组是定长的,ArrayList 是通过复制到新的数组来实现动静扩容。默认长度 10,扩容 1.5 倍LinkedList 基于双向链表实现,插入元素只记录前一个元素和后一个元素,所以插入比拟快。
不须要扩容。
ArrayList 和 LinkedList 的线程平安解决办法?
- Collections.synchronizedList(new LinkedList<Object>())和 Collections.synchronizedList(new ArrayList<Object>())
- Vector : 基于数组 +synchronized
- CopyOnWriteArrayList、ConcurrentLinkedQueue
Set 为什么不可反复?
set 是无序不可反复的,底层应用了 map, 比拟 key 值来判断是否反复
Set 怎么实现有序?
HashSet 是无序的,
然而 LinkedHashSet 能保障元素增加的程序,TreeSet 能保障元素天然的程序
如果想要自定义排序规定:
1. 应用 TreeSet 存储
2.TreeSet 内的元素须要实现 Comparable 接口,重写 compareTo 办法自定义排序规定。
HashMap、ConcurrentHashMap、HashTable 的原理和区别?
HashMap 的介绍 :
HashMap 在 JAVA8 之后的构造是: 数组 (默认 16 个)+ 单向链表 + 红黑树
数组的每个元素对应一条链表,存储的是那条链表的头节点
数据存入的时候,对 key 做 hash 运算,计算出在数组中的下标,并存入该下标元素对应的链表中
当链表的长度超过 8 后转化为红黑树,当红黑树的元素少于 6 后转化为链表
扩容触发条件:HashMap 的长度 > 容量 加载因子 (160.75),
扩容大小:2 倍区别:
HashMap 线程不平安,key 能够为 null,HashTable 和 ConcurrentHashMap 线程平安,key 不能够为 null
HashTable 应用数据 + 链表的构造,并加 synchronize 锁保障线程平安,
ConcurrentHashMap 在 HashMap 的根底上应用了 CAS+synchronize 来保障线程平安。
HashTable 锁住整个对象,效率偏低。ConcurrentHashMap 只锁住数组的每个元素,锁的粒度更细,效率较高。
sleep 和 wait 的区别?
1.sleep()是 Thread 类的办法,wait()是 Object 类中定义的办法
2.sleep() 办法能够在任何中央应用,wait 办法只能在 synchronized 办法或 synchronized 块中应用
3.sleep() 不会开释锁,wait()会。
什么是线程平安?
在多个线程操作拜访某一个办法时,对资源的更改操作不会产生问题
实现办法:
1.synchronized:主动加锁开释锁
2.ReentrantLock:手动加锁开释锁
3. 如果是集群构造,须要应用分布式锁
线程越多越好吗, 为什么?
1. 依据系统配置无关,
2. 以一核为例,多线程其实是竞争一个线程的执行权,交替执行
有几种线程池,线程池的益处,哪些外围参数?
Java 通过 Executors 提供四种线程池:
1.newCachedThreadPool 创立一个可缓存线程池,可灵便回收闲暇线程,若无可回收,则新建线程
2.newFixedThreadPool 创立一个定长线程池,可控制线程最大并发数,超出的线程会在队列中期待
3.newScheduledThreadPool 创立一个定长线程池,反对定时及周期性工作执行
4.newSingleThreadExecutor 创立一个单线程化的线程池,它只会用惟一的工作线程来执行工作线程池的益处:应用线程池能够缩小在创立和销毁线程的耗费,并进步线程的可管理性,且提供队列以及回绝策略等性能。
外围参数:
1.corePoolSize 线程池中外围线程的数量
2.maximumPoolSize 线程池中最大线程数量
3.keepAliveTime 非核心线程的最大闲暇工夫
4.workQueue 线程池中的工作队列
5.handler 回绝策略
什么状况会触发回绝策略?
当线程池的 外围线程数 + 工作缓存队列已满 并且 线程池中的线程数目达到最大线程数量 时
ThreadLocal 的应用场景?
ThreadLocal 是线程之间相互隔离的变量,咱们用 ThreadLocal 保护本线程的 simpleDateFormat。
本人写一个 String 类,包名也是 java.lang 会是怎么?
手写的 String 类有效,会被真正的 String 笼罩。
而且在手写的 String 类中写个办法并调用,会报错:Stirng 没有该办法。java 类的周期可分为:加载,连贯 (验证、筹备、解析),初始化、应用、卸载。
其中类加载时候的机制:JVM 有四个类加载器:
1.启动类加载器 (Bootstrap ClassLoader):加载外围包
2. 扩大类加载器 (Extension ClassLoader):加载扩大包
3. 应用程序类加载器 (Application ClassLoader):加载咱们写的程序和援用的 jar 包
4. 自定义加载器(Custom ClassLoader):加载自定义的包类的加载的时候会依照下面的程序,至下而上的查看有没有被加载,而后 至上而下的加载 ,因为 java 本身的 String 优先 被启动类加载器加载,所以手写的 java.lang.String 有效。
以上也是类加载的双亲委派机制
讲讲 JVM 内存模型?
堆,元空间,本地办法栈,虚拟机栈,程序计数器 (后面两个线程共享)
程序计数器:记录程序执行时的行数
虚拟机栈:存储对象的援用,8 种根底类型,局部变量表,操作栈,动静链接,办法进口等信息
堆:存储对象实例
元空间:存储类的信息、办法、属性、常量、动态变量、常量池
本中央栈:存储 native 办法的信息
讲讲垃圾回收机制和算法?
垃圾回收机制:
个别状况下,一个对象创立后存在堆内存中年老代的伊甸区,年老代分为伊甸区和两个幸存区,对象通过回收从伊甸区挪动到幸存区,再经验 N 次回收后,最终存活的对象挪动到老年代。垃圾回收算法:
年老代应用的垃圾回收算法是复制算法,起因是年老代大部分被回收,只须要复制大量存活的对象
老年代应用的垃圾回收算法是标记革除算法和标记整顿算法。垃圾回收触发条件
伊甸区满了触发 Minor GC , 对年老代回收
老年代满了触发 Full GC,对整个对内存回收JVM 调优目标:缩小 Full GC
《从 main 办法剖析内存溢出》
什么对象会被认为是垃圾并回收掉?
1. 援用计数算法:对象被援用的个数为 0 的会被回收
2. 可达性算法:与援用链的无关联的对象会被回收
排序办法有哪些?
1. 抉择排序
2. 冒泡排序
3. 疾速排序
4. 抉择排序
5. 插入排序
数据结构有哪些
数组 (Array): 含有下标
栈(Stack):先进后出
队列 (Queue): 先进先出
链表 (Linked List): 手拉手
树(Tree):倒挂的树,有根节点和叶子节点这样式的。
散列表 (Hash):key 和 value
堆(Heap):
图(Graph):
数据库
事务的隔离级别以及每个级别的会引发的问题?
事务隔离级别 | 脏读 | 不可反复 | 幻读 |
---|---|---|---|
未提交读 | 产生 | 产生 | 产生 |
未提交读 | 防止 | 产生 | 产生 |
可反复读 | 防止 | 防止 | 产生 |
串行化 | 防止 | 防止 | 防止 |
建一个索引,应用 Like 查问,左右两边都加 %。索引会起作用吗?为什么?
这个不会起作用,只有在右边没有 % 的状况下才会起作用。
起因前面补充
最左匹配准则的成因?
最左匹配的准则:MySQL 执行 sql 时候在 where 前面字段从左到右匹配索引,遇到范畴查问就进行,= 和 in 能够乱序。
最左匹配的成因:联结索引是多个字段独特组成的 B +tree 构造,最右边的字段在树的最上边,依照程序自上而下散布,而查问树结构就是从树的根节点往下查问。
什么是笼罩索引?
查问语句的索引起作用了,并且查问的字段也是索引自身的字段
就是笼罩索引,可防止回表查问。
执行打算时:_Extra:__Using index___
那什么是回表?
和笼罩索引相同,查问的字段除了索引字段还有其余字段。
mysql 查问完索引树后再回到表里,把其余字段查出来。
执行打算时:_Extra:__Using index condition___
聚合索引和非聚合索引的区别?
主键索引是聚合索引,其余索引是非聚合索引
聚合索引叶子节点存储整条记录,非聚合索引叶子节点存储的是主键指针。
一条 sql 执行经验了什么?
首先 MySQL 会去查看这条语句有没有缓存的数据,有就完结了,没有开始查看语法,而后抉择用哪些个索引,最初应用抉择搜索引擎(InnoDB 还是 MyISAM)去执行。
expain 怎么用?
explain 叫执行打算,是 mysql 测验 sql 语句效率的工具,用法是间接加在 sql 语句的后面去执行。
我次要是看执行后的两个值 type 和 Extra
当 type 的值是 index 或 all 的时候,示意须要优化了
当 Extra 的值是 Using filesort 或 Using temporary 示意须要优化了
遇到 Using temporary 和 Using filesort 怎么优化?
Using temporary 是应用到了长期表,常产生在 order by 和 group by 的语句中
Using filesort 应用了文件排序,即在内存和磁盘中排序
给 order by 或 group by 前面的字段加索引
什么是乐观锁和乐观锁?
乐观锁和乐观锁并发管制的两种思路
乐观锁 :更新的时候校验更新前查到的数据是不是最新的,实现办法:CAS 机制和版本号机制
乐观锁:更新前锁住数据,不让其余线程查问和更新,等到更新实现后,再开释锁。实现办法:加锁:数据库加锁select ... for update
,代码加锁synchronized
。
数据库多大的时候须要分表?
别离为纵向分表和横向分表
纵向分表 :一张表依据字段的活跃度不同为多张表,常常查问的放在一张表这样。
横向分表:数据量大的时候须要数据横向切割,散布在几张构造雷同的表中,防止一张表过大,查问太慢,个别 mysql 在单表 1000 万的时候就须要了,这个还和服务器的配置、MySQL 的性能、表构造的设计,索引的创立,查问的语句有关系。
ElasticSearch 为什么比 mysql 快?
ElasticSearch 应用的倒排索引技术,MySQL 应用的索引构造是 B +tree。
怎么解决 ElasticSearch 深分页问题?
ElasticSearch 在大数据量分页的时候,最初面的数据查问很慢(5 万条当前),能够应用 scroll 滚动的形式去查问,依据每次查问失去的 scroll_id 去进行下次查问,相似于游标,和 redis 的 scan 命令查问差不多。
弊病,只能上一页下一页查问,不能跳页查问。
spring 和 mybatis
spring MVC 和 sping boot 的区别?
spring MVC 是 spring 框架的一个模块,应用的 MVC 思维,M 代表对象 (Model),V 代表页面(view),C 代表(控制器)controller
在肯定水平上封装并简化了原生的 Servlet 的 WEB 利用的开发。spring boot 是 spring 框架的一个主动配置的残缺开发包,简化了 spring MVC 在搭建 web 利用时的繁琐的各种配置,比方:视图解析器的配置、注入 bean 的扫描门路的配置等,它的特点是约定大于配置,很多配置都曾经默认配置好了。
sping boot 内嵌了 tomcat, 打包默认是 jar 包。
spring bean 作用域?
singleton:IOC 容器中只有一个
prototype:IOC 容器中有多个
request:有效期是一次申请
session:有效期是一次会话
global session:有效期是一次启动
讲讲 springboot 如何实现主动拆卸的?
次要是 springboot 启动类下面的 @SpringBootApplication 注解的作用,它是一个复合注解
外面的 @SpringBootConfiguration 标记以后的类是配置类
@ComponentScan 注解用来指定须要注入到 IOC 容器的包的门路
@EnableAutoConfiguration 注解用来指定须要拆卸的类的配置文件
最初通过动静代理来实现主动拆卸。
BeanFactory 和 FactoryBean 的区别?
日后更新
spring 怎么解决循环依赖的问题?
循环依赖是多个类相互援用,分为结构依赖和属性循环依赖,
spring 用三级缓存来解决属性循环依赖, 详情日后更新。
AOP 的实现原理,什么状况下应用 JDBC 的代理?
AOP 是基于动静代理实现的,
如果指标类是接口, 则用 jDKProxy 来实现, 否则用 cglib
JDKProxy: 通过 ava 的外部反射机制实现
cgib: 以继承的形式动静生成指标类的代理, 借助 ASM 实现
详情:《AOP 的两种实现形式 and 五种加强 / 告诉》
Spring 中应用到的设计模式?
日后更新
懒汉模式和饿汉模式的区别?
懒汉模式: 在实例化的时候初始化。
饿汉模式: 在类加载时时候初始化。
mybatis 什么时候应用 ${}?
#{}
是预编译时候充当占位符的一种形式,能够避免 sql 注入。${}
是间接拼接 sql, 个别在示意字段名或表名的时候应用。from ${表名},order by ${字段名}
mybatis 嵌套查问和嵌套后果有什么区别?
都是产生在后果映射的
<resultMap>
标签里。
都有嵌套的关系,对象嵌套对象用<association>
标签,对象嵌套汇合应用<collection>
标签。
嵌套查问 是在嵌套的标签应用select="xxx"
关联另一条查问语句,再次查问,有 N + 1 问题。
嵌套后果 是将查问的后果主动映射到<resultMap>
标签的嵌套关系中。
怎么应用 mybatis 的二级缓存?
1. 在 mybais 配置文件中开启二级缓存
2. 在相应的 mapper.xml 中加上 cache 标签。
中间件等
nginx 的负载平衡形式有哪些?
1. 轮询
2. 配置权重
3. 依据 IP 做 hash 算法,同一个 IP 进同一个服务器
4. 同一个 url 进入同一个服务器
redis 为什么快?
运行在内存、数据结构简略、IO 多路复用
redis 有几种数据类型
8 种,罕用的 5 种:string、list、hash、set、sorted、set
3 种不常见的 bitmap(位图)、hyperloglog(不精准去重计数器)、Geo(地理信息定位)
redis 的应用场景?
用作缓存,存储常常查问的数据,缓解数据库的压力
存储短信验证码,定时生效
利用 redis 的过期揭示,实现订单主动过期《订单主动过期计划》
利用 setnx 命令实现分布式锁
缓存穿透、击穿、雪崩的成因和解决方案?
缓存击穿 :热点 key 生效,此时大流量进来,申请穿过 redis 间接拜访数据库。
解决方案:热点 key 的有效期设置永恒。缓存穿透 :申请一个不存在的数据,redis 没有就去查数据库,反反复复。
解决方案:
1. 将不存在的数据在 redis 中设置默认值并有有效期。弊病:如果有歹意攻打,会存大量的默认值。
2. 布隆过滤器,弊病:有肯定的误差。缓存雪崩 :有大量的 key 同时生效。
解决方案:key 的有效期在肯定范畴内随机一点。
redis 的更新策略?
批改数据:先操作数据库,再删除 redis 中的 key
删除数据:先操作数据库,再删除 redis 中的 key
redis 的长久化?
redis 的长久化有两种,AOF 和 RDB。
AOF 是全量的,RDB 是增量的。
redis 哨兵的工作原理?
日后更新
怎么避免音讯的失落和反复?
我的我的项目用的 RabbitMQ,音讯失落是应用音讯队列会遇到的问题。往往因为网络抖动或服务宕机产生。
个别会产生在三个中央,1. 生产者到音讯队列,2. 音讯队列,3. 音讯队列到消费者。
生产者到音讯队列避免音讯失落能够开启 RabbitMQ 接管到音讯会应答的confirm
模式,
音讯队列开启长久化到数据库,能够防止宕机后音讯失落。
消费者也是通过一个手动应答的形式通知 RabbitMQ 是否真正生产。音讯反复:对生产音讯的办法加锁,并对音讯的唯一性做判断。
分布式锁的实现形式有哪些?
redis 的 setnx:多个线程对一个 key 去 set 值,如果不存在 key 就会设置胜利,否则 set 失败,set 胜利的就相当于拿到了锁,就能够解决某办法。解决实现删除 key, 即开释锁。
须要对 key 设置有效期,防止产生失去锁的线程发生意外,不能开释锁。zookeeper 的长期程序节点:多个线程对某个长久化节点设置长期程序节点,这些长期程序节点是依照创立工夫排序的,第一个创立节点的线程就相当于拿到了锁,解决完逻辑后删除第一个节点,第二个变成了第一个就拿到了锁这样..
服务注册与发现的实现原理?
服务注册于发现是微服务架构中服务之间调用的组件,常见的有 Eureka、Nacos、Zookeeper
能够简略的设想成一个 list, 服务注册就相当于将服务的信息存储 list, 服务发现就相当于查问 list, 如果某个服务挂了,就从这个 list 中删除或标记为生效,能够通过组件向各服务发送心跳来确定服务是否失常。
spring cloud 的外围组件有哪些?
Eureka:服务注册于发现。
Feign:依据注解和抉择的机器,拼接申请 url 地址,发动申请。
Ribbon:实现负载平衡。
Hystrix:熔断器,实现了不同服务调用的隔离,避免一个服务出现异常,拖垮整个服务链路,防止了服务雪崩的问题。
Zuul:网关治理,由 Zuul 网关转发申请给对应的服务,后端服务的总入口。
写的略微有些仓促,前期会更新欠缺,有形容不正确或者不分明的中央,还望指出,感激!