目录
选择题模块
1.下面哪个标识符是合法的?(D)
2.以下描述正确的是(B)
3.下列程序的运行结果(B)
4.下列关于容器集合类的说法正确的是?(C)
5.ArrayList list = new ArrayList(20);中的list扩充几次(A)
6.下列关于Java并发的说法中正确的是(B)
7.以下方法,哪个不是对add方法的重载?(B)
8.在Java中,(D)类提供定位本地文件系统,对文件或目录及其属性进行基本操作
9.下面关于 Java 中 volatile 关键字的说法错误的是(A)
10.下列哪种异常是检查型异常,需要在编写程序时声明?(C)
11.选项中哪一行代码可以添加 到题目中而不产生编译错误?(A)
编程题模块
1.最近公共祖先
2.求最大连续bit数
3.二进制插入
4.查找组成一个偶数最接近的两个素数
选择题模块
1.下面哪个标识符是合法的?(D)
A 9HelloWorld
B _Hello World
C Hello*World
D Hello$World
对于标识符,我们知道是由数字、字母以及$组成。并且:开头不能是数字。所以此题选D
2.以下描述正确的是(B)
A CallableStatement是PreparedStatement的父接口
B PreparedStatement是CallableStatement的父接口
C CallableStatement是Statement的父接口
D PreparedStatement是Statement的父接口
由图可以看出接口顺序为:CallableStatement--->PreparedStatement--->Statement
3.下列程序的运行结果(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 都不输出
在main方法创建之后先执行里面的静态方法,后而执行其他方法,所以首先输出pong再输出ping,选择B
4.下列关于容器集合类的说法正确的是?(C)
A LinkedList继承自List
B AbstractSet继承自Set
C HashSet继承自AbstractSet
D WeakMap继承自HashMap
由图可以看出:
A. List属于接口,只能实现,不能继承
B. Set属于接口,只能实现,不能继承
C. HashSet继承自AbstractSet
D. WeakHashSet继承自AbstractSet
5.ArrayList list = new ArrayList(20);中的list扩充几次(A)
A 0
B 1
C 2
D 3
这个我们可以通过源码来看:
此题在创建数组时传入初始长度20,所以数组长度就是20,不需要扩容。
拓展:
如果初始化一个数组,未指定长度,使用add给数组中添加元素,当添加元素超过10时,会进行自动扩容,扩容量=1.5倍数组长度。
6.下列关于Java并发的说法中正确的是(B)
A CopyOnWriteArrayList适用于写多读少的并发场景
B ReadWriteLock适用于读多写少的并发场景
C ConcurrentHashMap的写操作不需要加锁,读操作需要加锁
D 只要在定义int类型的成员变量i的时候加上volatile关键字,那么多线程并发执行i++这样的操作的时候就是线程安全的了
A,CopyOnWriteArrayList适用于写少读多的并发场景
B,ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥,
读与读之间可以并发执行。在读多写少的情况下可以提高效率
C,ConcurrentHashMap是同步的HashMap,读写都加锁
D,volatile只保证多线程操作的可见性,不保证原子性
7.以下方法,哪个不是对add方法的重载?(B)
public class Test
{
public void add( int x,int y,int z){}
}
A public int add(int x,int y,float z){return 0;}
B public int add(int x,int y,int z){return 0;}
C public void add(int x,int y){}
D 所有选项都不是
重载:从简单说,就是函数或者方法有相同的名称,但是参数列表不相同
B选项中,参数列表与add方法参数列表相同,所以不构成重载。
8.在Java中,(D)类提供定位本地文件系统,对文件或目录及其属性进行基本操作
A FileInputStream
B FileReader
C FileWriter
D File
FileInputStream提供了对文件的字节读取;
FileReader提供了对文件的字符读取;
FileWriter提供了对文件的字符写入;
File提供了对文件的基本操作,包括对删除,文件路径等操作。
9.下面关于 Java 中 volatile 关键字的说法错误的是(A)
A 能保证线程安全
B volatile 关键字用在多线程同步中,可保证读取的可见性
C JVM 保证从主内存加载到线程工作内存的值是最新的
D volatile 能禁止进行指令重排序
A选项:volatile单纯使用不能保证线程安全,他只是提供了一种弱的同步机制来确保修饰的变量的更新操作通知到其他线程,A选项错误
B选项:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。B选项正确。
C选项: 对于用volatile修饰的变量,JVM虚拟机会保证从主内存加载到线程工作内存的值是最新的,例如线程1和线程2在进行read和load的操作中,发现主内
存中某个变量的值都是5,那么都会加载这个最新的值。这也是可见性的一种体现。C选项正确。
D选项:volatile的底层是采用内存屏障来实现的,就是在编译器生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。D选项正确。
10.下列哪种异常是检查型异常,需要在编写程序时声明?(C)
A NullPointerException
B ClassCastException
C FileNotFoundException
D IndexOutOfBoundsException
由图可以清楚的了解哪些是受查异常,那些是非受查异常,所以此题选C
异常可以分为非检查异常和检查异常: 非检查异常主要包括运行时异常(RuntimeException极其子类)和错误(Error)。编译器不会进行检查并且不要求必须处理的异常,也就说当程序中出现此类 异常时,即使我们没有`try-catch`捕获它,也没有使用`throws`抛出该异常,编译也会正常通过。
检查异常是除了`Error`和 `RuntimeException`的其它异常。这是编译器要求必须处理的异常。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行 在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,所以必须处理这些异常。
11.选项中哪一行代码可以添加 到题目中而不产生编译错误?(A)
public abstract class MyClass {
public int constInt = 5;
//add code here
public void method() {
}
}
A public abstract void method(int a);
B constInt = constInt + 5;
C public int method();
D public abstract void anotherMethod() {}
首先我们可以看出MyClass属于抽象类,所以他得有抽象方法,所以排除B,C选项,又因为抽象方法不需要大括号,所以选A。
编程题模块
1.最近公共祖先
import java.util.*;
public class LCA {
public int getLCA(int a, int b) {
// write code here
if(a == b){
return a;
}else{
while(true){
if(a>b){
a=a/2;
}else if(a<b){
b=b/2;
}
if(a == b){
return a;
}
}
}
}
}
2.求最大连续bit数
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int num = in.nextInt();
int count = 0;
int max = 0;
while (num != 0) {
if ((num & 1) == 1) {
count++;
max = Math.max(count, max);
} else {
count = 0;
}
num = num >> 1;
}
System.out.println(max);
}
}
3.二进制插入
import java.util.*;
public class BinInsert {
public int binInsert(int n, int m, int j, int i) {
// write code here
return (m<<j)^n;
}
}
4.查找组成一个偶数最接近的两个素数
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int n =scanner.nextInt();
int half = n/2;
for(int i =half;i>0;i++){
if(isPrime(i) && isPrime(n-i)){
System.out.println(n-i);
System.out.println(i);
break;
}
}
}
}
public static boolean isPrime(int m){
for(int i=2;i*i<=m;i++){
if(m%i==0){
return false;
}
}
return true;
}
}