2.9Java专项测试复盘

  • Math.round(11.5) 等于多少 (). Math.round(-11.5) 等于多少 ( ).
    A. 11 ,-11
    B. 11 ,-12
    C. 12 ,-11
    D. 12 ,-12

    解析:Math类中提供了三个与取整有关的方法:ceil,floor,round,这些方法的作用于它们的英文名称的含义相对应。
    ceil的英文意义是天花板,该方法就表示向上取整。
    floor的英文是地板,该方法就表示向下取整。
    round方法,他表示“四舍五入”。
    答案:C

  • 字符界面下接受用户从键盘输入,需要import的包是:( )
    A. java.lang包
    B. java.awt包
    C. java.io包
    D. java.applet包

    解析:这个问题的前提是:字符界面下。前端用户输入、后台程序获取,都是字符流的传输,因此需要导入java.io包。而java.util中的Scanner则是获取控制台的输入。因此,答案选C
    答案:C

  • 建立Statement对象的作用是?
    A. 连接数据库
    B. 声明数据库
    C. 执行SQL语句
    D. 保存查询结果
    解析:
    Class.forName(“com.mysql.jdbc.Driver”); //加载jdbc驱动
    con=DriverManager.getConnection(url,user,password); //建立连接
    stmt=con.createStatement(); //创建语句执行者
    //stateMent用于执行不带参数的简单sql语句
    //PreparedStatement用于执行带参数的预编译sql语句能够预防sql注入
    //CallableStatement提供了一种标准形式的调用存储过程的方法
    stmt.execute(“sql语句”);
    rs=stmt.executeQuery(“sql查询语句”); //结果集
    答案:C

  • 下面论述正确的是()?
    A. 如果两个对象的hashcode相同,那么它们作为同一个HashMap的key时,必然返回同样的值
    B. 如果a,b的hashcode相同,那么a.equals(b)必须返回true
    C. 对于一个类,其所有对象的hashcode必须不同
    D. 如果a.equals(b)返回true,那么a,b两个对象的hashcode必须相同

    解析:hashCode()方法和equals()方法的作用其实是一样的,在Java里都是用来对比两个对象是否相等一致。
    重写的equals()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。
    但是hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,所以我们可以得出:
    1.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。
    2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
    所有对于需要大量并且快速的对比的话如果都用equals()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equals(),如果equals()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!
    答案:D

  • 以下代码执行的结果显示是多少( )?

    A. true,false,true
    B. false,true,false
    C. true,true,false
    D. false,false,true

    解析: 其实当我们在为Integer赋值的时候,java编译器会将其翻译成调用valueOf()方法。比如Integer i=127翻译为Integer i=Integer.valueOf(127)
    然后我们来看看valueOf()函数的源码:
    public static Integer valueOf(int i)
    {
    //high为127
    if(i >= -128 && i <= IntegerCache.high)
    return IntegerCache.***[i + 128];
    else
    return new Integer(i);
    }
    可以看出,对于-128到127之间的数,Java会对其进行缓存。而超出这个范围则新建一个对象。
    所以现在回到这道问题
    i1和i2为128,超出范围,所以都需要新建对象,对象比较为false;
    i5和i6为100,在范围之内,在执行Integer i5=100时,就会直接缓存到内存中,但执行执行Integer i6=100时,就直接从缓存里取,而不需要新建对象,所以为true。
    答案:D

  • 对于子类的构造函数说明,下列叙述中错误的是( )。
    A. 子类不能继承父类的无参构造函数。
    B. 子类可以在自己的构造函数中使用super关键字来调用父类的含参数构造函数,但这个调用语句必须是子类构造函数的第一个可执行语句。
    C. 在创建子类的对象时,若不含带参构造函数,将先执行父类的无参构造函数,然后再执行自己的无参构造函数。
    D. 子类不但可以继承父类的无参构造函数,也可以继承父类的有参构造函数。

        解析:构造函数不能被继承,构造方法只能被显式或隐式的调用。
        答案:D

  • 下面有关java classloader说法正确的是()?
    A. ClassLoader就是用来动态加载class文件到内存当中用的
    B. JVM在判定两个class是否相同时,只用判断类名相同即可,和类加载器无关
    C. ClassLoader使用的是双亲委托模型来搜索类的
    D. Java默认提供的三个ClassLoader是Boostrap ClassLoader,Extension ClassLoader,App ClassLoader
    E. 以上都不正确

         解析:
         答案:ACD

  • 下面的对象创建方法中哪些会调用构造方法 ()?
    A. new语句创建对象
    B. 调用Java.io.ObjectInputStream的readObject方法
    C. java反射机制使用java.lang.Class或java.lang.reflect.Constructor的newInstance()方法
    D. 调用对象的clone()方法

    解析:虚拟机中严格规定有且只有5中情况必须对类进行初始化:
    1.使用new生成对象时,读取或者设置静态属性,调用静态方法
    2.对类使用反射调用的时候
    3.初始化一个类的时候,如果发现父类没有被调用,泽需要先触发其父类进行初始化
    4.当虚拟机启动时,用户需要制定一个要执行的朱磊(包含main方法的那个类),虚拟机会先初始化这个主类
    5.使用jdk1.7的动态预约支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_puttStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,泽需要先触发其初始化
    答案:AC

  • 在 hibernate 开发中,关于 POJO 类对象的状态说法正确的是()。
    A. 自由状态(Transient):实体在内存中自由存在,与数据库中的记录无关
    B. 持久状态(Persistent):实体处于由Hibernate框架所管理的状态,对应了数据库中的一条记录,同时与某个session实例发生了关联
    C. 游离状态(Detached):在session 关闭之后,可以使对象从持久状态转换到游离状态。
    D. 不能将对象从游离状态转换成持久态

    解析:
    答案:ABC

  • 下面关于volatile的功能说法正确的是哪个
    A. 原子性
    B. 有序性
    C. 可见性
    D. 持久性

    解析:synchronized保证三大性,原子性,有序性,可见性,volatile保证有序性,可见性,不能保证原子性
    答案:BC

  • 以下各类中哪几个是线程安全的?( )
    A. ArrayList
    B. Vector
    C. Hashtable
    D. Stack

    解析:下面是这些线程安全的同步的类:
    vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
    statck:堆栈类,先进后出
    hashtable:就比hashmap多了个线程安全
    enumeration:枚举,相当于迭代器
    除了这些之外,其他的都是非线程安全的类和接口。
    答案:BCD

  • 截止JDK1.8版本,java并发框架支持锁包括?
    A. 读写锁
    B. 自旋锁
    C. X锁
    D. 乐观锁
    E. 排他锁

    解析:http://ifeve.com/java_lock_see/
    1、自旋锁 ,自旋,jvm默认是10次吧,有jvm自己控制。for去争取锁
    2、阻塞锁 被阻塞的线程,不会争夺锁。
    3、可重入锁 多次进入改锁的域
    4、读写锁
    5、互斥锁 锁本身就是互斥的
    6、悲观锁 不相信,这里会是安全的,必须全部上锁
    7、乐观锁 相信,这里是安全的。
    8、公平锁 有优先级的锁
    9、非公平锁 无优先级的锁
    10、偏向锁 无竞争不锁,有竞争挂起,转为轻量锁
    11、对象锁 锁住对象
    12、线程锁
    13、锁粗化 多锁变成一个,自己处理
    14、轻量级锁 CAS 实现
    15、锁消除 偏向锁就是锁消除的一种
    16、锁膨胀 jvm实现,锁粗化
    17、信号量 使用阻塞锁 实现的一种策略
    18、排它锁:X锁,若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。
    答案:ABD

  • 判断对错。在java的多态调用中,new的是哪一个类就是调用的哪个类的方法。()

    解析:java多态有两种情况:重载和覆写
    在覆写中,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法;
    在重载中,运用的是静态多分派,即根据静态类型确定对象,因此不是根据new的类型确定调用的方法
    答案:×

  • 下面代码的输出结果是什么?
    public class ZeroTest {
    public static void main(String[] args) {
    try{
    int i = 100 / 0;
    System.out.print(i);
    }catch(Exception e){
    System.out.print(1);
    throw new RuntimeException();
    }finally{
    System.out.print(2);
    }
    System.out.print(3);
    }
    }
    A. 3
    B. 123
    C. 1
    D. 12
    解析:try catch是直接处理,处理完成之后程序继续往下执行,throw则是将异常抛给它的上一级处理,程序便不往下执行了。本题的catch语句块里面,打印完1之后,又抛出了一个RuntimeException,程序并没有处理它,而是直接抛出,因此执行完finally语句块之后,程序终止了。
    答案:D

  • 关于下面的程序Test.java说法正确的是( )。
    public class Test {
    static String x=“1”;
    static int y=1;
    public static void main(String args[]) {
    static int z=2;
    System.out.println(x+y+z);
    }
    }
    A. 3
    B. 112
    C. 13
    D. 程序有编译错误

    解析:被static修饰的变量称为静态变量,静态变量属于整个类,而局部变量属于方法,只在该方法内有效,所以static不能修饰局部变量
    答案:D

  • 下面关于Spring的说法中错误的是()
    A. Spring是一系列轻量级Java EE框架的集合
    B. Spring中包含一个“依赖注入”模式的实现
    C. 使用Spring可以实现声明式事务
    D. Spring提供了AOP方式的日志系统

    解析:Spring并没有为我们提供日志系统,我们需要使用AOP(面向方面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。 
    答案:D

  • 在java7中,下列不能做switch()的参数类型是?
    A. int型
    B. 枚举类型
    C. 字符串
    D. 浮点型

    答案:D

  • 说明输出结果。
    package test;
    import java.util.Date;
    public class SuperTest extends Date{
    private static final long serialVersionUID = 1L;
    private void test(){
    System.out.println(super.getClass().getName());
    }

    public static void main(String[]args){
    new SuperTest().test();
    }
    }
    A. SuperTest
    B. SuperTest.class
    C. test.SuperTest
    D. test.SuperTest.class

    解析:1.首先 super.getClass() 是父类的getClass()方法,其父类是Date,它的getClass()方法是继承自Object类而且没有重写,所以就是调用object的getClass()方法。所以可以知道是返回当前运行时的类。2.在调用getName()方法而getName()是:包名+类名。
    答案:C

  • 下面关于程序编译说法正确的是()
    A. java语言是编译型语言,会把java程序编译成二进制机器指令直接运行
    B. java编译出来的目标文件与具体操作系统有关
    C. java在运行时才进行翻译指令
    D. java编译出来的目标文件,可以运行在任意jvm上

    解析:A:.java编译成的是字节码,再被各系统的jvm翻译成本系统可以识别的机器码,这就是java一次编程多平台应用的跨平台性 B:java源文件生成的是class文件,与系统无关 C:注意字节码和机器码不是一回事 java程序在运行时字节码才会被jvm翻译成机 器码,所以说java是解释性语言 D:注意jvm的版本
    答案:C

  • CMS垃圾回收器在那些阶段是没用用户线程参与的
    A. 初始标记
    B. 并发标记
    C. 重新标记
    D. 并发清理

    解析:用户线程(user-level threads)指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。
    CMS的GC过程有6个阶段(4个并发,2个暂停其它应用程序)
    1.初次标记(STW initial mark)
    2.并发标记(Concurrent marking)
    3.并发可中断预清理(Concurrent precleaning)
    4.最终重新标记(STW remark)
    5.并发清理(Concurrent sweeping)
    6.并发重置(Concurrent reset)
    在初次标记,重新标志的时候,要求我们暂停其它应用程序,那么这两个阶段用户线程是不会参与的
    答案:AC

  • 关于Java中的ClassLoader下面的哪些描述是错误的:( )
    A. 默认情况下,Java应用启动过程涉及三个ClassLoader: Boostrap, Extension, System
    B. 一般的情况不同ClassLoader装载的类是不相同的,但接口类例外,对于同一接口所有类装载器装载所获得的类是相同的
    C. 类装载器需要保证类装载过程的线程安全
    D. ClassLoader的loadClass在装载一个类时,如果该类不存在它将返回null
    E. ClassLoader的父子结构中,默认装载采用了父优先
    F. 所有ClassLoader装载的类都来自CLASSPATH环境指定的路径

    解析:A.Java系统提供3种类加载器:启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用程序类加载器(Application ClassLoader). A正确
    B.《深入理解Java虚拟机》P228:对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。这句话可以表达得更通俗一些:比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那么这两个类必定不相等。接口类是一种特殊类,因此对于同一接口不同的类装载器装载所获得的类是不相同的。B错误
    C.类只需加载一次就行,因此要保证类加载过程线程安全,防止类加载多次。C正确
    D. Java程序的类加载器采用双亲委派模型,实现双亲委派的代码集中在java.lang.ClassLoader的loadClass()方法中,此方法实现的大致逻辑是:先检查是否已经被加载,若没有加载则调用父类加载器的loadClass()方法,若父类加载器为空则默认使用启动类加载器作为父类加载器。如果父类加载失败,抛出ClassNotFoundException异常。D错误
    E.双亲委派模型的工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。E正确
    F.应用程序类加载器(Application ClassLoader)负责加载用户类路径(ClassPath)上所指定的类库,不是所有的ClassLoader都加载此路径。F错误
    答案:BDF

  • 以下哪几种方式可用来实现线程间通知和唤醒:( )
    A. Object.wait/notify/notifyAll
    B. ReentrantLock.wait/notify/notifyAll
    C. Condition.await/signal/signalAll
    D. Thread.wait/notify/notifyAll

    解析:wait()、notify()和notifyAll()是 Object类 中的方法 ;
    Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、 notify(),使用Condition1的await()、signal()这种方式实现线程间协作更加安全和高效。
    答案:AC

posted @ 2020-02-09 22:09  19呀  阅读(404)  评论(0编辑  收藏  举报