Java测试错题题解
博主声明:
本文由博主luoru_LR原创,请多支持与指教。
转载请在开头附加本文链接及作者信息,并标记为转载。
博主主页
Math.round(11.5) 等于:正确答案:C
A.11
B.11.5
C.12
D.12.5
解析:
Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们
的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取
整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地
板,该方法就表示向下取整,Math.floor(11.6)的结果为11,Math.floor(-11.6)的结果是
-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原
来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
下列有关Thread的描述,哪个是正确的?正确答案:C
A.启动一个线程的方法是:thread. run()
B.结束一个线程的通常做法是:thread. stop()
C.将一个线程标记成daemon线程,意味着当主线程结束,并且没有其它正在运行的
非daemon线程时,该daemon线程也会自动结束。
D.让一个线程等待另一个线程的通知的方法是:thread. sleep()。
解析:
A.启动一个线程的方法是 start()
B.结束线程用的是interrupt()方法,而stop()是强制结束线程,并不推荐使用,同时stop()方法已被弃用
C.daemon线程是守护线程,当主线程结束时,守护线程会自动结束
D.一个线程等待另外一个线程的方法是wait()方法
Java中下面哪个能创建并启动线程 正确答案:C
public class MyRunnable implements Runnable {
public void run() {
//some code here
}
}
A.new Runnable(MyRunnable).start()
B.new Thread(MyRunnable).run()
C.new Thread(new MyRunnable()).start()
D.new MyRunnable().start()
解析:
Java中线程实现的两种方式
(1)继承Thread,并重写run()方法,调用方法,new A().start() 就调用了线程
(2)实现Runnable接口,覆盖了run()方法,调用方法, new Thread(new A()).start(),调用线程
HashMap和HashTable的描述,错误的是? 正确答案:D
A.他们都实现了Map接口。
B.HashMap非线程安全,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供额外同步。
C.HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
D.通过contains方法可以判断一个对象是否存在于HashMap或者Hashtable中。
解析:
可以通过containsKey(key)和containsValue(value)判断对象中有没有key和value,而不是contain方法。
What is displayed when the following is executed; 正确答案:A
double d1=-0.5;
System.out.println("Ceil d1="+Math.ceil(d1));
System.out.println("floor d1="+Math.floor(d1));
A.Ceil d1=-0.0 floor d1=-1.0
B.Ceil d1=0.0 floor d1=-1.0
C.Ceil d1=-0.0 floor d1=-0.0
D.Ceil d1=0.0 floor d1=0.0
E.Ceil d1=0 floor d1=-1
解析:
◎Math.ceil()执行向上舍入,即它总是将数值向上舍入为最接近的整数;
◎Math.floor()执行向下舍入,即它总是将数值向下舍入为最接近的整数;
◎Math.round()执行标准舍入,即它总是将数值四舍五入为最接近的整数(这也是我们在数学课上学到的舍入规则)。
(多选)下面的Java赋值语句哪些是有错误的 正确答案:BF
A. int i =1000;
B. float f = 45.0;
C. char s = ‘\u0639’;
D. Object o = ‘f’;
E. String s = "hello,world\0";
F. Double d = 100;
解析:
B:45.0必须写成45.0f,否则会默认为double类型
F:Java是强类型语言,不能把整型直接赋值给double类型的变量,赋值前必须进行强制类型转换
(多选)关于Java中的数组,下面的一些描述,哪些描述是准确的: 正确答案:ACF
A.数组是一个对象,不同类型的数组具有不同的类
B.数组长度是可以动态调整的
C.数组是一个连续的存储结构
D.一个固定长度的数组可类似这样定义: int array[100]
E.两个数组用equals方法比较时,会逐个便利其中的元素,对每个元素进行比较
F.可以二维数组,且可以有多维数组,都是在Java中合法的
解析:
这道题在牛客上有较大的争议,牛客的正确答案是ACE,但更多的人说答案是ACF。
E选项:数组用equals比较时,不是比较内容,而是比较的是值(地址,显然是两个对象,地址不同),默认采用的object中的equals来进行比较。
关于 访问权限说法正确的是 ? 正确答案:B
A. 类定义前面可以修饰public,protected和private
B. 内部类前面可以修饰public,protected和private
C. 局部内部类前面可以修饰public,protected和private
D. 以上说法都不正确
解析:
感觉这题不是很严谨:既然B选项是正确的,那为什么C不正确,局部内部类难道不是内部类吗?
public static void main(String[] args) { 正确答案:B
Thread t = new Thread() {
public void run() {
360DW();
}
};
t.run();
System.out.print("DW");
}
static void 360DW() {
System.out.print("360");
}
A.DW
B.360
C.360DW
D.都不输出
解析:
这题暂时还不理解,网上也没有找到解析。
Java8中,下面哪个类用到了解决哈希冲突的开放定址法 正确答案:C
A.LinkedHashSet
B.HashMap
C.ThreadLocal
D.TreeMap
解析:
ThreadLocalMap中使用开放地址法来处理散列冲突,而HashMap中使用的是分离链表法。之所
以采用不同的方式主要是因为:在ThreadLocalMap中的散列值分散得十分均匀,很少会出现冲
突。并且ThreadLocalMap经常需要清除无用的对象,使用纯数组更加方便。
(多选).byte b1=1,b2=2,b3,b6,b8;
final byte b4=4,b5=6,b7;
b3=(b1+b2); /*语句1*/
b6=b4+b5; /*语句2*/
b8=(b1+b4); /*语句3*/
b7=(b2+b5); /*语句4*/
System.out.println(b3+b6);
下列代码片段中,存在编译错误的语句是? 正确答案:BCD
A.语句2
B.语句1
C.语句3
D.语句4
解析:
1、所有的byte,short,char型的值将被提升为int型;
2、如果有一个操作数是long型,计算结果是long型;
3、如果有一个操作数是float型,计算结果是float型;
4、如果有一个操作数是double型,计算结果是double型;
5、被final修饰的变量不会自动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型而转化。
下列代码执行结果为() 正确答案:A
public static void main(String args[])throws InterruptedException{
Thread t=new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.print("2");
}
});
t.start();
t.join();
System.out.print("1");
}
A. 21
B. 12
C. 可能为12,也可能为21
D. 以上答案都不对
解析:
暂时没明白。
下列不属于Java语言鲁棒性特点的是 正确答案:B
A. Java致力于检查程序在编译和运行时的错误
B. Java能运行虚拟机实现跨平台
C. Java自己操纵内存减少了内存出错的可能性
D. Java还实现了真数组,避免了覆盖数据类型的可能
解析:
跨平台不属于鲁棒性
鲁棒性(Robust,即健壮性)
Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。它提供自动
垃圾收集来进行内存管理,防止程序员在管理内存时容易产生 的错误。通过集成的面向对象的
例外处理机制,在编译时,Java揭示出可能出现但未被处理的例外,帮助程序员正确地进行选
择以防止系统的崩溃。另外, Java在编译时还可捕获类型声明中的许多常见错误,防止动态运
行时不匹配问题的出现。
下面程序段的时间复杂度是() 正确答案:B
i = k = 0;
while( k < n ){
i ++ ;
k += i ;
}
A.O(n)
B.O(n^1/2)
C.O(n*i)
D.O(n+i)
解析:
该程序段是对一个等差数列求和,1+2+...+k=k*(k+1)/2,当k*(k+1)/2大于等于n时结束循环,
根据时间复杂度此时f(n)=n^0.5。所以选B
(多选)以下哪种方式实现的单例是线程安全的 正确答案:ABCD
A.枚举
B.静态内部类
C.双检锁模式
D.饿汉式
解析:
1.饿汉式(线程安全,调用效率高,但是不能延时加载);
2.懒汉式(线程安全,调用效率不高,但是能延时加载);
3.Double CheckLock实现单例:DCL也就是双重锁判断机制(由于JVM底层模型原因,偶尔会出问题,不建议使用);
4.静态内部类实现模式(线程安全,调用效率高,可以延时加载);
5.枚举类(线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用)。
下面有关java实例变量,局部变量,类变量和final变量的说法,错误的是? 正确答案:B
A.实例变量指的是类中定义的变量,即成员变量,如果没有初始化,会有默认值。
B.局部变量指的是在方法中定义的变量,如果没有初始化,会有默认值
C.类变量指的是用static修饰的属性
D.final变量指的是用final 修饰的变量
解析:
局部变量是指类方法中的变量,必须初始化。局部变量运行时被分配在栈中,量大,生命周期
短,如果虚拟机给每个局部变量都初始化一下,是一笔很大的开销,但变量不初始化为默认值
就使用是不安全的。出于速度和安全性两个方面的综合考虑,解决方案就是虚拟机不初始化,
但要求编写者一定要在使用前给变量赋值。
如果一个接口Cup有个方法use(),有个类SmallCup实现接口Cup,则在类SmallCup中正确的
是? 正确答案:C
A.void use() { …}
B.protected void use() { …}
C.public void use() { …}
D.以上语句都可以用在类SmallCup中
解析:
实现接口,就要实现接口的所以方法,相当于重写方法,方法的重写需要满足:三同一大一
小(方法名、返回值类型、形参相同;访问权限>=重写前;抛出异常<=重写前),所以实现
的use方法必须使用public修饰。
下列关于容器集合类的说法正确的是? 正确答案: C
A.LinkedList继承自List
B.AbstractSet继承自Set
C.HashSet继承自AbstractSet
D.WeakMap继承自HashMap
解析:
A.LinkedList是继承自AbstractSequentialList(抽象类,实现了List接口)的,并且实现了List接口。所以A错误。
B.AbstractSet是实现了Set接口的,本身是一个抽象类。继承自AbstractCollection(抽象类,实现了Collection接口)。所以B错误。
C.HashSet是继承自AbstractSet,实现了Set接口。所以C正确。
D.WeakMap不存在于java集合框架的。只有一个叫做WeakHashMap(继承自AbstractMap)。
(多选)关于多线程和多进程,下面描述正确的是():正确答案: AC
A.多进程里,子进程可获得父进程的所有堆和栈的数据;而线程会与同进程的其他线程共享数据,拥有自己的栈空间。
B.线程因为有自己的独立栈空间且共享数据,所有执行的开销相对较大,同时不利于资源管理和保护。
C.线程的通信速度更快,切换更快,因为他们在同一地址空间内。
D.一个线程可以属于多个进程。
解析:
没有弄明白。
欲构造ArrayList类的一个实例,此类实现了List接口,下列哪个方法是正确的? 正确答案: B
A.ArrayList myList=new Object()
B.List myList=new ArrayList()
C.ArrayList myList=new List()
D.List myList=new List()
解析:
A:ArrayList是Object的子类,不满足
B:正确
C:不能直接实例化一个接口
D:不能直接实例化一个接口
Java的Daemon线程,setDaemon( )设置必须要?正确答案:A
A.在start之前
B.在start之后
C.前后都可以
解析:
Java中线程分为两种类型:
1:用户线程。通过Thread.setDaemon(false)设置为用户线程;
2:守护线程。通过Thread.setDaemon(true)设置为守护线程,如果不设置,默认用户线程;
守护线程是服务用户线程的线程,在它启动之前必须先set。
下面这条语句一共创建了多少个对象:String s="welcome"+"to"+360; 正确答案:A
A.1
B.2
C.3
D.4
解析:
感觉这道题目有问题,不是说String类型在进行拼接时会产生新对象吗?
String s = new String("xyz");创建了几个StringObject? 正确答案:A
A.两个或一个都有可能
B.两个
C.一个
D.三个
解析:
如果"xyz"在常量池中存在,只会在堆中创建一个new String("xyz") ;一个对象
如果"xyz"在常量池中不存在,会现在常量池中创建一个“xyz”,然后在堆中创建一个new String("xyz");两个对象
以下J2EE中常用的名词解释错误的是? 正确答案:B
A.EJB容器:Enterprise java bean 容器
B.JNDI:JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
C.JMS:JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
JAF:JAVA安全认证框架。提供一些安全控制方面的框架。
解析:
JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一
个目录系,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式
应用程序的功能。
以下描述错误的一项是( ) 正确答案:C
A.程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行 到了第几行,是线程隔离的
B.原则上讲,所有的对象都是在堆区上分配内存,是线程之间共享的
C.方法区用于存储JVM加载的类信息、常量、静态变量,即使编译器编译后的代码等数据,是线程隔离的
D.Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
解析:
Java运行时内存
1. 程序计数器,线程私有。可以看作是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变整个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能。
由于JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,所以线程私有。
程序计数器是唯一一个在Java虚拟机规范中没有规定任何OOM的区域。
2. Java虚拟机栈,线程私有。生命周期和线程相同。虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧。每个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机中入栈到出栈的过程。
3. 本地方法栈,线程私有。和虚拟机栈的区别就在于一个是为了执行Java方法服务,一个是为了虚拟机使用到的Native方法服务。
4. 堆,线程共享。存放对象实例和数组。
5. 方法区,线程共享。存放已经被JVM加载的类信息,常量,静态变量,即时编译器编译后的代码。
(多选) 下列说法哪个正确() 正确答案:ACD
A.abstract类只能用来派生子类,不能用来创建abstract类的对象。
B.final类不但可以用来派生子类,也可以用来创建final类的对象。
C.abstract不能与final同时修饰一个类。
D.abstract类定义中可以没有abstract方法。
解析:
A和C选项都很显然是正确的
D选项:抽象类中不一定要包含abstrace方法。
Java中,静态变量static在不同线程的不同实例中地址是否一样?他们储存在什么区域() 正确答案:C
A.地址一样,在堆栈区。
B.地址不一样,在堆栈区。
C.地址一样,在全局区。
D.地址不一样,在全局区。
解析:
不理解。
下列哪个说法是正确的() 正确答案:D
A.ConcurrentHashMap使用synchronized关键字保证线程安全
B.HashMap实现了Collction接口
C.Array.asList方法返回java.util.ArrayList对象
D.SimpleDateFormat是线程不安全的
解析:
A、ConcurrentHashMap实际上时 HashTable的升级版,使用segment来分段和管理锁,并不是synchronized;
B、 HashMap实现的接口有:Serializable, Cloneable, Map<K,V> ,没有实现Cllectio
C、Arrays.asList()方法返回的列表是Arrays.ArrayList类型的,并不是java.util.ArrayList;
总结:知识漏洞主要在多线程以及Java集合这两部分。