设计模式(必知必会)
【1】你知道那些设计模式?
答:单例模式、观察者模式、MVC模式、工厂模式、桥接模式、代理模式等。
【2】单例模式怎么实现的?
答:先回答单例模式只允许有一个实例,该类属于自己创建自己的实例,注意:getInstance()方法中需要有同步锁synchronized()修饰,防止多线程的进入导致instance被实例化多次。
单例模式分为两种(懒汉、饿汉)
懒汉模式如下:
如此一来,优点:第一次调用才初始化,避免内存浪费。缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率(会导致线程等待)
改进方法:
将synchronized改成修饰代码块的方式。具体实现方式如下:
饿汉模式:
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。
【3】观察者模式?(使用场景,那些开源代码中用到过?)
答:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
【4】Java编程的solid原则?
答:
SRP:The Single Responsibility Principle 单一责任原则
类是修改次数最多的,每个类应负责单一的职责,多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题,非常耗时耗力。
OCP:The Open Closed Principle 开放封闭原则
对扩展是开放的,而对修改是封闭的,(类中有sendByEmail()、sendByMsn()、增加sendByQQ()时候,会造成多处修改,可写一个send接口,里面含有一个send()方法,想要实现发送消息的功能,实现接口send的send()方法就好了)
LSP:The Liskov Substitution Principle 里氏替换原则
原则上将,子类继承父类,不应该单单是is-a的关系,而应该是可以替代父类的。
ISP: The Interface Segregation Principle 接口分离原则
使用多个专门的接口比使用单一的总接口总要好。
DIP: The Dependency Inversion Principle 依赖倒置原则
依赖抽象层(接口),而不是具体类
网络通信知识
【1】知道HTTP协议吗?
答:HTTP是一种超文本传输协议,HTTP的请求分为三个部分:请求行、消息报头、请求正文。HTTP的方法主要有:
post:略
get:略
PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
OPTIONS:查询相应URI支持的HTTP方法。
常见的HTTP相应状态码:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
200:请求被正常处理
301:永久性重定向
302:临时重定向
303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302类似,只是强制要求使用POST方法
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503:服务器正忙
【2】tcp/ip三次握手,四次挥手?
三次握手过程:
三次握手
简述过程如下:
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
四次挥手过程:
四次挥手过程
简述如下:
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
附加:为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
网友评论