2018-2-24 牛客试题复盘

1、使用mvc模式设计的web应用程序具有以下优点,除了? D

A、可维护行强
B、可扩展性强
C、代码重复少
D、大大减少代码量

2、关于依赖注入,下列选项中说法错误的是(B)

A、依赖注入能够独立开发各组件,然后根据组件间关系进行组装
B、依赖注入使组件之间相互依赖,相互制约
C、依赖注入提供使用接口编程
D、依赖注入指对象在使用时动态注入

解析:

依赖注入的动机就是减少组件之间的耦合度,使开发更为简洁。

3、下列说法正确的是( C)

A、volatile,synchronized 都可以修改变量,方法以及代码块
B、volatile,synchronized 在多线程中都会存在阻塞问题
C、volatile能保证数据的可见性,但不能完全保证数据的原子性,synchronized即保证了数据的可见性也保证了原子性
D、volatile解决的是变量在多个线程之间的可见性、原子性,而sychroized解决的是多个线程之间访问资源的同步性

解析:

synchronized关键字和volatile关键字比较:

  • volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使用 synchronized 关键字的场景还是更多一些。
  • 多线程访问volatile关键字不会发生阻塞,而synchronized关键字可能会发生阻塞
  • volatile关键字能保证数据的可见性,但不能保证数据的原子性。synchronized关键字两者都能保证。
  • volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized关键字解决的是多个线程之间访问资源的同步性。

4、volatile关键字的说法错误的是  A

A、能保证线程安全
B、volatile关键字用在多线程同步中,可保证读取的可见性
C、JVM保证从主内存加载到线程工作内存的值是最新的
D、volatile能禁止进行指令重排序

解析:

出于运行速率的考虑,java编译器会把经常经常访问的变量放到缓存(严格讲应该是工作内存)中,读取变量则从缓存中读。但是在多线程编程中,内存中的值和缓存中的值可能会出现不一致。volatile用于限定变量只能从内存中读取,保证对所有线程而言,值都是一致的。但是volatile不能保证原子性,也就不能保证线程安全。

5、以下JAVA程序代码的输出是 B

public static void main(String args[]) {
System.out.println( 14 ^ 3 );
}
 
A、2744
B、13
C、17
D、11

解析:

^表示异或 就是相同是0 不同是1
14是1110
3是0011
所以14^3=1101,即13
 
 
 
6、下列在Java语言中关于数据类型和包装类的说法,正确的是(B)
A、基本(简单)数据类型是包装类的简写形式,可以用包装类替代基本(简单)数据类型
B、long和double都占了64位(64bit)的存储空间。
C、默认的整数数据类型是int,默认的浮点数据类型是float。
D、和包装类一样,基本(简单)数据类型声明的变量中也具有静态方法,用来完成进制转化等。

7、变量a是一个64位有符号的整数,初始值用16进制表示为:0x7FFFFFFFFFFFFFFF;变量b是一个64位有符号的整数,初始值用16进制表示为:0x8000000000000000。则a+b的结果用10进制表示为多少?  B

A、1
B、-1
C、2^63+2^62+…+2^2+2^1+2^0
D、–(2^63+2^62+…+2^2+2^1+2^0)

解析:

0x7FFFFFFFFFFFFFFF +  0x8000000000000000 =  0xFFFFFFFFFFFFFFFF 转为源码 = -1

8、下面有关java object默认的基本方法,说法错误的是?  B

A、equals(Object obj) 指示某个其他对象是否与此对象“相等”
B、copy() 创建并返回此对象的一个副本
C、wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法
D、toString() 返回该对象的字符串表示

解析:

Object中没有copy方法。

9、关于下面一段代码,以下说法正确的是: (ACD)

public class Test {
     private synchronized void a() {
     }
     private void b() {
         synchronized ( this ) {
         }
     }
     private synchronized static void c() {
     }
     private void d() {
         synchronized (Test. class ) {
         }
     }
}

 

A、同一个对象,分别调用方法a和b,锁住的是同一个对象
B、同一个对象,分别调用方法a和c,锁住的是同一个对象
C、同一个对象,分别调用方法b和c,锁住的不是同一个对象
D、同一个对象,分别调用方法a、b、c,锁住的不是同一个对象

解析:

修饰非静态方法 锁的是this 对象

修饰静态方法 锁的是class对象

10、下列哪些方法是针对循环优化进行的  ABD 

A、强度削弱
B、删除归纳变量
C、删除多余运算
D、代码外提

11、transient 变量和下面哪一项有关?    B

A、Cloneable
B、Serializable
C、Runnable
D、Comparable

解析:

和序列化有关,这是一个空接口,起标记作用,具体的序列化由ObjectOutputStream和ObjectInputStream完成。transient修饰的变量不能被序列化,static变量不管加没加transient都不可以被序列化。

12、下面哪种情况会导致持久区jvm堆内存溢出?C 

A、循环上万次的字符串处理
B、在一段代码内申请上百M甚至上G的内存
C、使用CGLib技术直接操作字节码运行,生成大量的动态类
D、不断创建对象

13、以下哪一个不是赋值符号?

A、+=
B、<<=
C、<<<=
D、>>>=

 解析:

A.很明显是赋值符号
B.<<=左移赋值
C.不是
D.>>>= 右移赋值,左边空出的位以0填充

14、Servlet的生命周期可以分为初始化阶段,运行阶段和销毁阶段三个阶段,以下过程属于初始化阶段是(ACD)。

A、加载Servlet类及.class对应的数据
B、创建servletRequest和servletResponse对象
C、创建ServletConfig对象
D、创建Servlet对象

解析:

Servlet的生命周期一般可以用三个方法来表示:
  1. init():仅执行一次,负责在装载Servlet时初始化Servlet对象
  2. service() :核心方法,一般HttpServlet中会有get,post两种处理方式。在调用doGet和doPost方法时会构造servletRequest和servletResponse请求和响应对象作为参数。
  3. destory():在停止并且卸载Servlet时执行,负责释放资源

初始化阶段:Servlet启动,会读取配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,将ServletConfig作为参数来调用init()方法。所以选ACD。B是在调用service方法时才构造的

 
 
15、有关静态初始化块说法正确的是? ABC
A、无法直接调用静态初始化块
B、在创建第一个实例前或引用任何静态成员之前,将自动调用静态初始化块来初始化
C、静态初始化块既没有访问修饰符,也没有参数
D、在程序中,用户可以控制合适执行静态初始化块

猜你喜欢

转载自www.cnblogs.com/buhuiflydepig/p/12356550.html