京东模拟笔试题2019纠错

1、下列有关 增量模型描述正确的是:

  • 增量模型:把待开发的软件系统模块化,将每个模块作为一个增量组件,从而分批次地分析、设计、编码和测试这些增量组件。使用增量模型时,第一个增量构件往往实现软件的基本需求,提供最核心的功能。
  • 瀑布模型:将软件的生命周期划分为制定计划、需求分析、软件设计、编码、测试、维护6个阶段,按次序完成。
  • 快速原型模型:是增量模型的另一种形式,在开发真实系统之前,迅速建造一个可以运行的软件原型 ,以便理解和澄清问题,在该原型的基础上,逐渐完成整个系统的开发工作
  • 螺旋模型:是一种演化软件开发过程模型,它兼顾了快速原型的迭代特征以及瀑布模型的系统化与严格监控。螺旋模型最大的特点在于引入了其他模型不具备的风险分析,使软件在无法排除重大风险时有机会停止,以减小损失。同时,在每个迭代阶段构建原型是螺旋模型用以减小风险的途径

2、如何在多线程中避免发生死锁?

Ⅰ、什么是死锁:
   答:在并发环境下,各进程因竞争资源导致互相等待对方手里的资源而造成的阻塞现象。
Ⅱ、死锁产生的四个条件:
    ①、互斥
    ②、不可剥夺
    ③、请求和保持:保持了一个资源不是放,然后又请求其他进程持有的资源。
    ④、循环等待
Ⅲ、什么时候发生死锁:
    ①、对系统资源竞争的时候
    ②、进程非法推进的时候
    ③、信号量使用不合理的时候
Ⅳ、死锁的处理策略:
    ①、预防死锁(破坏死锁产生的条件)
    ②、避免死锁(银行家算法)
    ③、死锁检查和解除

3、权值分别为9、3、2、8的结点,构造一棵哈夫曼树,该树的带权路径长度是?

树的带权路径长度的概念:结点的带权路径长度为从根结点到该叶子结点之间的路径长度与该结点的权的乘积之和。
画出哈夫曼树后:1 * 9 + 8 * 2 + 3 * 3 + 2 * 3 = 40

4、已知小顶堆:{51,32,73,23,42,62,99,14,24,39,43,58,65,80,120},请问62对应节点的左子节点是

73

5、后退N帧协议的发送窗口大小是(),接收窗口的大小是()?

①、滑动窗口协议结构(发> 1; 收 > 1):窗口内分为允许发送和已发送的,窗口左边是已经确认的,右边的不允许发送的数据。
②、停止等待协议(发 = 1;收 = 1):当发送窗口和接收窗口都是1的时候,滑动窗口协议就退化成停止等待协议。该协议规定:每发送一帧后就要停下来,等待接收方已正确接收确认并返回后才能继续下一帧的发送。并开启计时器,如果超时就重传。在次过程一直等待。
③、后退N帧协议(发 > n;收 = 1):由于停止等待协议要为每一帧确认后才能继续发送下一帧,降低了信道利用率,提出了后退N帧协议。主要思想就是,发送端没有收到确认报也可以继续发送,等计时器超时了,那从出错开始后面发送的数据包都得重发。
④、选择重传(发 > n;收 > n):改进后退N帧协议,没有收到确认也可以继续发送,在接收方把数据包缓冲下来,把出错的帧丢弃,然后发送一个NAK非确认帧,那发送端就只发送这个出错或丢失的帧,接收方收到后在和之前缓存下来的帧一并交给上层。

6、TCP释放连接第二次挥手时ACK(),第三次挥手时ACK()?

记忆:三次握手,四次挥手的状态和报文细节
三次握手的状态
	握手之前,服务端主动开启监听,进入监听状态(listen)
	①、第一次握手:客户端发送完建立连接同步请求(SYN = 1; seq = x)后进入**SYN-SENT**状态。
	②、第二次握手:服务端收到连接请求后,发送确认报文(SYN = 1; ACK = 1; seq = y; ack = x + 1)后进入SYN-RCVD状态(已接收状态)
	③、第三次握手:客户端收到同意连接确认报文后,又发送一个确认报文的确认报文(ACK = 1; seq = x + 1; ack = y + 1)然后客户端进入了ESTABLISHED状态(已建立连接状态)
	最后服务器端收到确认后也进入ESTABLISHED状态(已建立连接状态)。
四次挥手的状态:
	挥手之前双方都是ESTABLISHED状态
	①、第一次挥手:客户端主动放弃连接,发送断开请求报文(FIN = 1; seq = u),然后客户端进入了**终止等待1的状态**(FIN-WAIT-1状态)
	②、第二次挥手:服务器端收到断开请求报文后回复一个确认报文通知自己已经知道了(ACK = 1; seq = v; ack = u + 1),然后服务器端进入的**关闭等待状态**(CLOSE-	WAIT状态);客户端收到后,进入终止等待2状态(FIN-WAIT2状态)
	③、第三次挥手:服务器端在发送完自己要发送的数据后,然后主动发送断开连接请求报文(FIN = 1; ACK = 1, seq = w, ack = u + 1),后进入了**最后确认状态**(LAST-ACK状态)
	④、第四次挥手:客户端收到第三次挥手的报文后发送确认报文(ACK = 1; seq = u  + 1; ack = w + 1)后进入 时间等待状态(TIME-WAIT状态)
	最后:客户端等待2MSL时间后,自动进入关闭状态,服务端收到确认报文后也进入了**关闭状态**(CLOSED状态)

7、 DELETE和TRUNCATE TABLE都是删除表中的数据的语句,它们的不同之处描述正确的是:

(正确)RUNCATE TABLE比DELETE的速度快
(正确)在删除时如果遇到任何一行违反约束(主要是外键约束),TRUNCATE TABLE仍然删除,只是表的结构及其列、约束、索引等保持不变,但DELETE是直接返回错误
(正确)对于被外键约束的表,不能使用TRUNCATE TABLE,而应该使用不带WHERE语句的DELETE语句。
(正确)如果想保留标识计数值,要用DELETE,因为TRUNCATE TABLE会对新行标志符列使用的计数值重置为该列的种子

8、设计模式

- 备忘录模式:适用于恢复某个类的先前状态,有点类似于快照这类型功能。
- 原型模式:通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点。
- 状态模式:当一个对象,它具有很多种状态的,需要进行繁琐复杂的逻辑处理时,我们可以利用状态模式,将对象的各种状态进行类的封装,用于避免if else过于繁琐的情况。
- 命令模式:是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

9、类加载各种变量常量的加载顺序和是否被加载总结

京东模拟笔试题2019纠错_第1张图片
参考:https://www.cnblogs.com/hgnulb/p/10298650.html

情况一:变量是 static final 修饰的“编译期常量”,如 public static final String a = “JD”;

public class Test {

    public static void main(String[] args) {
        System.out.println(Test2.a);
    }

}
class Test2{
	//静态常量,在编译期就已经有值了,所以不会触发类加载,更不用说初始化的时候输出static{}中的内容了。
    public static final String a="JD";

    static {
        System.out.print("OK");
    }

}

情况二:变量是 static final 修饰的“非编译期常量”,如 public static final String a = new String(“JD”);

public class Test {

    public static void main(String[] args) {
        System.out.println(Test2.a);
    }

}
class Test2{
	//碰到了new关键字
    public static final String a=new String("JD");

    static {
        System.out.print("OK");
    }

}

遇到new、getstatic、putstatic或invokestatic 这四条字节码指令时,如果类型没有进行过初始化,则需要先触发其初始化阶段。能够生成这四条指令的典型Java代码场景有:
- 使用new关键字实例化对象的时候。
- 读取或设置一个类型的静态字段(被final修饰、已经在编译期把结果放入常量池的静态字段除外)的时候。
- 调用一个类型的静态方法的时候。
参考《深入理解Java虚拟机》263页触发类进行“初始化”的六种情况:

10、ClassLoader.loadClass()与Class.forName()的区别:

不同点:
- 使用ClassLoader.loadClass()获取类对象的时候是不对类进行初始化的。
- 使用Class.forName()获取类对象的时候是会对类进行初始的。

11、try{ return fun();} finally{}

先执行try中的代码,如果try中return 调用了函数或者表达式,会先执行,然后再执行finally中的代码,最后才把结果返回。

public class Main {

    public static void main(String[] args) {
        System.out.print(fun1());//第四步输出D
    }

    public static String fun1() {
        try {
            System.out.print("A"); //第一步
            return fun2();//先执行函数
        } finally {
            System.out.print("B");//第三步
        }
    }

    public static String fun2() {
        System.out.print("C");//第二步
        return "D";//返回后,保存结果,先执行finally中的代码
        //如果finally中有return则直接返回结果,不再执行try的return了
    }
}

你可能感兴趣的:(面经笔试,面试)