Java面试经典题目六(网络知识及设计模式)

设计模式(必知必会)

【1】你知道那些设计模式?

答:单例模式、观察者模式、MVC模式、工厂模式、桥接模式、代理模式等。

【2】单例模式怎么实现的?

答:先回答单例模式只允许有一个实例,该类属于自己创建自己的实例,注意:getInstance()方法中需要有同步锁synchronized()修饰,防止多线程的进入导致instance被实例化多次。

单例模式分为两种(懒汉、饿汉)

懒汉模式如下:

Java面试经典题目六(网络知识及设计模式)_第1张图片

如此一来,优点:第一次调用才初始化,避免内存浪费。缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率(会导致线程等待)

改进方法:

将synchronized改成修饰代码块的方式。具体实现方式如下:

Java面试经典题目六(网络知识及设计模式)_第2张图片

饿汉模式:

Java面试经典题目六(网络知识及设计模式)_第3张图片

优点:没有加锁,执行效率会提高。

缺点:类加载时就初始化,浪费内存。

【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三次握手,四次挥手?

答:先看下基础知识,[详细参考和详细参考2]

三次握手过程:

Java面试经典题目六(网络知识及设计模式)_第4张图片

三次握手

简述过程如下:

(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之间可以开始传输数据了。

四次挥手过程:

Java面试经典题目六(网络知识及设计模式)_第5张图片

四次挥手过程

简述如下:

(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一般都会分开发送。

你可能感兴趣的:(Java面试经典题目六(网络知识及设计模式))