1.有关接口说法正确的是
- A. 接口中的数据成员为final static
- B. 接口中的数据成员为public abstract
- C. 接口同样存在构造方法
- D. 实现接口的类必须实现该接口的所有抽象方法
AD
C 接口是无法被实例化的,没有构造方法
D 如果是抽象类的话,就不需要。
2.下列程序的输出结果是
public class Test {
public static void main(String[] args) {
String [][]s={{"helloworld","hello world"},{"this is","a java program"}};
System.out.println((new StringTokenizer(s[1][1])).countTokens()>2);
}
}
- A. 3>2
- B. 2>2
- C. false
- D. true
D
3.使用折半查找算法对含有20个元素的有序表查找的平均查找长度
- A. 2.3
- B. 4.3
- C. 5.1
- D. 3
B
折半查找时间复杂度是 log2(n),所以 log2(20)=4.3
4.对含有31个元素的序列采用直接选择排序算法排序,在最坏情况下需要进行多少次移动才能完成排序
- A. 31
- B. 30
- C. 60
- D. 90
D
(n-1)次交换,3(n-1)次移动。一次交换,需要三次移动,因为交换需要借助辅助变量。
5.使用二分法在序列1,4,6,7,15,33,39,50,64,78,75,81,89,96中查找元素81时,需要经过( )次比较
- A. 4
- B. 3
- C. 2
- D. 12
B
编号:0-13,第一次查找编号6的,即39
39 -> 75 -> 89
6.已知存在8阶对称矩阵,采用压缩存储方式按行序为主序存储,每个元素占一个地址空间。若a22为元素的存储地址为1,每个元素占一个地址空间,则a74的地址为
- A. 11
- B. 23
- C. 32
- D. 33
B
(1,1)
(2,1) (2,2) 1
(3,1) (3,2) (3,3) 3
(4,1) (4,2) (4,3) (4,4) 4
(5,1) (5,2) (5,3) (5,4) (5,5) 5
(6,1) (6,2) (6,3) (6,4) (6,5) (6,6) 6
(7,1) (7,2) (7,3) (7,4) 41+3+4+5+6+4=23
7.已知主串S=“ababcabcacbab”,模式T=“abcac”。利用KMP算法进行匹配时,需要进行几次才可以匹配成功
- A. 3
- B. 4
- C. 5
- D. 6
A
关于 KMP算法 参考:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
首先计算部分匹配值:
abcac中:
a的前缀为0,后缀为0,前缀和后缀重合的部分为0
ab的前缀为a,后缀为b,前缀和后缀重合的部分为0
abc的前缀为[a,ab],后缀为[bc,c],前缀和后缀重合的部分为0
abca的前缀为[a,ab,abc],后缀为[bca,ca,a],前缀和后缀重合的部分为1
abcac的前缀为[a,ab,abc,abca],后缀为[bcac,cac,ac,c],前缀和后缀重合的部分为0
所以部分匹配值也就是 abcac 对应的next数组为:0 0 0 1 0
即:a b c a c
0 0 0 1 0
移动位数 = 已匹配的字符数 - 对应的部分匹配值
第一次 :
a b a b c a b c a c b a b
a b c a c
匹配个数为2,最后一个匹配的字符为 ‘b’,其next值是0 , 移动位数=2-0=2
第二次:
a b a b c a b c a c b a b
a b c a c
匹配个数为4,最后一个匹配的字符为 ‘a’,其next值是1, 移动位数=4-1=3
第三次:
a b a b c a b c a c b a b
a b c a c
匹配成功
共需要三次
8.广度优先遍历二叉树的操作可以用哪种数据结构模拟
- A. 栈
- B. 单链表
- C. 队列
- D. 数组
C
深度用栈,广度用队列
9.下列关于二叉排序树说法正确的是
- A. 二叉排序树的查找性能取决于二叉树的形状
- B. 二叉排序树的查找性能取决于序列的大小
- C. 二叉排序树复杂度介于 O(log2n) 和 O(n) 之间
- D. 对二叉排序树进行层序遍历可得到有序序列
AC
10.单C PU系统中通常采用两级处理器调度,以下相关描述正确的是
- A. 作业调度是从慢速存储设备中的后备队列中挑选作业加载到主存中。
- B. 作业调度是从慢速存储设备中的就绪队列中挑选作业加载到主存中。
- C. 进程调度是从主存中中的后备队列中挑选进程占用处理器运行。
- D. 进程调度是从主存中中的就绪队列中挑选进程占用处理器运行。
AD
11.一级封锁协议可以
- A. 能够避免不可重复读取问题
- B. 能够避免不读“脏”数据
- C. 不能避免不可重复读取和不读“脏”数据的问题
- D. 可避免更新丢失的问题
CD
12.当需要控制一个类的实例只能有一个,而且客户端只能从一个全局访问点访问它,应该选择何种设计模式:
- A. 观察者模式
- B. 单例模式
- C. 迭代器模式
- D. 享元模式
B
13.原型模式的本质是
- A. 根据状态来分离和选择行为
- B. 封装请求
- C. 克隆生成对象
- D. 触发联动
C
14.TCP协议的拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。常用的方法有
- A. 慢启动、窗口滑动
- B. 慢开始、拥塞控制
- C. 快重传、快恢复
- D. 快开始、快恢复
BC
15.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for(int i=0;i<100;i++){
list.add("a");
}
}
}
JDK1.8中,执行以上程序后,该list进行了几次扩容?
- A. 4
- B. 5
- C. 6
- D. 7
C
jdk 1.8,arrayList默认大小为10,每次扩容1.5倍。
int newCapacity = oldCapacity + (oldCapcity >> 1);
16.
public class Main {
public static void main(String[] args) {
System.out.print(fun1());
}
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";
}
}
执行以上程序后,输出结果正确的是
- A. ABCD
- B. ACDB
- C. ACBD
- D. 不确定
C
如果有finally和return,那就在return前进行finally。
本题代码,先执行fun2()方法,获取返回值后,会存到fun1()的局部变量表中,执行finally语句后,再返回这个值。
17.
public class Test {
public static void main(String[] args) throws Exception{
ClassLoader classLoader=ClassLoader.getSystemClassLoader();
Class clazz=classLoader.loadClass("A");
System.out.print("Test");
clazz.forName("A");
}
}
class A{
static {
System.out.print("A");
}
}
- A. TestA
- B. ATestA
- C. ATestA
- D. Test
A
Class clazz=classLoader.loadClass(“A”);
加载class文件到内存中,并没有对类进行首次主动使用,所以没有初始化。
clazz.forName(“A”);
通过反射获取到A的内存中的数据结构对象,对类进行了首次使用,才会触发初始化。
static 静态代码块只在初始化时候执行一次。
对类的主动使用:创建类实例、访问类或接口的静态变量、静态方法、反射、初始化类的子类、被标明为启动类的类
18.针对类的继承,虚拟机会如何进行父类和子类的初始化加载呢
public class Test {
public static void main(String[] args) {
System.out.print(B.c);
}
}
class A {
public static String c = "C";
static {
System.out.print("A");
}
}
class B extends A{
static {
System.out.print("B");
}
}
- A. AC
- B. ABC
- C. C
- D. BC
A
子类 B引用父类A的静态字段,不会导致子类初始化,只会引发父类初始化。
19.
public class Test {
public static void main(String[] args) {
System.out.print(B.c);
}
}
class A {
static {
System.out.print("A");
}
}
class B extends A{
static {
System.out.print("B");
}
public final static String c = "C";
}
- A. AB
- B. ABC
- C. C
- D. BC
C
常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用定义常量的类,因此不会触发定义常量的类的初始化。
静态域被访问,而且它不是常量,才触发初始化。
20.JAVA的类加载期负责整个生命周期内的class的初始化和加载工作,就虚拟机的规范来说,以下代码会输出什么结果
public class Test {
public static void main(String[] args) {
System.out.println(Test2.a);
}
}
class Test2{
public static final String a="JD";
static {
System.out.print("OK");
}
}
输出:JD
System.out.println(Test2.a); 用类名直接调用静态属性,没有用对象,就没加载对象中的static方法。
常量在编译阶段会存入调用类的常量池中,本质并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。
21.
public class Main {
private static int x = 10;
private static Integer y = 10;
public static void updateX(int value) {
value = 3 * value;
}
public static void updateY(Integer value) {
value = 3 * value;
}
public static void main(String[] args) {
updateX(x);
updateY(y);
}
}
执行以上程序后,x和y的值分别是多少
10,10
Java中只有值传递,没有引用传递
Integer是final定义的。
Integer 是引用类型,但是每次对Integer的赋值操作,都是创建一个新的对象,并且给变量赋上新的地址值。
22.
public class Main {
public static void main(String[] args) {
System.out.println("A");
new Main();
new Main();
}
public Main() {
System.out.println("B");
}
{
System.out.println("C");
}
static {
System.out.println("D");
}
}
输出结果:DACBCB
静态代码块(先父类后子类)-> 非静态代码块 -> 构造函数
23.以下哪种设备工作在数据链路层?
- A. 中继器
- B. 集线器
- C. 交换机
- D. 路由器
C
物理层:中继器、集线器
数据链路层:交换机
网络层:路由器
24.一颗二叉树的叶子节点有5个,出度为1的结点有3个,该二叉树的结点总个数是
12
度数为0的节点数量 = 度数为2的节点数量 + 1
本题中:5 = x + 1 可得度数为2节点数量:x=4。
所以这颗二叉树的总节点为:5+3+4=12
25.下面linux命令中,可以用来检查内存使用状况的有
- A. sed
- B. free
- C. top
- D. iostat
BC
free 查看内存使用情况。 free -m 以M为单位显示
top 动态命令,查看进程和内存的动态情况。如果此时输入M,按进程使用内存大小排序。如果输入P,按照进程占用CPU的大小排序。
26.下列关于JVM性能调优工具的描述,错误的是
- A. jps主要是用来输出JVM中运行的进程状态信息
- B. jmap是用来查看堆栈内存使用状况
- C. jstack主要是用来查看某个Java进程内的线程堆栈信息
- D. jstat是JVM统计监测工具
C
jps:主要用来输出JVM中运行的进程状态信息
jmap:用来查看堆内存使用状况,一般结合jhat使用
jstack:堆栈跟踪工具,主要用来查看某个Java进程内的线程堆栈信息
jstat :JVM统计监测工具,查看各个内存和GC的情况
hprof:展现CPU使用率,统计堆内存使用情况
27.某系统中有4个并发进程,多需要同类资源5个,试问该系统无论怎样都不会发生死锁的最少资源数是
17
4*(5-1) + 1
28.
public class Person{
{
System.out.println("P1");
}
static{
System.out.println("P2");
}
public Person(){
System.out.println("P3");
}
}
public class Students extends Person{
static{
System.out.println("S1");
}
{
System.out.println("S2");
}
public Students(){
System.out.println("S3");
}
public static void main(String[] args){
new Students();
}
}
P2S1P1P3S2S3
执行顺序:父类静态代码块 -> 子类静态代码块 -> 父类代码块 -> 父类构造方法 -> 子类代码块 ->子类构造方法
首先 当JVM遇到new Students() 时,会去加载Student类,加载Student类之前要去加载父类Person,加载过程中会初始化变量和去初始化static的东西,所以先父类静态代码块后子类静态代码块,类加载完成后,就需要在内存里创建对象了,创建Student对象需要创建父类People,创建People类对象先执行代码块再执行构造器,父类执行完后执行子类的代码块和构造器。
29.
public class Test {
public static void main(String[] args) {
Test t = new Test();
t.method(null);
}
public void method(Object o) {
System.out.println("Object");
}
public void method(String s) {
System.out.println("String");
}
}
输出结果:String
Object 和 String 值都可以为null。但存在继承关系,因此会将不确定对象null当作子类型处理。
最精准原则String比Object精确,因为一个String本质也是一个Object,但不是每个Object都可以是String的
30.
public class Arraytest {
int a[] = new int[6];
public static void main (String arg[]) {
System.out.println(a[0]);
}
}
编译时出错
a数组不是静态类型,不能在静态的main方法中直接使用