选择题(不定项)
1.进行数据库提交操作时使用事务(Transaction)是为了?(B)
A.提高效率
B.保证数据一致性
C.网络安全
D.归档数据文件
解析:事务是一组数据库操作集合,要么同时成功要么同时失败,具有原子性,一致性,隔离性,持久性ACID。事务的特点是保证数据的一致性和完整性 所以选b
2.关于编译原理,以下文法中,是自顶向下分析的文法是哪几个?(E)
A.LR(0)
B.SLR(1)
C.LALR(1)
D.LR(1)
E.LL(1)
解析:LL(1)自顶向下的文法分析
3.以下协议属于网络协议中的应用层的是(BC)
A.IP
B.HTTP
C.FTP
D.UDP
解析:
数据链路层协议:PPP ARP MAC IEEE802.3
网络层协议:IP BGMP
传输层协议:TCP UDP
应用层协议:HTTP HTTPS FTP Telnet SMTP
4.以下选项属于进程间通信的是(ABD)
A.管道
B.套接字
C.内存
D.消息队列
解析:进程中的几种通信方式:
1)管道:管道是一种半双工的通信方式,数据只能单向流动。而且只能在具有血缘关系(父子进程之间)的的进程间使用。
2)信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问
3)消息队列:消息队列是由消息组成的链表,存放在内核中,并由消息队列标识符标识
4)信号:信号是有一种比较复杂的通信方式,用于通知接收进程某一事件已经发生
5)共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问
6)套接字:即Socket,是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行
5.下面有关JVM内存,说法错误的是(C)
A.程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
B.虚拟机栈描述的是Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
C.方法区用于存储JVM加载的类信息、常量、静态变量、以及编译器编译后的代码等数据,是线程隔离的
D.原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的
解析:JVM 内存模型图
方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息
填空题:
1.设哈希表长m=14,哈希函数H(key)=key%11。表中已有4个结点:addr(15)=4,addr(38)=5,addr(61)=6,addr(84)=7,其余地址为空。如果用二次探测再散列处理冲突,关键字为49的结点的地址是 9
解析:
对于处理冲突数据结构书(C语言版)上有一个公式:
Hi = ( H (key) + di ) MOD m
其中i=1,2,3,…k(k<=m-1)、H(key)为哈希函数、m为哈希表表长;di为增量序列。
当di=1,2,3,…m-1,称为线性探测再散列;
当di=(正负)K^2(K=1,2,3,…m/2)称为二次探测再散列(先正后负)
题目中哈希表长为14,所以代入后应该是这样的:
H1=(5+1)%14=6 冲突
H1=(5-1)%14=4 冲突
H2=(5+4)%14=9 无冲突
所以结果为9
2.X=+0111001,Y=+1001101,求[X-Y]的补等于 11101100
解析:
[X] = 00111001 [Y] = 01001101
[X-Y]补 = [X]补 + [-Y]补
[-Y]补 = Y各位取反+1 = 10110011
[X]补 00111001
[-Y]补 + 10110011
得 11101100
3.-125的反码是多少 10000010
解析:
125的二进制为 1111101 其对应的反码(1->0,0->1)为 0000010,所以-125的反码为: 10000010 (负数符号位上为1,即第8位)
4.以数据集{1,6,8,2,9,4}为权值构造一棵赫夫曼树,其带权路径长度为 70
== 解析:构造后的赫夫曼树如下==
30
13 17
6 7 8 9 --------2
3 4 --------3
1 2 ------- 4
所以带权路径长度 length = (6 + 8 + 9) * 2 + 4 * 3 + (1 + 2) * 4
5.有K层的二叉树至多有 2^k-1 个节点
6.程序main( ){ char c=040; printf(“%o\n",c<<1); }的运行结果是 100
解析:
X=040,前缀0代表八进制,转化为二进制为100 000,x<<1,左移一位,即1000 000。%o表示输出无符号八进制,再将其转化为八进制,为100
7.一颗完全二叉树的节点数量为666,那么这棵树上的叶子节点数为 333
解析:
设这个完全二叉树有K层,前K-1层有29-1=511个节点,最后一层有666-511=155个全是叶子节点;倒数第二层有28=256个节点,其中155/2=77个有两个孩子,第78个有一个孩子,剩256-78=178个叶子节点;155+178=333
简答题
1.简述springMVC的运作流程。
1. 客户端通过url发送请求
2. 核心控制器Dispatcher Servlet接收到请求,通过系统或自定义的映射器配置找到对应的handler,并将url映射的控制器controller返回给核心控制器。
3. 通过核心控制器找到系统或默认的适配器
4. 由找到的适配器,调用实现对应接口的处理器,并将结果返回给适配器,结果中包含数据模型和视图对象,再由适配器返回给核心控制器
5. 核心控制器将获取的数据和视图结合的对象传递给视图解析器,获取解析得到的结果,并由视图解析器响应给核心控制器
6. 核心控制器将结果返回给客户端
2.Activiti和Shiro的作用
Shiro:
用户认证 登录 拦截器
资源授权 资源表示系统中所有的可访问的菜单
Activiti:
解决多个任务人共同完成复杂的业务流。 他是一个业务框架
3.微服务的概念有哪些。比较两种服务的区别
微服务概念:
微服务是一种架构方式,最终肯定需要技术架构去实施。
微服务的实现方式很多,但是最火的莫过于Spring Cloud了。为什么?
后台硬:作为Spring家族的一员,有整个Spring全家桶靠山,背景十分强大。
技术强:Spring作为Java领域的前辈,可以说是功力深厚。有强力的技术团队支撑,一般人还真比不了。
群众基础好:可以说大多数程序员的成长都伴随着Spring框架, 现在有几家公司开发不用Spring?SpringCloud与Spring的各个框架无缝整合,对大家来说一切都是熟悉的配方,熟悉的味道。
使用方便:相信大家都体会到了SpringBoot给我们开发带来的便利,而SpringCloud完全支持SpringBoot的开发,用很少的配置就能完成微服务框架的搭建。
Springcloud和Dubbo对比
-
SpringCloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大。
-
dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决。
-
springcloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级。
-
dubbo的注册中心可以选择zk,redis等多种,springcloud的注册中心只能用eureka或者自研。
-
SpringCloud全家桶:社区支持强大,更新非常快,所以开发效率高。
-
Dubbo确实类似于Spring Cloud的一个子集,Dubbo功能和文档完善,在国内有很多的成熟用户,然而鉴于Dubbo的社区现状(曾经长期停止维护,2017年7月31日团队又宣布重点维护),使用起来还是有一定的门槛。
编程题:
1.组成数字1到1234的所有数字的各位的总和是多少。
public class Text {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 1234; i++) {
int temp = i;
while (temp != 0){
sum += (temp%10); temp /= 10; }
}
System.out.println(sum);
}
}
2.有一段楼梯台阶有100级台阶,以小明的脚力第n步能跨n级,请问小明登上这段楼梯需要多少步。
public static void main(String[] args) {
int num=100;
int count=0;
while(count>=0) {
count++;
num=num-count;
if(num<=0) {
System.out.println(count);
return;
}
}
}
3.有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱(n<10000),有多少中组合可以组成n分钱?
public class myText {
int count = 0;
int[] arr;
public int calculateWays(int n) {
arr = new int[n + 1];
return calculateWays1(n);
}
//记忆化搜索递归
private int calculateWays1(int n) {
if (n < 0)
throw new IllegalArgumentException("input wrong");
if (n == 0)
return 0;
if (n == 1)
return 1;
if (n == 2 || n == 3)
return 2;
if (n == 4 || n == 5 || n == 6 || n == 7 || n == 8 ||n == 9)
return n - 1;
if (n == 10)
return 11;
if (arr[n] != 0)
return arr[n];
int res = 0;
res = Math.max(Math.max(calculateWays1(n - 1) + 1, calculateWays1(n - 2) + 2), Math.max(calculateWays1(n - 5) + 4, calculateWays1(n - 10) + 11));
arr[n] = res;
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入钱数:");
int n = sc.nextInt();
myText s = new myText ();
int sum = s.calculateWays(n);
System.out.println(sum);
}
}