美文网首页
牛客网面经积累(二)

牛客网面经积累(二)

作者: _Kantin | 来源:发表于2017-08-18 09:05 被阅读102次

    1.Java方法调用过程主要经历了以下的过程

    (1)编译器查看对象变量的声明类型和方法名,通过声明类型找到方法列表。
    例如,Parent p = new Child()对象的声明类型是Parent类对象,实际类型是Child类对象,找Parent类的方法表。如果在Child类定义了新的方法,而不是重载Parent类的方法,那么这个新方法对于p而言是不可见的,详见下面向上转型后,子类的特有方法将失效。
    (2)编译器查看调用方法时提供的参数类型
    (3)如果方法由private,static和final修饰或者是构造器,编译器就可以确定调用那一种方法,即采取静态绑定技术。如果不是上述情况,就采用动态绑定技术,执行后续过程。
    (4)虚拟机提取对象变量的实际类型的方法。例如下面的p.get()调用的是Child类中的get方法。
    (5)虚拟机搜索方法签名
    (6)调用方法

    2. Lucene的实现原理

    Lucene 是一个高效的,基于Java 的全文检索库。
    我们生活中的数据总体分为两种:结构化数据 和非结构化数据 。
    ★结构化数据: 指具有固定格式或有限长度的数据,如数据库,元数据等。
    ★非结构化数据: 指不定长或无固定格式的数据,如邮件,word文档等。

    当然有的地方还会提到第三种,半结构化数据,如XML,HTML等,当根据需要可按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。

    3.如何实现一个不可变类

    String类就是个不可变类,它的对象一旦创建之后,值就不能被改变了。
    ★将类声明为final,所以它不能被继承
    ★将所有的成员声明为私有的,这样就不允许直接访问这些成员
    ★对变量不要提供setter方法
    ★将所有可变的成员声明为final,这样只能对它们赋值一次
    ★通过构造器初始化所有成员,进行深拷贝(deep copy)
    ★在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝

    4.https和http有什么区别

    超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,不适合对敏感数据进行加密。HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

    5.servlet中的过滤器的使用

    在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
    根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
    在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
    根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
    ★先在web.xml中写filter的配置文件,之后编写过滤器类,类中的方法如下所示:
    ★init() Init 方法在 Filter 生命周期中仅执行一次,web 容器在调用 init 方法时
    ★destory() 在Web容器卸载 Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
    ★doFilter() Filter 链的执行

    6.死锁的四个必要条件

    (1) 互斥条件:一个资源每次只能被一个进程使用。
    (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
    (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
    (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

    7.ThreadLocal如何保证线程安全

    ThreadLocal本身并没有承担存储每个线程中的数据的职责,它是通过操作每个线程内部的一个“副本”-ThreadLocalMap来实现线程之间的隔离,从而保证了线程安全。ThreadLocal源码类有一个Map,可以通过get和set对map进行设置,每次都能取到新的map,不同的线程得到的就是不同的ThreadLocalMap,那么向其中保存值或者修改值都只是会影响到当前线程,这样就保证了线程安全。

    8.TCP为什么是四次挥手,其中TIME_WAIT和CLOSE_WAIT这两个阶段。

    TIME_WAIT阶段要等待2个MSL时间才关闭,因为网络原因可能要重发。CLOSE_WAIT是要等待自己(通常是服务器)把自己传输东西发送完了。

    9.知道线程的中断吗?

    线程的Interrupt中断,其实只是修改线程的中断位,并不会真正停止线程。(1)可以通过Thread的类方法interrupted检查当前线程是否中断,但是会重置标志位(2)通过调用Thread的普通方法isInterrupted来检查中断位,不会重置标志位。

    10.TCP三次握手四次挥手

    所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。

    clipboard.png

    TCP 四次挥手
    TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

    clipboard.png

    相关文章

      网友评论

          本文标题:牛客网面经积累(二)

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