以下是20道新的Java基础知识高频笔试题及答案解析,聚焦泛型、内部类、反射、线程池等核心考点,与之前题目无重复,适合强化练习:
1. 关于泛型擦除机制,下列说法正确的是?
A. 泛型在编译时会被擦除,运行时不保留泛型信息
B. List<String>和List<Integer>在运行时是同一个类型
C. 泛型擦除后,默认使用Object类型替代类型参数
D. 可以通过反射获取泛型的实际类型参数
答案:ABCD
解析:Java泛型采用“擦除机制”,编译后类型参数被移除,运行时无法直接获取,需通过反射(如ParameterizedType)间接获取。
2. 下列代码的输出结果是?
public class Test {
public static void main(String[] args) {
int[][] arr = {{1,2}, {3,4,5}, {6}};
System.out.println(arr.length);
System.out.println(arr[1].length);
}
}
答案:3 3
解析:二维数组是“数组的数组”,arr.length是外层数组长度(3个元素),arr[1].length是第二个内层数组长度(3个元素)。
3. 关于内部类,说法错误的是?
A. 成员内部类可以访问外部类的所有成员(包括private)
B. 静态内部类可以直接访问外部类的非静态成员
C. 局部内部类只能在定义它的方法内使用
D. 匿名内部类没有类名,必须继承父类或实现接口
答案:B
解析:静态内部类属于外部类,而非对象,无法直接访问外部类的非静态成员(需通过外部类对象),B错误。
4. 下列代码的输出结果是?
public class Test {
public static void main(String[] args) {
String s = "a" + "b" + "c";
String t = "abc";
System.out.println(s == t);
}
}
答案:true
解析:编译期常量字符串拼接会被优化为"abc",s和t指向常量池同一对象,==比较地址为true。
5. 关于反射机制,下列说法正确的是?
A. 反射可以在运行时获取类的属性、方法和构造器
B. Class.forName("com.example.User")会触发类加载
C. 反射可以调用类的私有方法
D. 反射的性能比直接调用差
答案:ABCD
6. 下列代码的输出结果是?
public class Test {
public static void main(String[] args) {
Integer a = 200;
int b = 200;
System.out.println(a == b);
}
}
答案:true
解析:Integer与int比较时,Integer会自动拆箱为int,比较值是否相等(200=200),故为true。
7. 关于线程池ThreadPoolExecutor的参数,说法错误的是?
A. corePoolSize:核心线程数,即使空闲也不会被销毁
B. maximumPoolSize:最大线程数,包括核心线程和临时线程
C. keepAliveTime:临时线程的空闲存活时间
D. 当任务数超过maximumPoolSize时,直接抛出异常
答案:D
解析:任务数超过maximumPoolSize + 队列容量时,才会触发拒绝策略(如抛异常),D错误。
8. 下列代码的输出结果是?
public class Test {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("a");
StringBuffer sb2 = sb1;
sb1.append("b");
System.out.println(sb1 == sb2);
System.out.println(sb1.toString().equals(sb2.toString()));
}
}
答案:true true
解析:sb1和sb2指向同一StringBuffer对象,append修改内容后地址不变,故==和equals均为true。
9. 关于Java 8的Lambda表达式,说法正确的是?
A. Lambda表达式可以简化函数式接口的实现
B. (a, b) -> a + b 等价于匿名内部类实现BinaryOperator
C. Lambda表达式没有自己的this,this指向外部类对象
D. 所有接口都可以用Lambda表达式实现
答案:ABC
解析:Lambda仅适用于“函数式接口”(只有一个抽象方法的接口),D错误。
10. 下列代码的输出结果是?
public class Test {
public static void main(String[] args) {
int i = 0;
while (i < 3) {
i++;
if (i == 2) {
continue;
}
System.out.print(i);
}
}
}
答案:13
解析:循环过程:i=1输出1;i=2触发continue(不输出);i=3输出3,最终为“13”。
11. 关于try-with-resources,说法正确的是?
A. 用于自动关闭实现AutoCloseable接口的资源(如流、连接)
B. 替代try-finally,简化资源释放代码
C. 可以同时声明多个资源,用分号分隔
D. 资源的关闭顺序与声明顺序相反
答案:ABCD
12. 下列代码的输出结果是?
public class Test {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3);
list.forEach(System.out::print);
}
}
答案:123
解析:Java 8的forEach结合方法引用System.out::print,依次打印集合元素。
13. 关于volatile关键字,说法错误的是?
A. volatile保证变量的可见性(一个线程修改后,其他线程立即可见)
B. volatile保证变量的原子性(如i++操作)
C. volatile禁止指令重排序
D. volatile常用于标记多线程共享的状态变量(如boolean isRunning)
答案:B
解析:volatile不保证原子性,i++是多步操作(读-改-写),需用synchronized或AtomicInteger保证原子性,B错误。
14. 下列代码的输出结果是?
public class Test {
public static void main(String[] args) {
String s = new String("hello");
String t = s.intern();
System.out.println(s == t);
System.out.println(t == "hello");
}
}
答案:false true
解析:s.intern()将字符串放入常量池并返回常量池引用,s是堆中对象,t指向常量池,故s == t为false,t与"hello"指向同一常量,故为true。
15. 关于Comparable和Comparator的区别,说法正确的是?
A. Comparable是接口,由类自身实现(compareTo方法),定义自然排序
B. Comparator是外部比较器,需单独实现(compare方法),定义定制排序
C. Collections.sort(list)使用Comparable排序
D. Collections.sort(list, comparator)使用Comparator排序
答案:ABCD
16. 下列代码的输出结果是?
public class Test {
public static void main(String[] args) {
int a = 5;
System.out.println(a++ + ++a);
}
}
答案:12
解析:计算过程:a++先取5(a变为6),++a先加1(a变为7)再取7,总和5+7=12。
17. 关于Java的类加载机制,说法正确的是?
A. 类加载过程包括:加载→验证→准备→解析→初始化
B. 初始化阶段执行静态代码块和静态变量赋值
C. 父类初始化优先于子类
D. 同一个类加载器不会重复加载同一个类
答案:ABCD
18. 下列代码的输出结果是?
public class Test {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("a", 3);
System.out.println(map.size());
System.out.println(map.get("a"));
}
}
答案:2 3
解析:HashMap中键唯一,重复put会覆盖值,故size为2,"a"对应值为3。
19. 关于throw和throws的区别,说法错误的是?
A. throw用于方法内部手动抛出异常对象
B. throws用于方法声明处,指定可能抛出的异常类型
C. 一个方法可以throws多个异常,用逗号分隔
D. throw后可以跟多个异常对象
答案:D
解析:throw一次只能抛出一个异常对象,D错误。
20. 下列代码的输出结果是?
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
list.removeIf(s -> s.startsWith("b"));
System.out.println(list.size());
}
}
答案:2
解析:Java 8的removeIf方法移除满足条件的元素(以"b"开头的"banana"被移除),剩余2个元素。
以上题目覆盖泛型、反射、线程池、Java 8新特性等高频考点,建议结合实际代码运行加深理解,重点关注容易混淆的概念(如泛型擦除、volatile与原子性、内部类访问规则)。