Java语言程序设计综合试题
选择题 (每题2分,共20分)
-
下列哪个是Java语言中正确的标识符? A.
classB.2variableC.$valueD.user-name -
关于
final关键字,以下说法正确的是? A.final修饰的类可以被继承 B.final修饰的方法可以被重写 C.final修饰的变量必须被初始化,且之后不能再被修改 D.final修饰的局部变量必须在声明时初始化 -
在Java中,以下哪个关键字用于抛出一个异常? A.
tryB.catchC.throwD.throws -
给定以下代码,输出结果是什么?
String s1 = new String("hello"); String s2 = new String("hello"); System.out.println(s1 == s2); System.out.println(s1.equals(s2));A.
true,trueB.false,trueC.true,falseD.false,false -
以下关于
ArrayList和LinkedList的说法,错误的是? A.ArrayList基于动态数组实现,随机访问(get/set)效率高 B.LinkedList基于链表实现,插入和删除元素效率高 C.LinkedList实现了RandomAccess接口 D.ArrayList在添加元素时可能需要扩容,有一定性能开销 -
要实现多线程,以下哪种方式不正确? A. 继承
Thread类并重写run()方法 B. 实现Runnable接口并实现run()方法 C. 实现Callable接口并实现call()方法,然后用FutureTask包装 D. 继承Runnable接口 -
以下哪个是Java中基本数据类型
int的包装类? A.IntB.IntegerC.INTD.int -
在Java中,以下哪个关键字用于创建一个对象的实例? A.
classB.newC.thisD.instanceof -
以下关于接口的说法,正确的是? A. 接口可以包含具体的方法实现 B. 一个类可以实现多个接口 C. 接口可以继承另一个接口 D. 以上说法都正确
-
以下哪个集合是线程安全的? A.
HashMapB.ArrayListC.VectorD.LinkedList
填空题 (每空2分,共20分)
- Java的三大核心特性是:、_____。
- 在Java中,使用
_________关键字可以创建一个对象的实例。 - 在异常处理中,
try块后可以跟一个或多个_________块,或者一个_________块。 String类被声明为final,因此它不能被_____。- Java集合框架中,
Map接口的主要实现类有HashMap和_________。 - 要在子类中调用父类的构造方法,应使用
_________关键字。 - 在Java中,
_________运算符用于检查一个对象是否是某个类或其子类的实例。 - Java程序运行的入口方法是
_________。 finally块中的代码总是会被执行,即使try块中发生了_________或return语句。- 在Java中,使用
_________关键字可以声明一个常量。
简答题 (每题10分,共30分)
- 简述和
equals()方法的区别。 - 请解释什么是方法重载和方法重写,并说明它们的主要区别。
- 简述
HashMap的工作原理,包括put方法的基本流程。
编程题 (共30分)
-
(15分) 编写一个Java程序,实现一个简单的
Student类。- 属性:
id(学号,int),name(姓名,String),score(成绩,double)。 - 要求:
- 提供无参构造方法和带参构造方法。
- 为所有属性提供
getter和setter方法。 - 重写
toString()方法,返回格式为:Student[id=xxx, name=xxx, score=xxx.x]。 - 重写
equals()方法,只要id相同就认为两个Student对象相等。
- 属性:
-
(15分) 编写一个Java程序,使用
ArrayList来存储Student对象,并实现以下功能:- 创建3个
Student对象,并添加到ArrayList中。 - 遍历
ArrayList,打印出所有学生的信息。 - 计算并打印出所有学生的平均成绩。
- 创建3个
参考答案与解析
选择题
- C,解析:标识符规则:以字母、下划线
_或美元符开头,后续可以跟字母、数字、下划线或美元符。class是关键字,2variable以数字开头,user-name包含非法字符。 - C,解析:
final修饰的类不能被继承,final修饰的方法不能被重写。final修饰的成员变量必须在声明时或构造器中初始化;而final修饰的局部变量可以在声明时或使用前初始化。 - C,解析:
try和catch是异常处理的结构块,throw用于手动抛出一个异常对象,throws用于声明一个方法可能抛出的异常。 - B,解析:比较的是两个对象的内存地址(引用),
s1和s2是两个不同的对象,地址不同,所以为false。equals()方法在String类中被重写,用于比较字符串内容是否相同,所以为true。 - C,解析:
LinkedList是基于链表实现的,它不支持像数组那样的随机访问,因此没有实现RandomAccess接口。ArrayList实现了该接口。 - D,解析:
Runnable是一个接口,不能被继承,创建线程的正确方式是继承Thread类或实现Runnable/Callable接口。 - B,解析:Java为每个基本数据类型都提供了对应的包装类,
int的包装类是Integer。 - B,解析:
new关键字用于在堆内存中创建一个对象实例。 - D,解析:从Java 8开始,接口中可以包含
default和static方法的具体实现,一个类可以实现多个接口,一个接口可以继承另一个接口(使用extends关键字)。 - C,解析:
Vector是线程安全的,它的很多方法都使用了synchronized关键字。HashMap,ArrayList,LinkedList都是非线程安全的。
填空题
- 封装、继承、多态。
- new。
- catch、throws。
- 继承。
- TreeMap。
- super。
- instanceof。
- public static void main(String[] args)。
- 异常。
- final。
简答题
-
和
equals()的区别:- :
- 如果作用于基本数据类型(如
int,double),比较的是两个值是否相等。 - 如果作用于引用数据类型(如
String,Student),比较的是两个对象的内存地址(引用)是否相同,即是否指向同一个对象。
- 如果作用于基本数据类型(如
equals():- 是
Object类中的一个方法,用于判断两个对象在逻辑上是否“相等”。 Object类中的equals()方法默认也是使用来比较,即比较内存地址。- 许多类(如
String,Integer,Date以及我们自己定义的类)都重写了equals()方法,以实现特定的逻辑相等性判断。String的equals()比较字符串内容。
- 是
- :
-
方法重载与方法重写:
- 方法重载:
- 定义:在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同(参数个数、参数类型或参数顺序不同)。
- 目的:功能类似,但参数不同时,可以使用相同的方法名,提高代码可读性。
- 与返回值类型无关。
- 方法重写:
- 定义:在子类中,对从父类继承的方法进行重新实现,要求方法名、参数列表、返回值类型(或其子类)必须与父类中被重写的方法完全一致。
- 目的:子类可以根据自己的需求,实现特定的功能,覆盖父类的原有实现。
- 访问权限不能比父类更严格(public > protected > default > private)。
- 抛出的异常不能比父类更宽泛。
- 主要区别:
- 位置不同:重载在同一个类中,重写在父子类中。
- 参数列表要求不同:重载要求参数列表不同,重写要求参数列表相同。
- 与返回值关系不同:重载与返回值无关,重写要求返回值类型相同或为其子类。
- 目的不同:重载是为了方便调用,重写是为了实现多态。
- 方法重载:
-
HashMap的工作原理:HashMap基于哈希表(也称为散列表)实现,它内部由一个数组(Node[] table)和链表/红黑树组成。put方法基本流程:- 计算哈希值:调用
key.hashCode()方法获取键的哈希码。 - 计算索引:通过一个哈希函数(通常是
hash & (n-1),其中n是数组的长度)将哈希码转换成数组中的索引位置。 - 处理冲突:
- 如果该索引位置为空,则直接创建一个新的
Node节点(包含key, value, hash, next)放入该位置。 - 如果该索引位置不为空(发生哈希冲突),则遍历该位置的链表或红黑树:
- 遍历过程中,如果发现某个节点的
key与要插入的key通过equals()方法比较后相等,则用新的value覆盖旧的value,并返回旧值。 - 如果遍历完都没有找到相等的
key,则将新的Node节点添加到链表的末尾(JDK 7及之前)或红黑树中(JDK 8之后,当链表长度超过阈值TREEIFY_THRESHOLD时,会转换为红黑树以提高查询效率)。
- 遍历过程中,如果发现某个节点的
- 如果该索引位置为空,则直接创建一个新的
- 扩容:当
HashMap中的元素数量(size)超过容量(capacity)和负载因子(loadFactor)的乘积时,HashMap会进行扩容,扩容会创建一个新的、容量更大的数组,并将所有旧元素重新计算索引并迁移到新数组中。
- 计算哈希值:调用
编程题
Student类实现
public class Student {
// 1. 属性
private int id;
private String name;
private double score;
// 2. 无参构造方法
public Student() {
}
// 3. 带参构造方法
public Student(int id, String name, double score) {
this.id = id;
this.name = name;
this.score = score;
}
// 4. getter和setter方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
// 5. 重写toString()方法
@Override
public String toString() {
return "Student[id=" + id + ", name=" + name + ", score=" + score + "]";
}
// 6. 重写equals()方法
@Override
public boolean equals(Object obj) {
// 1. 检查是否是同一个对象
if (this == obj) {
return true;
}
// 2. 检查obj是否为null,或者是否是Student类的实例
if (obj == null || getClass() != obj.getClass()) {
return false;
}
// 3. 类型转换
Student other = (Student) obj;
// 4. 比较id
// 注意:int是基本类型,直接用==比较
return this.id == other.id;
}
}
ArrayList操作程序
import java.util.ArrayList;
public class StudentManager {
public static void main(String[] args) {
// 1. 创建ArrayList来存储Student对象
ArrayList<Student> studentList = new ArrayList<>();
// 2. 创建3个Student对象并添加到ArrayList中
studentList.add(new Student(1, "张三", 88.5));
studentList.add(new Student(2, "李四", 92.0));
studentList.add(new Student(3, "王五", 76.5));
// 3. 遍历ArrayList,打印所有学生信息
System.out.println("所有学生信息:");
for (Student student : studentList) {
System.out.println(student);
}
// 4. 计算并打印平均成绩
if (!studentList.isEmpty()) {
double totalScore = 0;
for (Student student : studentList) {
totalScore += student.getScore();
}
double averageScore = totalScore / studentList.size();
System.out.println("\n所有学生的平均成绩是: " + averageScore);
} else {
System.out.println("没有学生数据,无法计算平均成绩。");
}
}
}
程序输出结果:
所有学生信息:
Student[id=1, name=张三, score=88.5]
Student[id=2, name=李四, score=92.0]
Student[id=3, name=王五, score=76.5]
所有学生的平均成绩是: 85.66666666666667 