侧边栏壁纸
博主头像
乌拉队长博主等级

你只管努力,其余的交给命运

  • 累计撰写 129 篇文章
  • 累计创建 34 个标签
  • 累计收到 34 条评论

目 录CONTENT

文章目录

面试相关知识总结(二)

乌拉队长
2021-09-10 / 0 评论 / 0 点赞 / 801 阅读 / 5,425 字

TCP和UDP区别

  • TCP是面向连接的(发送数据之前先建立连接),UDP是无连接的,即发送数据之前不需要建立连接
  • TCP提供可靠的服务,即,通过TCP连接传送的数据:无差错,不丢失,不重复且按序到达;UDP尽最大努力交付,即,不保证可靠交付
  • TCP面向字节流,即,TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞机制,因此网络出现拥塞不会是源主机的发送速率降低(对实时应用很有用,如:IP电话,实时视频会议等)
  • 每条TCP连接只能是点对点的;UDP支持一对一,一对多,多对一和多对多的交互通信
  • TCP首部开销20字节,UDP的首部开销小,只有8字节
  • TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

加密算法:

据记载,公元前400年,古希腊人就发明了置换密码;在第二次世界大战期间,德国军方启用了“恩尼格玛”密码机,所以密码学在社会发展中有着广泛的用途。

  • 对称加密

有流式、分组两种,加密和解密都是使用的同一个密钥。

例如:DES、AES-GCM、ChaCha20-Poly1305等

  • 非对称加密

加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的。

例如:RSA、DSA、ECDSA、 DH、ECDHE

  • 哈希算法

将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。

例如:MD5、SHA-1、SHA-2、SHA-256 等

  • 数字签名

签名就是在信息的后面再加上一段内容(信息经过hash后的值),可以证明信息没有被修改过。hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。

HTTPS的原理和实现

  • HTTPS是什么?
    HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

    SSL(Security Socket Layer)全称是加密套接字协议层,它位于HTTP协议层和TCP协议层之间,用于建立用户与服务器之间的加密通信,确保所传递信息的安全性,同时SSL安全机制是依靠数字证书来实现的。

    SSL基于公用密钥和私人密钥,用户使用公用密钥来加密数据,但解密数据必须使用相应的私人密钥。使用SSL安全机制的通信过程如下:用户与服务器建立连接后,服务器会把数字证书与公用密钥发送给用户,用户端生成会话密钥,并用公共密钥对会话密钥进行加密,然后传递给服务器,服务器端用私人密钥进行解密,这样,用户端和服务器端就建立了一条安全通道,只有SSL允许的用户才能与服务器进行通信。

  • HTTP传输协议的缺点
    HTTP协议基于TCP进行传输的,其中传输的内容全都裸露在报文中,如果我们获取了一个HTTP消息体,那我们可以知道消息体中所有的内容。这其实存在很大的风险,如果HTTP消息体被劫持,那么整个传输过程将面临:

    	(1) 窃听风险(eavesdropping):第三方可以获知通信内容。
    	(2) 篡改风险(tampering):第三方可以修改通信内容。
    	(3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。
    

    正因为HTTP协议的这个缺点, HTTP变成了一种不安全的协议。

  • HTTPS如何解决HTTP的缺点?
    使用HTTP+SSL/TLS协议相结合的方式进行数据传输。SSL通常使用 对称加密+非对称加密 方式对数据进行加密,但是这种方式的缺点是黑客可以冒充服务器,发送给客户端假的公钥。
    SSL 证书
    v25e2241fae8b593ff7f3b3a308ef81c10_720w.png
    如上图所示,在第 ② 步时服务器发送了一个SSL证书给客户端,SSL 证书中包含的具体内容有:

    	(1)证书的发布机构CA
    	(2)证书的有效期
    	(3)公钥
    	(4)证书所有者
    	(5)签名
    	………
    

    客户端在接受到服务端发来的SSL证书时,会对证书的真伪进行校验,以浏览器为例说明如下:

    	(1)首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验
    	(2)浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发
    	(3)如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。
    	(4)如果找到,那么浏览器就会从操作系统中取出 颁发者CA 的公钥,然后对服务器发来的证书里面的签名进行解密
    	(5)浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做对比
    	(6)对比结果一致,则证明服务器发来的证书合法,没有被冒充
    	(7)此时浏览器就可以读取证书中的公钥,用于后续加密了
    

ArrayList和LinkedList的区别

共同点 : 存储有序的,可重复的数据。
区别:

  • ArrayList底层实现是数组,LinkedList底层实现是双向链表。
  • 对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
  • 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
  • ArrayList使用在查询比较多,但是插入和删除比较少的情况,而LinkedList用在查询比较少而插入删除比较多的情况

有序的ArrayList如何实现查找
使用ArrayList的indexOf()或者lastIndexOf()方法,折半查找

有序的LinkedList 如何实现查找
使用跳表进行查找,查找复杂度O(log n)。
注意:当元素位于LinkedList靠前位置时,跳表效率不如顺序遍历高,因此,跳表适合查找元素靠后时使用。
跳表可以参考知乎专栏文章:数据结构与算法——跳表

各种排序算法的时间复杂度

20180227141312419.jpg

HashMap

底层实现及如何解决hash冲突

  • JDK1.8之前HashMap的底层主要是基于数组+链表来实现的
  • 而在JDK1.8之后HashMap的底层主要是基于数组+链表+红黑树来实现

它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。

  • HashMap中主要是通过key的hashCode来计算hash值的,只要hashCode相同,计算出来的hash值就一样。
  • 如果存储的对象对多了,就有可能不同的对象所算出来的hash值是相同的,这就出现了所谓的hash冲突。
  • 解决冲突的方法有很多,比如:链地址法和开放地址法。
  • HashMap底层是通过链表来解决hash冲突的,即链地址法。

1805276202003252348237071794035084.png

扩容阈值
HashMap的默认扩容阈值为0.75,例如:容器初试容量为16,则当容器内元素超过16*0.75=12时,容器会自动进行扩容,扩容后的容量为扩容前的2倍。

HashMap什么时候会转为红黑树?
当链表超过8个节点数时,HashMap会将其转为红黑树
当红黑树节点数少于6个时,HashMap会将红黑树转回链表

为什么红黑树和链表的转换阈值不一样?
如果阈值都设置为一样的,比如设置为8,那么当HashMap中某个Key-Value下的元素个数在阈值附近频繁增删时,HashMap会频换转换数据的存储方式,降低存储效率。

java

String类能不能被继承?为什么?
不能,因为String类是被final修饰的类。

linux处理并发的命令行

命令后面加 & 表示该命令会在子进程中执行,如果后面还有其他命令需要在前面命令全部执行完之后才能执行,则在并行执行的命令后面加 wait,表示等待 前面的命令执行完成后再继续。

细节可以参考:如何并发执行Linux命令

2*8怎么计算最快

将2的二进制左移3位,即,2<<3

细节可以参考:Java中用最有效率的方法算出2 乘以8

Linux 怎么查看进程内存占用

  • 使用ps命令
    ps -aux | grep mysql
  • 使用free命令(优点:占用系统资源较少)
    free -m -s 1
  • 使用top命令(缺点:占用系统资源较多)
    	# 查看mysqld用户的内存占用
    	top -u mysqld
    	# 查看PID为50012的进程的内存占用
    	top -p 50012
    
  • 查看进程的status文件
    cat /proc/2913/status

常用的设计模式有哪些?

创建型

  • 工厂模式与抽象工厂模式 (Factory Pattern)(Abstract Factory Pattern)
  • 单例模式 (Singleton Pattern)
  • 建造者模式 (Builder Pattern)
  • 原型模式 (Prototype Pattern)

结构型

  • 适配器模式 (Adapter Pattern)
  • 装饰器模式 (Decorator Pattern)
  • 桥接模式 (Bridge Pattern)
  • 外观模式 (Facade Pattern)
  • 代理模式 (Proxy Pattern)
  • 过滤器模式 (Filter、Criteria Pattern)
  • 组合模式 (Composite Pattern)
  • 享元模式 (Flyweight Pattern)

行为型

  • 责任链模式(Chain of Responsibility Pattern)
  • 观察者模式(Observer Pattern)
  • 模板模式(Template Pattern)
  • 命令模式(Command Pattern)
  • 解释器模式(Interpreter Pattern)
  • 迭代器模式(Iterator Pattern)
  • 中介者模式(Mediator Pattern)
  • 策略模式(Strategy Pattern)
  • 状态模式(State Pattern)
  • 备忘录模式(Memento Pattern)
  • 空对象模式(Null Object Pattern)

缓存怎么设计

以持久化DB数据为准,读的话,先读redis,如果没命中再读mysql,并写入redis,如果出现缓存击穿的情况,读数据的时候加锁;写的话,先写mysql,然后通过canal同步更新redis。

servlet的redirect和forward的区别

  • forward:(转发)指服务器内部的重定向,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而客户端并不知道,因此在客户端的地址栏中不会显示转向后的地址,还是原来的地址。由于整个重定向的过程用的是同一个Request,因此forward会将Request的信息带到被定向的JSP或Servlet中使用。

  • redirect:(重定向)客户端的重定向,是完全的跳转,即客户端浏览器会获取到跳转后的地址,然后重新发送请求,因此浏览器中显示跳转后的地址。同时,这种方式比forward方式多了一次网络请求,因此效率要低于forward方式。

因此,一般当一个forward方式可以满足要求时,尽可能地使用forward方式。

final关键字修饰的三种使用场景

1. 修饰变量

当final修饰一个变量的时候一般把他作为常量,通常和static关键字配合使用。

2. 修饰方法

当一个方法被final修饰后,表示该方法不能被子类重写,final方法有一个好处是比非final方法要快,因为在编译时已经静态绑定了,不需要在运行时在动态绑定。

3. 修饰类

当一个类被final修饰后,表示该类是完整的,不能被继承,例如Java中String、Integer类都是final类

final修饰的优点

  • final关键字提高了性能。JVM和Java应用都会缓存final变量。
  • final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
  • 使用final关键字,JVM会对方法、变量及类进行优化。
  • 不可变类创建不可变类要使用final关键字。不可变类是指它的对象一旦被创建了就不能被更改了。String是不可变类的代表。不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。

Linux统计文件某个字符出现的次数

  • 使用grep或zgrep (-c 或 --count : 计算符合样式的列数)

    	# 在普通文件中统计字符出现的次数
    	# 查找object在flycua-cn.19-12-13.log文件中出现的次数
    	grep -c  'object'  flycua-cn.19-12-13.log
    
    	# 在压缩文件中统计字符出现的次数
    	# 查找403在flycua-cn.19-12-13.log.gz文件中出现的次数
    	zgrep -c  '403'   flycua-cn.19-12-11.log.gz
    
  • 使用vim统计

    用vim打开目标文件,在命令模式下,输入::%s/object/&/gn

    &代表s/ 搜索出来的内容
    g代表全局替换(而非仅仅当前行)
    n代表不执行,只是预览一下会有什么情况发生

  • 使用grep结合wc命令来统计文件中某个字符串出现的个数

    Linux wc命令用于计算字数。

    利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。

    参数:

    -c或--bytes或--chars 只显示Bytes数。
    -l或--lines 只显示行数。
    -w或--words 只显示字数。
    --help 在线帮助。
    --version 显示版本信息。
    grep结合wc命令:

    语法:grep 'object' fileName | wc -l

Reference:
HTTPS系列干货(一):HTTPS 原理详解

0

评论区