面经—(涂鸦智能)

1.java

1.1 hash算法

1.1.1 除余法

除余法就是用关键码x除以M(往往取散列表长度),并取余数作为散列地址。

1.1.2 乘余取整法

先让关键码key乘上一个常数A(O<A<1),提取乘积的小数部分。然后,再用整数n乘以这个值,对结果向下取整,把它做为散列的地址。

1.1.3 平方取中法

由于整数相除的运行速度通常比相乘要慢,所以有意识地避免使用除余法运算可以提高散列算法的运行时间。平方取中法的具体实现是:先通过求关键码的平方值,从而扩大相近数的差别,然后根据表长度取中间的几位数(往往取二进制的比特位)作为散列函数值。因为一个乘积的中间几位数与乘数的每一数位都相关,所以由此产生的散列地址较为均匀。

1.2冲突解决办法

1.2.1 链表法
1.2.2 开放地址法
  • 线性探测法将散列表看成是一个环形表,若在基地址d(即h(K)=d)发生冲突,则依次探查下述地址单元:d+1,d+2,M-1,0,1,d-1直到找到一个空闲地址或查找到关键码为key的结点为止。

  • 二次探查法
    生成的后继散列地址不是连续的,而是跳跃式的,以便为后续数据元素留下空间从而减少聚集。二次探查法的探查序列依次为:12,-12,22,-22,等,也就是说,发生冲突时,将同义词来回散列在第一个地址的两端。

  • 随机探查法

  • 双散列法
    https://wwwjianshu.com/p/f9239c9377c5

1.3 如何让线程在5秒钟内获取到锁

  • ·对程序进行限流,降级
  • ·对线程根据等待时间做优先级升级,优先级越高,越先获取锁
  • ·对业务代码做优化

2.Spring

2.1 spring的注解原理

AnnotationInvocationHandler它继承自InvocationHandler,会使用jdk的动态代理生成数据。
判断注解是否存在

  • 注解通过反射获取,通过 Class对象的 isAnnotationPresent()方法判断它是否应用了某个注解
  • 通过 getAnnotation()方法来获取 Annotation 对象实例
@TestAnnotation("defaultValue")
public class Test{
public static void main(String[] args){
// 注解通过反射获取,通过Class 对象的isAnnotationPresent()方法判断
它是否应用了某个注解
boolean hasAnnotation=Test.class.isAnnotationPresent(TestAnnotation.class);
	if(hasAnnotation){
		//通过getAnnotation()方法来获取 Annotation 对象实例
		Tes tAnnotation testAnnotation=
		Test.Class.getAnnotation(TestAnnotation.class);
		System.out.println("id:"+ testAnnotation.id());
		System.out.println("msg:" + testAnnotation.msg());
		}
	}
}
2.2 spring的设计模式
https://blog.csdn.net/chao821/article/details/92400186
https://blog.csdn.net/w05980598/article/details/79363046

3.dubbo

3.1 dubbo的调用链路
如何从consumer调用到provider,provider又是如何处理信息的
3.2 dubbo和http的区别

dubbo是一个分布式的服务请求框架,改用provider和consumer模式进行服务。consumer端无需关注provider端如何实现,只需在注册中心订阅即可到相应服务器请求服务,这样就实现了高性能和透明化。

  • 协议层区别
    1 HTTP,HTTPS 使用的是应用层协议 应用层协议:定义了用于在网络中进行通信和传输数据的接口

    2 DUBBO接口使用的是TCP/IP是传输层协议 传输层协议:管理着网络中的端到端的数据传输;因此要比 HTTP协议快

  • socket层的区别
    1 dubbo默认使用socket长连接,即首次访问建立连接以后,后续网络请求使用相同的网络通道

    2 http1.1协议默认使用短连接,每次请求均需要进行三次握手,而http2.0协议开始将默认socket连接改为了长连接

3.3dubbo请求体是啥?

1.消息头

在这里插入图片描述
magic:类似java字节码文件里的魔数,用来判断是不是dubbo协议的数据包。魔数是常量
0xdabb
flag:标志位,一共8个地址位。低四位用来表示消息体数据用的序列化工具的类型(默认
hessian),高四位中,第一位为1表示是request请求,第二位为1表示双向传输(即有返回
response),第三位为1表示是心跳ping事件。
status:状态位,设置请求响应状态,dubbo定义了一些响应的类型。具体类型见
com.alibaba.dubbo.remoting exchange.Response
invoke id:消息id, long类型。每一个请求的唯一识别d(由于采用异步通讯的方式,用来把请
求request和返回的response对应上)
body length:消息体 body长度,int类型,即记录Body Content有多少个字节。

2.消息体

实现源码在DubboCodec.encodeRequestData(Channel channel,ObjectOutput out,Object
data):
1、dubbo版本号
2、invoke的路径
3、invoke的provider端暴露的服务的版本号
4、调用的方法名称
5、参数类型描述符
6、遍历请求参数值并编码
7、dubbo请求的attachments

4.kafka

4.1简单介绍下kafka
4.2分区及分区副本,如何保证一致性的
4.3 kafka如何提高吞吐量的?和其他MO对比

5.线上遇到的问题

5.1CPU占用较高
5.2内存占用最高

===========================

1 .redis和zookeeper分布式锁应用场景的区别
2 .线程池的种类
3 .几个线程同时去做某种事情(强调同时)
4 .二进制为什么高
5 .IO流类别 ,以及随机读的方式
6 .dubbo的熔断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值