补充
一、什么是代理模式?
代理模式分为目标角色,代理角色,抽象角色。代理角色的意义在于控制客户端对目标角色的直接访问或是附加扩展对目标角色的操作。调用者(客户端)感知不到使用的其实是代理对象。
1.静态代理:代理对象和目标对象共同实现一个业务接口,代理对象中有一个private的私有目标对象引用。使用时只需要new一个目标对象并传给代理角色即可。
缺点在于目标角色和代理角色都实现相同业务接口,代码冗余,且维护不方便。
2.JDK动态代理:代理对象不需要实现功能接口。代理对象调用目标对象的方法是通过调用处理类中的invoke()方法,里面利用反射机制来调用目标类的方法。JDK动态代理实际上是通过接口来实现代理。
public class JdkProxyFactory {
public static Object getProxy(Object target) {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(), //代理接口
new DebugInvocationHandler(target)
);
}
}
缺点在于JDK代理实际上代理的只是目标类所实现的接口中方法,而对于目标类的私有方法,则不能代理。
3.CGLIB动态代理:通过继承目标类的一个子类来实现代理。代理对象会把目标类设置为自己的父类。实现代理方法和JDK动态代理类似,通过invoke方法。
public class CglibProxyFactory {
public static Object getProxy(Class<?> clazz) {
// 创建动态代理增强类
Enhancer enhancer = new Enhancer();
// 设置类加载器
enhancer.setClassLoader(clazz.getClassLoader());
// 设置委托类(设置父类)
enhancer.setSuperclass(clazz);
// 设置方法拦截器
enhancer.setCallback(new DebugMethodInterceptor());
// 创建代理类
return enhancer.create();
}
}
缺点在于CGlib需要引入外部依赖,并且不能代理继承final修饰的类。
二、MQ消息队列堵塞怎么解决?
MQ堵塞瓶颈在消费者这边,可以多开几个消费者,增大队列大小。
三、Redis内存饱和怎么办?过期删除策略?
1.使用内存淘汰策略,常见的淘汰算法有FIFO,LRU,LFU(数据引用次数最小的淘汰,是一种全局的算法,不关注短期是否被使用)
2.惰性过期:过期的数据被再次访问时,才判断是否过期并进行删除。缺点在于极端情况下过期数据会占据大量内存,而不被删除释放。
定期过期:每隔一段时间,CPU扫描内存删除过期数据。
四、如何理解跳表结构?
跳表中,每个节点出了包含下个节点的指针外,还可能包含多个后面节点的指针,越高层的指针跨越的节点数越多。跳表一个重要性质是一个节点如果在第i层链表出现,那么在第1到i-1层链表中也会出现。比如要在一个有序链表中查找元素,可以通过跳表跳过查找一些中间元素,从而减少查找时间。其实是一种空间换时间的做法。
五、反射的作用和机制?
反射用于程序运行时判断对象属于哪个类,或是获取类的信息和方法。原理是通过.class字节码文件找到类定义的属性和方法信息。
核心是类名.class获得class对象。
六、synchronized有什么不足,一定线程安全吗?
静态方法和实例方法锁的对象是不一致的。
七、查找学生表中年龄最大的一条记录?
①select * from student where age=(select max(age) from student)
②select TOP 1 * from student order by age desc 返回表中前一行数据
③select * from student order by age desc limit 1
八、Redis中sorted set底层是怎么实现的?
Zset是通过一个哈希表(维护姓名->分数的一个映射关系)和一个跳表(存储分数)来实现。查找某个节点排名时,只需从高层到底层把跨度相加起来,得到排名结果。它的查询次数是远比普通链表要小的。
九、TCP和UDP区别?
1.从报文上看,UDP报文首部只有四个字段,包括ip,端口,总长度,检验。
而TCP头部除此之外,还有序号,期望号,窗口大小,FIN和SYN等等字段。
2.UDP,没有重传和拥塞控制机制。
TCP有重传机制(冗余ACK,超时),流量控制(点对点,基于滑动窗口,通过min(拥塞窗口,接收方窗口)来对发送方进行限制),拥塞控制(慢开始,拥塞避免算法,拥塞处理)
3.UDP无连接不可靠,用于广播。
TCP面向连接可靠,可靠数据传输。
十、utf-8和Unicode的区别?
Unicode每一个字符存储时对应一个定长编码,而UTF-8每个字符对应一个可变长编码。
今日总结
补充基础题