Java工程师笔试题
1.关于java的异常处理机制,以下说法正确的是(A)
- A.当某个线程抛出OutOfMemoryError时,其他线程有可能不受影响
- B.当大量抛出RuntimeException时,不会影响系统的吞吐量
- C.java.lang.Exception是java.lang.Error的父类
- D.finally块代码一定会被执行
解析
A.当一个线程抛出OOM异常后,它所占据的内存资源会被快速地释放掉,从而不会影响其它线程的运行
C.Exception 和Error 都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出或者捕获,它是异常处理机制的基本类型
D.执行完try…catch之后,一定会执行finally里的代码… 除了个别情况不会执行finally, 如下:
- 情况一: try-catch异常退出
try{
...
System.exit(1);
}finally{
打印("finally");
}
- 情况二: 无限循环
try{
while(true);
}finally{}
- 情况三: 线程被杀死
执行try,finally的线程被杀死时,finally也无法执行.
2.关于mysql,下面说法不正确的是:©
- A.mysql中的“utf8”类型最大只支持3个bytes
- B.desc关键字可以作为table的字段名
- C.filesort是通过读取磁盘文件进行排序,会极大降低查询性能
- D.smallint占用2个bytes的存储空间
解析
A.utf8不是真正的utf-8,utf8mb4才是真正的utf-8
utf-8每个字符最多支持四个字节,而utf8每个字符最多支持3个字节
C.filesort 并不是磁盘文件进行排序,只是进行了一个排序操作,但是查询次数过多确实会对性能造成影响
3.关于sleep()和wait(),以下描述错误的一项是(D )
- A.sleep是线程类(Thread)的方法,wait是Object类的方法;
- B.sleep不释放对象锁,wait放弃对象锁;
- C.sleep暂停线程、但监控状态仍然保持,结束后会自动恢复;
- D.wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态。
解析
D.wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入就绪状态。
4.下列协议中,将MAC地址转为IP地址的协议是(B)
- A.ARP(Address Resolution Protocol)地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议 IP到MAC
- B. RARP(Reverse Address Resolution Protocol)反向地址转换协议 MAC到IP
- C.ARQ 自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层的错误纠正协议之一
- D.ICMP (Internet Control Message Protocol)Internet控制报文协议
5.下列关于进程和线程的叙述中,正确的是__A_。
- 不管系统是否支持线程,进程都是资源分配的基本单位
- 线程是资源分配的基本单位,进程是调度的基本单位
- 系统级线程和用户级线程的切换都需要内核的支持
- 同一进程中的各个线程拥有各自不同的地址空间
解析
B.进程是资源分配的最小单位,线程是CPU调度的最小单位
C.进程切换需要内核转换,线程不需要
D.进程是系统分配资源的最小单位,使用独立的内存空间。线程是程序执行的最小单位,共享进程的内存空间
6.若某单处理器多进程系统中有多个就绪态进程,则下列关于处理机调度的叙述中,错误的是__C__。
- 在进程结束时能进行处理机调度
- 创建新进程后能进行处理机调度
- 在进程处于临界区时不能进行处理机调度
- 在系统调用完成并返回用户态时能进行处理机调
解析
C.进程处于临界区时只要不破坏临界资源就可以进行处理机调度
7.下列有关于关键字“堆”的描述中,错误的是 D
-
A.堆是优先级队列的底层实现形式,有N个元素的优先级队列进行一次结构调整的时间复杂度为logN
-
B.堆内存是一种动态分配的内存,其实际占用内存空间的大小随着程序的运行可以动态调整
-
C.堆栈是一种线性数据结构,其特点是先进后出
-
D.在C语言中,堆内存是线程隔离的,不同线程访问的是各自的堆空间,无法互相访问
解析
D.线程间通信,线程之间可以访问
8.关于TCP协议状态描述正确的是 A
-
A.只有执行主动关闭端才会出现TIME_WAIT
-
B.当接受到FIN报文时,会进入CLOSING状态
-
C.数据传输完成后发送FIN报文后进入TIME_WAIT状态
-
D.client和server端最终都会经历TIME_WAIT状态
解析
四次挥手
client 发送 FIN 给 server 进入 FIN_Wait1
server 接受client的FIN,发送ACK给client 进入close_wait,client接收到进入FIN_wait2
server 发送FIN给client 进入last_ack状态,client接收到进入time_wait状态
client 发送ACK给server,有2MSL的等待时间,保证连接的关闭,client进入close状态,server接收到进入close状态
client的状态:fin_wait1,fin_wait2,time_wait,close; server的状态:lock,close
9.关于epoll和select的区别,哪个说法是错误的?D
-
A.epoll和select都是I/O多路复用的技术,都可以实现同时监听多个I/O事件的状态。
-
B.epoll相比select效率更高,主要是基于其操作系统支持的I/O事件通知机制,而select是基于轮询机制。
-
C.epoll支持水平触发和边沿触发两种模式。
-
D.select能并行支持I/O比较小,且无法修改。
解析
select默认的句柄数量为1024,但可通过修改宏定义或编译内核修改句柄数量
10.已知一个线性表(38,25,74,63,52,48),假定采用散列函数h(key) = key%7计算散列地址,并散列存储在散列表A【0…6】中,若采用线性探测方法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为 C
- A. 1.5
- B. 1.7
- C. 2.0
- D. 2.3
解析
平均查找长度=总的查找次数/元素数
总的查找次数: 38%7=3 (第1次出现3,无冲突,放在位置3,查找次数为1)
25%7=4(第1次出现4,无冲突,放在位置4,查找次数为1)
74%7=4(第2次出现4,有冲突,放在位置5,查找次数为2)
63%7=0(第1次出现0,无冲突,放在位置0,查找次数为1)
52%7=3(第2次出现3,有冲突,发现冲突3,4,5,故只能放到6,查找次数为4)
48%7=6 (第1次出现6,有冲突,发现冲突6,0,故只能放到1,查找次数为3)
1+1+2+1+4+3=12
元素数=6
所以:平均查找长度=12/6=2
11.下面程序的运行结果:(B)
public static void main(String args[]) {
Thread t = new Thread() {
public void run() {
pong();
}
};
t.run();
System.out.print("ping");
}
static void pong() {
System.out.print("pong");
}
- A pingpong
- B pongping
- C pingpong和pongping都有可能
- D 无输出
解析
start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程,进而调用run()方法来执行任务,而单独的调用run()就跟调用普通方法是一样的,已经失去线程的特性了。因此在启动一个线程的时候一定要使用start()而不是run()。
12.指出下列程序运行的结果 (B)
public class Example {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };
public static void main(String args[]) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
}
public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'g';
}
}
- A、 good and abc
- B、 good and gbc
- C、 test ok and abc
- D、 test ok and gbc
解析
这个值指的是实参的地址的拷贝,得到这个拷贝地址后,你可以通过它修改这个地址的内容(引用不变),因为此时这个内容的地址和原地址是同一地址,但是你不能改变这个地址本身使其重新引用其它的对象,也就是值传递
13.下面是People和Child类的定义和构造方法,每个构造方法都输出编号。在执行new Child(“mike”)的时候都有哪些构造方法被顺序调用?请选择输出结果 (D )
class People {
String name;
public People() {
System.out.print(1);
}
public People(String name) {
System.out.print(2);
this.name = name;
}
}
class Child extends People {
People father;
public Child(String name) {
System.out.print(3);
this.name = name;
father = new People(name + ":F");
}
public Child() {
System.out.print(4);
}
}
- A、312
- B、32
- C、432
- D、132
解析
在Java中,子类的构造过程中必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来。但如果父类有多个构造函数时,该如何选择调用呢?
第一个规则:子类的构造过程中,必须调用其父类的构造方法。一个类,如果我们不写构造方法,那么编译器会帮我们加上一个默认的构造方法(就是没有参数的构造方法),但是如果你自己写了构造方法,那么编译器就不会给你添加了,所以有时候当你new一个子类对象的时候,肯定调用了子类的构造方法,但是如果在子类构造方法中我们并没有显示的调用基类的构造方法,如:super(); 这样就会调用父类没有参数的构造方法。
第二个规则:如果子类的构造方法中既没有显示的调用基类构造方法,而基类中又没有无参的构造方法,则编译出错,所以,通常我们需要显示的:super(参数列表),来调用父类有参数的构造函数,此时无参的构造函数就不会被调用。
总之,一句话:子类没有显示调用父类构造函数,不管子类构造函数是否带参数都默认调用父类无参的构造函数,若父类没有则编译出错。
14.请写出下面程序的运行结果
class HelloA {
static { System.out.println("static A"); }
{ System.out.println("I'm A class"); }
public HelloA() {
System.out.println("HelloA");
}
}
public class HelloB extends HelloA {
static { System.out.println("static B"); }
{ System.out.println("I'm B class"); }
public HelloB() {
System.out.println("HelloB");
}
public static void main(String[] args) {
new HelloB();
new HelloB();
}
}
static A
static B
I'm A class
HelloA
I'm B class
HelloB
I'm A class
HelloA
I'm B class
HelloB
解析 先执行static代码块,代码块,最后构造方法。先父类,后子类。
来源于网络,如有侵权,请私信删除