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

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

作者: chansonpro | 来源:发表于2017-12-27 17:05 被阅读22次

    设计模式(必知必会)

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

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

    三次握手过程:

    三次握手

    简述过程如下:

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/jjgugxtx.html