部分面试总结

filter和Interceptor的区别

Filter可以认为是Servlet的一种“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。可以修改HttpServletRequest,HttpServletResponse头和数据。

拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法

拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑

重写堆排序,实现大顶堆

netty粘包拆包

产生粘包和拆包问题的主要原因是,操作系统在发送TCP数据的时候,底层会有一个缓冲区,例如1024个字节大小,如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题;如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分为多次发送,这就是拆包,也就是将一个大的包拆分为多个小包进行发送。

粘包和拆包问题,常见的解决方案有四种

  • 客户端在发送数据包的时候,每个包都固定长度,比如1024个字节大小,如果客户端发送的数据长度不足1024个字节,则通过补充空格的方式补全到指定长度;
  • 客户端在每个包的末尾使用固定的分隔符,例如\r\n,如果一个包被拆分了,则等待下一个包发送过来之后找到其中的\r\n,然后对其拆分后的头部部分与前一个包的剩余部分进行合并,这样就得到了一个完整的包;
  • 将消息分为头部和消息体,在头部中保存有当前整个消息的长度,只有在读取到足够长度的消息之后才算是读到了一个完整的消息;
  • 通过自定义协议进行粘包和拆包的处理。

对称加密和非对称加密算法

对称加密算法

DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。
3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;

非对称加密

指加密和解密使用不同密钥的加密算法,也称为公私钥加密。假设两个用户要加密交换数据,双方交换公钥,使用时一方用对方的公钥加密,另一方即可用自己的私钥解密。常见的非对称加密算法:RSA、DSA(数字签名用)、ECC(移动设备用)、Diffie-Hellman、El Gamal。

RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;
DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);
ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。

ECC和RSA相比,在许多方面都有对绝对的优势,主要体现在以下方面:
(1)抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。
(2)计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。
(3)存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。
(4)带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。

MybatisPlus批量删除和批量新增问题

mybatis plus插入就是在跑for循环。

Arrays.sort

双轴快排(DualPivotQuicksort),顾名思义有两个轴元素pivot1,pivot2,且pivot ≤pivot2,将序列分成三段:x < pivot1、pivot1 ≤ x ≤ pivot2、x >pivot2,然后分别对三段进行递归。这个算法通常会比传统的快排效率更高,也因此被作为Arrays.java中给基本类型的数据排序的具体实现。

判断数组的长度是否大于286,大于则使用归并排序

判断数组长度是否小于47,小于则直接采用插入排序

为什么禁用3表以上的关联查询

  1. 数据量大,join临时表会很大,性能差
  2. mysql多表关联性能差
  3. 数据量大时,分表分库分服务,无法继续join

解决方式:

  1. 拆成多条sql
  2. 形成一个具有多表信息的冗余表
  3. 定时对多个表进行数据清洗,形成一个涉及多个表重点数据的冗余表

不要主动说自己不熟悉某一块,哪怕是同事做的,也要知道个大致过程和结构

AOP的实质是什么

核心思想就是把程序中的业务逻辑代码同通用服务分离出来

动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成而静态代理由程序员创建或工具生成代理类的源码,再编译代理类

 join point(连接点)程序中的一个精确位置,通常是类中的一个方法,aop中不需要去定义一个join point

 point cut(切入点)本质上是捕获连接点,在aop中用来捕获需要操作类的相关方法

 advice(通知)切入点上的执行代码块!是执行方面的具体操作

 aspect(方面)point cut与advice集合起来就是aspect,它代表更多对象间横切的关系

 introduce(引入)为对象引用附加的属性及引用,从而达到修改对象的目的

liunx

一.将目录下所有文件中包含http的全替换为https。

sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
sed -i "s/http/https/g" 'grep http -rl /'

-- i: 插入
-- s/re/string :用string替换正则表达式re
-- g(global) :获得内存缓冲区的内容,并替代当前模板块中的文本
-- -l: 只打印匹配文件的文件名

二.查找目录中所有包含http的文件。

-- r 表示递归, n 表示查询结果显示行号
grep -rn "Hello" ./

find ./ -name "*.*" | xargs grep  "http"

-- grep -i 忽略字符大小写的差别
find . | xargs grep -ri "http"
-- -l 表示只显示文件名
find . | xargs grep -ri "http" -l

三.删除目录中包含https文件。

redis过期

-- 设置一个key在当前时间"seconds"()之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间
EXPIRE key "seconds"

--获取key的过期时间。如果key存在过期时间,返回剩余生存时间();如果key是永久的,返回-1;如果key不存在或者已过期,返回-2
TTL key

--移除key的过期时间,将其转换为永久状态。如果返回1,代表转换成功。如果返回0,代表key不存在或者之前就已经是永久状态
PERSIST key

-- SETEX在逻辑上等价于SET和EXPIRE合并的操作,区别之处在于SETEX是一条命令,而命令的执行是原子性的,所以不会出现并发问题
SETEX key "seconds" "value"

翻转链表

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null)
            return head;
        ListNode l = head.next;
        ListNode newHead = reverseList(head.next);
        l.next = head;
        head.next = null;
        return newHead;
    }
}

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode next = null;
        while(head != null){
            next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }
        return pre;
    }
}

大量数组求并集

回答时总—分,先说要点

用socket实现tcp/udp的区别

实现方法以及API不同然主要取决去二者的各自特点。1)TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务;(2)TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;(3)也正因为以上特征,UDP具有较好的实时性,工作效率较TCP协议高;(4)UDP段结构比TCP的段结构简单,因此网络开销也小。具体二种协议没有好坏,只有适合,有时候二者结合,比如QQ就是两种协议都有,比如组播通信的时候只能用udp

Jwt与token的区别

1)token对应的内容存放在Redis中
2)Jwt对应的playload数据存放在客户端

Jwt优点
1),减轻服务端压力。
2),查询效率比token高。
3),不容易被客户端篡改数据。
缺点
1)如果一旦生成好一个jwt之后,后期是否可以销毁
2)Jwt playload数据多,占据服务器端带宽资源
jwt不是很安全,playload中不能存放敏感的信息,必要须加密

线程数量设置考虑

单处理器线程设置

  • 如果是CPU密集型应用,则线程池大小设置为n+1
  • 如果是IO密集型应用,则线程池大小设置为2n+1(因为io读数据或者缓存的时候,线程等待,此时如果多开线程,能有效提高cpu利用率)

最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目


   转载规则


《部分面试总结》 锦泉 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录