一、选择题(40题)
-
Java程序的执行入口是:
A) 任意方法
B) main方法
C) static块
D) 构造方法
【答案】B -
下列哪个不是Java的基本数据类型?
A) int
B) boolean
C) String
D) double
【答案】C -
关于Java的垃圾回收机制,正确的是:
A) 程序员可以指定时间进行垃圾回收
B) 垃圾回收线程的优先级很高
C) 对象不再被引用时会被回收
D) 调用System.gc()会立即回收内存
【答案】C -
下列哪个关键字用于定义常量?
A) static
B) final
C) const
D) define
【答案】B -
关于接口的说法错误的是:
A) 接口中的方法默认是public abstract
B) 接口中的变量默认是public static final
C) 一个类可以实现多个接口
D) 接口可以有构造方法
【答案】D -
下列哪个不是Java的访问控制修饰符?
A) public
B) private
C) protected
D) internal
【答案】D -
关于异常处理,错误的是:
A) try块必须至少有一个catch或finally块
B) finally块中的代码总是会执行
C) catch块的顺序不影响异常捕获
D) 可以自定义异常类
【答案】C -
下列哪个集合类是线程安全的?
A) ArrayList
B) HashMap
C) Vector
D) LinkedList
【答案】C -
关于多线程,错误的是:
A) 可以通过继承Thread类创建线程
B) 可以通过实现Runnable接口创建线程
C) 线程启动调用run()方法
D) synchronized可以实现线程同步
【答案】C -
下列哪个不是Java的关键字?
A) goto
B) const
C) sizeof
D) instanceof
【答案】C -
关于Java的包,错误的是:
A) 包可以避免命名冲突
B) 一个源文件可以有多个包声明
C) import可以导入整个包
D) 包名通常使用小写字母
【答案】B -
下列哪个不是Object类的方法?
A) toString()
B) equals()
C) hashCode()
D) wait()
E) clone()
F) 以上都是Object类的方法
【答案】F -
关于数组,正确的是:
A) int[] arr = new int[3]{1,2,3};
B) int[] arr = {1,2,3};
C) int arr[] = new int[];
D) int arr[3] = new int[3];
【答案】B -
关于继承,错误的是:
A) Java支持单继承
B) 子类可以重写父类方法
C) super可以调用父类构造方法
D) final类可以被继承
【答案】D -
关于抽象类,正确的是:
A) 抽象类必须有抽象方法
B) 抽象类不能被实例化
C) 抽象方法必须有方法体
D) 抽象类不能有构造方法
【答案】B -
下列哪个运算符优先级最高?
A) &&
B) ||
C) !
D) ?:
【答案】C -
关于String和StringBuilder,正确的是:
A) String适合频繁修改字符串
B) StringBuilder是线程安全的
C) StringBuffer比StringBuilder效率高
D) String是不可变类
【答案】D -
下列哪个不是Java的集合接口?
A) List
B) Set
C) Map
D) Array
【答案】D -
关于泛型,错误的是:
A) 可以提高代码安全性
B) 可以减少类型转换
C) 泛型类可以有多个类型参数
D) 泛型类型参数可以是基本类型
【答案】D -
关于Java的IO流,正确的是:
A) FileInputStream用于读取字符
B) BufferedReader可以提高读取效率
C) ObjectOutputStream不能序列化对象
D) PrintWriter不能写入文件
【答案】B -
关于内部类,错误的是:
A) 成员内部类可以访问外部类的私有成员
B) 静态内部类不需要外部类实例
C) 局部内部类可以访问方法的final参数
D) 匿名内部类必须有类名
【答案】D -
关于Java 8新特性,错误的是:
A) 引入了Lambda表达式
B) 增加了Stream API
C) 接口可以有默认方法
D) 移除了永久代
【答案】D -
关于多态,正确的是:
A) 编译时多态通过重载实现
B) 运行时多态通过重写实现
C) 父类引用可以指向子类对象
D) 以上都正确
【答案】D -
关于Java内存区域,错误的是:
A) 方法区存储类信息
B) 堆存储对象实例
C) 虚拟机栈存储局部变量
D) 程序计数器是线程共享的
【答案】D -
关于反射,正确的是:
A) Class.forName()可以获取Class对象
B) getDeclaredMethods()获取所有方法包括继承的
C) setAccessible(true)可以访问private方法
D) 反射效率比直接调用高
【答案】A -
关于注解,错误的是:
A) @Override是内置注解
B) 注解可以影响程序运行
C) 可以自定义注解
D) 注解可以替代XML配置
【答案】B -
关于JDBC,正确的是:
A) Statement比PreparedStatement安全
B) ResultSet可以向前和向后滚动
C) Connection是线程安全的
D) DriverManager.getConnection()不需要关闭
【答案】B -
关于Java网络编程,错误的是:
A) Socket用于TCP通信
B) DatagramSocket用于UDP通信
C) ServerSocket是客户端类
D) URL可以读取网络资源
【答案】C -
关于JVM调优,正确的是:
A) -Xms设置初始堆大小
B) -Xmx设置最大方法区大小
C) -XX:PermSize设置永久代大小
D) -Xss设置堆栈大小
【答案】A -
关于设计模式,错误的是:
A) 单例模式确保一个类只有一个实例
B) 工厂模式用于创建对象
C) 观察者模式是一对多依赖
D) 装饰器模式是结构型模式
E) 以上都正确
【答案】E -
关于Java的日期时间API,正确的是:
A) Date是线程安全的
B) SimpleDateFormat是线程安全的
C) LocalDate是不可变的
D) Calendar是Java 8新增的
【答案】C -
关于Java的国际化,错误的是:
A) ResourceBundle用于资源本地化
B) Locale表示特定的地理区域
C) NumberFormat可以格式化数字
D) MessageFormat不能格式化日期
【答案】D -
关于Java的断言,正确的是:
A) assert是关键字
B) 默认启用断言
C) 断言可以替代异常处理
D) 断言表达式必须有返回值
【答案】A -
关于Java的枚举,错误的是:
A) 枚举可以有自己的方法
B) 枚举可以实现接口
C) 枚举可以继承其他类
D) 枚举值是单例的
【答案】C -
关于Java的代理,正确的是:
A) 静态代理需要手动编写代理类
B) JDK动态代理基于接口
C) CGLIB可以代理没有接口的类
D) 以上都正确
【答案】D -
关于Java的序列化,错误的是:
A) 实现Serializable接口的类可以序列化
B) transient修饰的变量不参与序列化
C) serialVersionUID用于版本控制
D) 静态变量可以被序列化
【答案】D -
关于Java的Lambda表达式,正确的是:
A) 只能用于函数式接口
B) 可以访问非final局部变量
C) this指向Lambda表达式自身
D) 不能有返回值
【答案】A -
关于Java的Stream API,错误的是:
A) stream()可以创建流
B) filter()用于过滤元素
C) map()用于转换元素
D) collect()是中间操作
【答案】D -
关于Java的Optional,正确的是:
A) 用于避免NullPointerException
B) of()可以传入null
C) isPresent()判断是否有值
D) orElse()获取值或默认值
E) 以上都正确
【答案】E -
关于Java的模块系统(JPMS),错误的是:
A) module-info.java定义模块
B) requires声明依赖
C) exports控制包的可见性
D) 模块路径替代了类路径
E) 以上都正确
【答案】E
二、判断题(10题)
-
Java是纯面向对象的编程语言。 【答案】错误(有基本数据类型)
-
final修饰的类不能被继承。 【答案】正确
-
构造方法可以被子类继承。 【答案】错误
-
接口中的方法可以有方法体。 【答案】正确(Java 8后可以有默认方法)
-
==比较对象时比较的是内容。 【答案】错误(比较引用)
-
ArrayList是线程安全的。 【答案】错误
-
finally块中的代码总是会执行。 【答案】正确
-
Java支持多重继承。 【答案】错误(只支持单继承)
-
抽象类可以有构造方法。 【答案】正确
-
String是基本数据类型。 【答案】错误
三、填空题(20题)
-
Java程序的编译命令是______。 【答案】javac
-
Java中所有类的根类是______。 【答案】Object
-
用于定义常量的关键字是______。 【答案】final
-
实现线程同步的关键字是______。 【答案】synchronized
-
Java中用于处理异常的五个关键字是______。 【答案】try、catch、finally、throw、throws
-
Java中用于表示单精度浮点数的类型是______。 【答案】float
-
用于终止当前循环的关键字是______。 【答案】break
-
Java中用于创建对象的关键字是______。 【答案】new
-
用于比较两个对象内容是否相等的方法是______。 【答案】equals()
-
Java中用于表示真值的数据类型是______。 【答案】boolean
-
Java中用于表示Unicode字符的类型是______。 【答案】char
-
用于获取数组长度的属性是______。 【答案】length
-
用于从父类调用构造方法的关键字是______。 【答案】super
-
Java中用于处理日期时间的类在______包中。 【答案】java.time
-
用于声明方法可能抛出异常的关键字是______。 【答案】throws
-
Java中用于多线程通信的三个方法是______。 【答案】wait()、notify()、notifyAll()
-
用于表示不可变字符序列的类是______。 【答案】String
-
Java中用于网络编程的类在______包中。 【答案】java.net
-
用于表示键值对集合的接口是______。 【答案】Map
-
Java中用于反射的类在______包中。 【答案】java.lang.reflect
四、编程题(5题)
1. 编写一个Java程序,计算1到100的偶数和
public class EvenSum {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {
sum += i;
}
}
System.out.println("1到100的偶数和为: " + sum);
}
}
2. 编写一个学生类(Student),包含姓名(name)、年龄(age)和成绩(score)属性,并实现Comparable接口按成绩排序
public class Student implements Comparable<Student> {
private String name;
private int age;
private double score;
public Student(String name, int age, double score) {
this.name = name;
this.age = age;
this.score = score;
}
@Override
public int compareTo(Student other) {
return Double.compare(this.score, other.score);
}
@Override
public String toString() {
return "Student{name='" + name + "', age=" + age + ", score=" + score + "}";
}
public static void main(String[] args) {
Student[] students = {
new Student("张三", 20, 85.5),
new Student("李四", 21, 78.0),
new Student("王五", 19, 92.5)
};
Arrays.sort(students);
for (Student s : students) {
System.out.println(s);
}
}
}
3. 编写一个方法,统计字符串中每个字符出现的次数
import java.util.HashMap;
import java.util.Map;
public class CharCounter {
public static Map<Character, Integer> countChars(String str) {
Map<Character, Integer> map = new HashMap<>();
for (char c : str.toCharArray()) {
map.put(c, map.getOrDefault(c, 0) + 1);
}
return map;
}
public static void main(String[] args) {
String test = "hello world";
Map<Character, Integer> result = countChars(test);
System.out.println(result);
}
}
4. 编写一个多线程程序,模拟银行账户的存取款操作,确保线程安全
public class BankAccount {
private double balance;
public BankAccount(double initialBalance) {
this.balance = initialBalance;
}
public synchronized void deposit(double amount) {
balance += amount;
System.out.println(Thread.currentThread().getName() + " 存款: +" + amount + ", 余额: " + balance);
}
public synchronized void withdraw(double amount) {
if (balance >= amount) {
balance -= amount;
System.out.println(Thread.currentThread().getName() + " 取款: -" + amount + ", 余额: " + balance);
} else {
System.out.println(Thread.currentThread().getName() + " 取款失败,余额不足");
}
}
public static void main(String[] args) {
BankAccount account = new BankAccount(1000);
// 存款线程
Thread depositThread = new Thread(() -> {
for (int i = 0; i < 5; i++) {
account.deposit(100);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "存款线程");
// 取款线程
Thread withdrawThread = new Thread(() -> {
for (int i = 0; i < 5; i++) {
account.withdraw(150);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "取款线程");
depositThread.start();
withdrawThread.start();
}
}
5. 编写一个简单的图书管理系统,包含图书类(Book)和图书管理类(Library),实现添加、删除和查询功能
import java.util.ArrayList;
import java.util.List;
class Book {
private String id;
private String title;
private String author;
public Book(String id, String title, String author) {
this.id = id;
this.title = title;
this.author = author;
}
public String getId() { return id; }
public String getTitle() { return title; }
public String getAuthor() { return author; }
@Override
public String toString() {
return "Book{id='" + id + "', title='" + title + "', author='" + author + "'}";
}
}
class Library {
private List<Book> books = new ArrayList<>();
public void addBook(Book book) {
books.add(book);
System.out.println("添加成功: " + book);
}
public boolean removeBook(String id) {
for (Book book : books) {
if (book.getId().equals(id)) {
books.remove(book);
System.out.println("删除成功: " + book);
return true;
}
}
System.out.println("未找到ID为 " + id + " 的图书");
return false;
}
public Book findBook(String id) {
for (Book book : books) {
if (book.getId().equals(id)) {
System.out.println("查询结果: " + book);
return book;
}
}
System.out.println("未找到ID为 " + id + " 的图书");
return null;
}
public void listAllBooks() {
if (books.isEmpty()) {
System.out.println("图书馆暂无图书");
return;
}
System.out.println("图书馆所有图书:");
for (Book book : books) {
System.out.println(book);
}
}
}
public class LibrarySystem {
public static void main(String[] args) {
Library library = new Library();
// 添加图书
library.addBook(new Book("001", "Java编程思想", "Bruce Eckel"));
library.addBook(new Book("002", "Effective Java", "Joshua Bloch"));
library.addBook(new Book("003", "深入理解Java虚拟机", "周志明"));
// 列出所有图书
library.listAllBooks();
// 查询图书
library.findBook("002");
library.findBook("004");
// 删除图书
library.removeBook("001");
library.removeBook("005");
// 再次列出所有图书
library.listAllBooks();
}
}