Java工程师笔试题001

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代码块,代码块,最后构造方法。先父类,后子类。

来源于网络,如有侵权,请私信删除

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值