Java常见笔试题【第四部分】

1,关于Spring MVC的核心控制器DispatcherServlet的作用,以下说法错误的是( )

A,它负责接收HTTP请求

B,加载配置文件

C,实现业务操作

D,初始化上下应用对象ApplicationContext

正确答案:C

SpringMVC是Spring中的模块,它实现了mvc设计模式,首先用户发起请求,请求到达SpringMVC的前端控制器(DispatcherServlet),前端控制器根据用户的url请求处理器映射器查找匹配该url的handle,并返回一个执行链,前端控制器再请求处理器适配器调用相应的handle进行处理并返回给前端控制器一个modelAndView,前端控制器再请求视图解析器对返回的逻辑视图进行解析,最后前端控制器将返回的视图进行渲染,并把数据装入到request域,返回给用户。

DispatcherServlet作为SpringMVC的前端控制器,负责接收用户的请求,并根据用户的请求返回相应的视图给用户。实现业务在service层,所以c答案错误。

2,下面有关spring的依赖注入,说法错误的是()

A,依赖注入通常有如下两种:设值注入和构造注入:

B,构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入

C,当设值注入与构造注入同时存在时,先执行构造注入,再执行设值注入

D,设值注入是指IoC容器使用属性的setter方法来注入被依赖的实例。这种注入方式比较简单、直观

正确答案:C

使用构造函数依赖注入时,Spring保证一个对象所有依赖的对象先实例化后,才实例化这个对象。使用set方法依赖注入时,Spring首先实例化对象,然后才实例化所有依赖的对象。

当设值注入与构造注入同时存在时,先执行设值注入,再执行构造注入。

3,将元数据配置到Spring容器,下面哪个方法是不正确的()

A,通过编组与解组对象

B,注解基础配置

C,Java基础配置

D,XML基础配置

正确答案:A

有三种方式向Spring 容器提供元数据:1,XML配置文件;2,基于注解配置;3,基于Java的配置,死概念记住即可。

4,下面哪个不是Spring 的注解()

A,@Aspect

B,@Service

C,@Component

D,@Controller

E,@View

正确答案:E

考察对spring的熟悉程度,除E选项之外都是较常用注解。

5,下面有关SPRING的事务传播特性,说法错误的是()

A,PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行

B,PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常

C,PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起

D,PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚

正确答案:B

事务的传播属性介绍:

PROPAGATION_REQUIRED --支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS --支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW --新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED --以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER --以非事务方式执行,如果当前存在事务,则抛出异常。

6,下列关于Spring特性中IoC描述错误的是()

A,IoC就是指程序之间的关系由程序代码直接操控

B,所谓“控制反转”是指控制权由应用代码转到外部容器,即控制权的转移

C,IoC将控制创建的职责搬进了框架中,从应用代码脱离开来

D,使用Spring的IoC容器时只需指出组件需要的对象,在运行时Spring的IoC容器会根据XML配置数据提供给它

正确答案:A

IOC,即控制反转(Inversion of Control,英文缩写为IoC),是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。

 


见如下代码:

1
2
3
4
5
6
7
8
9
10
11
public class IntTest {
 
  public static void main(String[] args) {
    Integer i1 = 100;
    Integer i2 = 100;
    Integer i3 = 150;
    Integer i4 = 150;
    System.out.println(i1 == i2);
    System.out.println(i3 == i4);
  }
}

问题来了:输出的结果是什么?最好先有自己的答案再看分析,欢迎留言自己的见解!

问题分析:

1,首先要搞清楚==与equal的区别以及各自比较的是什么

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。

所以首先弄清楚了,对于上面代码中,我们是比较变量所对应的内存中所存储的数值是否相同。

2,要了解自动装箱和拆箱的概念

JVM会自动维护八种基本数据类型的常量池。

在上面代码中,第一次Integer i1 = 100;时会把i1写入常量池,当定义i2时,数据一样,不会再去创建新的对象,所以,第一个输出的是true。

但是这里Integer并不是八种基本数据类型啊,这里涉及了自动装箱和拆箱的概念。自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。

因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。原始类型byte,short,char,int,long,float,double和boolean对应的封装类为Byte,Short,Character,Integer,Long,Float,Double,Boolean。

3,int在常量池中的初始化范围

int常量池中初始化-128~127的范围,所以当为Integer i1,i2=100时,在自动装箱过程中是取自常量池中的数值,而当Integer i3,i4=150时,150不在常量池范围内,所以在自动装箱过程中需new 一个150,所以上面代码第二个输出的是false。

下面贴出int常量池的部分代码供大家参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
     * Cache to support the object identity semantics of autoboxing for values between
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage.  The size of the cache
     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
     * During VM initialization, java.lang.Integer.IntegerCache.high property
     * may be set and saved in the private system properties in the
     * sun.misc.VM class.
     */
 
    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];
 
        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;
 
            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
 
            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }
 
        private IntegerCache() {}
    }

正确答案:

true

false


下面哪个流类属于面向字符的输入流(  )

A  BufferedWriter

B  FileInputStream

C  ObjectInputStream

D  InputStreamReader

正确答案:D

以InputStream(输入)/OutputStream(输出)为后缀的是字节流。

以Reader(输入)/Writer(输出)为后缀的是字符流。

发表评论