顺丰2019秋招Java客观题总结

二叉排序树

二叉排序数的(递归)定义:
1、若左子树非空,则左子树所有节点的值均小于它的根节点;
2、若右子树非空,则右子树所有节点的值均大于于它的根节点;
3、左右子树也分别为二叉排序树。

排序算法

快排不适合对基本有序的数据集合进行排序,快排越是无序效率越高。基本有序是O(n2),归并是 nlogn,直接是 n
堆排序、选择排序、冒泡排序、快速排序、的时间复杂度为:nlogn、n2、n2、nlogn

递归题目

#include<stido.h>
 int foo(int a ,int b)
 {
     if (b == 0) return 0;
     if (b %2 == 0) return foo(a+a,b/2);
     return foo(a+a,b/2)+a;    
 }
 void main()
 { 
   printf("%d"foo(1,3));
 }

计算foo(1,3):此时a=1,b=3;
跳过两个if语句进入return foo(1+1,3/2)+1,即foo(2,1)+1;
计算foo(2,1):
同样,跳过两个if语句进入return foo(2+2,1/2)+2,即foo(4,0)+2;
计算foo(4,0):
进入第一个if语句,return 0;
逐层返回,得foo(2,1)=0+2=2;
再返回上一层,得foo(1,3)=2+1=3;
返回结果,foo(1,3)=3;

计算机网络

总部给某分公司分配的网络地址是172.16.2.0/24,该分公司有三个部门,每个部门计算机不多于30台,在网络配置时,进行子网划分,可以使用的子网掩码是()
答案:255.255.255.192或255.255.255.224

1.分公司的网络地址是172.16.2.0/24,子网掩码长度就是24位11111111.11111111.11111111.00000000(这个就不要问为什么了);
2.分公司3个部门,那么就用第25位和第26位来区分三个部门,11111111.11111111.11111111.00000000(00~11),直接排除A;
3.那么各个部门用来区分自己的子网掩码只剩下最后6位(27~32位)来表示了;
4.若用255.255.255.192,最后8位是11000000,只能表示11000000~11111111除去广播地址一共62台
5.若用255.255.255.224,最后8位是11100000,只能表示11100000~11111111除去广播地址一共30台
6.若用255.255.255.240,最后8位是11110000,只能表示11110000~11111111除去广播地址一共14台

TCP数据传输慢,UDP数据传输快,UDP缓冲区小于报文长度,则会丢失报文.DNS默认占用端口53

SQL

SELECT INTO 和 INSERT INTO SELECT

范式

数据库中删除约束的方法:

  1. sql server中删除约束的语句是:
    alter table 表名 drop constraint 约束名
    sp_helpconstraint 表名 找到数据表中的所有列的约束
  2. oracle中删除约束的语句:
    先找到表的约束名称,执行:
    select * from user_constraints; 其中 CONSTRAINT_NAME 为表的约束名称
    然后删除约束:
    alter table 表名 drop constraint 约束名 cascade;
  3. mysql中删除约束的语句是:
    1)删除主键约束:
    alter table 表名 drop primary key;
    2)删除外键约束:alter table 表名 drop foreign key 外键(区分大小写);

数据库3级模式:
①模式(schema):
模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
②外模式(external schema):
外模式也称子模式(subschema)或用户模式,它是数据库用固话(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
③内模式(internal schema):
内模式也称存储模式(storage schema),一个数据库只有一个内模式。它是数据物理存储和存储方式的描述,是数据在数据库内部的组织方式。

Spring

单例模式下会共享普通成员变量和静态成员变量,多例模式下普通成员变量不共享,静态成员共享.
在开发中,springMVC优先使用单例模式,而且尽量不要在controller中设定成员变量.
如果要定义成员变量并为成员变量赋值可以配置source.properties,通过读取配置文件为成员变量初始化.
@Scope(“prototype”)表示每获取一个bean创建一个对象。这虽然看起来是多例。但成员变量并不共享。
要想成员变量共享,可设置为“session”或“globalSession”

在这里插入图片描述

JVM

off-heap叫做堆外内存,将你的对象从堆中脱离出来序列化,然后存储在一大块内存中,这就像它存储到磁盘上一样,但它仍然在RAM中。对象在这种状态下不能直接使用,它们必须首先反序列化,也不受垃圾收集。序列化和反序列化将会影响部分性能(所以可以考虑使用FST-serialization)使用堆外内存能够降低GC导致的暂停。堆外内存不受垃圾收集器管理,也不属于老年代,新生代。

JVM

集合问题

就这么说吧,对于集合的三种遍历方式删除:
1.普通for循环:可以删除
注意每次删除之后索引要–
2.Iterator遍历:可以删除
不过要使用Iterator类中的remove方法,如果用List中的remove方法会报错
3.增强for循环foreach:不能删除
强制用List中的remove方法会报错

ArrayList内部是动态数组实现,在增加空间时会复制全部数据到新的容量大一些的数组中。而LinkedList内部为双向链表,可以按需分配空间,扩展容量简单,因此LinkedList用时少。

java类加载机制

运行结果为:C A B D 1

public class ClassA {
    static int count = 0;
    static {
        count++;
        System.out.println("A");
    }
    public ClassA() {
        System.out.println("B");
    }
}
public class ClassB {
    static {
        ClassA t2;
        System.out.println("C");
    }
    public static void main(String[] args) {
        Class c1;
        Class c2;
        Class c3;
        try {
            c1 = ClassA.class;
            c2 = Class.forName("ClassA");
            ClassA a = new ClassA();  
            c3 = a.getClass();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return;
        }
        if (c2 == c1&& c1 == c3) {
            System.out.println("D");
        } else {
            System.out.println("E");
        }
        System.out.println(ClassA.count);
    }
}

解析:
1.被标明为启动类的类(即包含main()方法的类)要初始化,所以ClassB最先初始化
2.ClassB没有父类,所以初始化自身的静态变量和静态块赋值(按照声明顺序),输出“C”
3.ClassA a = new ClassA(); 初始化ClassA,输出“AB”
4.因为类的加载信息只会在永久代里留存一份,所以c1,c2,c3实际上共用同一个ClassA.class对象,所以输出“D”
5.静态块static{}只会执行一次,所以count=1
在这里插入图片描述

杂项

  • 调用函数时,入参及返回地址使用了栈
  • 32位处理器是指处理器的数据总线是32位的

设计模式

单一职责原则:应该有且仅有一个原因引起类的变更(一个接口或一个类只有一个原则,它就只负责一件事)
里式替换原则:子类型必须能替换掉它们的基类型
依赖倒置原则:
高层模块不应该依赖低层模块,两者都应该依赖其抽象
抽象不应该依赖细节
细节应该依赖抽象
接口隔离原则:
客户端不应该依赖它不需要的接口
类间的依赖关系应该建立在最小的接口上
迪米特法则:只与直接朋友进行通信

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值