JAVA 笔 试 题
本次笔试题时间共 60 分钟,如空间不够请在背面书写。
一.
不定向选择题(每小题 3 分,共 10 题)
1. List,Set,Map 是否继承自 Collection 接口
A. 都是 B. 都不是 C.List,Set 是 D.Set,Map 是
正确答案( C )
2. 下面描述哪个是正确的
A. 构造器 Constructor 可被 override
B. 可以继承 String 类
C. Try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally{}里的 code 不会被执
行
D. 两个对象值相同(x.equals(y) == true),那么也有相同的 hash code
正确答案( CD )
3. Abstract 的 method 是 否 可 同 时 是 static, 是 否 可 同 时 是 native, 是 否 可 同 时 是
synchronized
A. 都能 B.都不能 C.可以为 static D.可以为 native
正确答案( B )
4. 下面的程序中,temp 的最终值是什么?
long temp=(int)3.9;
temp%=2;
A. 0 B.1 C. 2 D.3
正确答案( B )
5. 下面的语句会产生什么样的输出?
System.out.println(4&7);
A. 4
B. 5 C.6 D.7
正确答案( A )
6. 请在以下选项中选出是基本数据类型的选项( )
C.boolean
D.String
A.int
B.byte
正确答案( ABC )
7. 阅读下面代码:
public class Test {
public static void main (String args[]) {
int i = 0Xfffffff5;
int j = ~i;
System.out.println(“The value of j is : ”+ j);
]
]
输出 j 的结果是( )
B. 1
A. 10
正确答案是( A )
8.阅读以下代码段
C. 14
D.-15
byte k = 3;
System.out.println(k<<3);
System.out.println(k>>1);
请选择输出结果( )
A.9.2
B.
24.1
C. -24.0
D.16.-1
正确答案( B )
9. 阅读下面代码,选择执行结果;
Math.round(12.367*Math.round (10.2))/Math.round (10.2);
A.12.36
B.12
C.12.37
D.12.3
正确答案( B )
10. 给出以下代码的输出结果
public class Testdata {
public String getValue () {
String value = “ ”;
try{
value = “test1”;
return value;
} catch(Exception e) {
e.printStackTrace();
} finally{
value = “test12” ;
}
return value;
}
public static void main(String args[]) {
TestData test = new TestData();
String a = test.getValue();
System.out.println(a);
}
}
A. test1
B.test2
C.null
D.” ”
正确答案( A )
判断题,如果有错误,请指出并修正。(每小题 3 分,共 5 题)
二.
1.
interface A{
Int a = 0;
}
class B{
int a =1;
}
class C extends B impleaents A {
public void pX() {
Systen.out.println(a);
}
public static void main(String[] args) {
new C().pX();
}
}
答案:
方法 pX()中的变量 a 有歧义,正确的写法是 A.a.
原因:在 static 方法 main 中只能引用 static 变量,而 interface 中的变量默认访问范围是 public
static,但是 class 中的变量默认访问范围是 package.
2.
class Data {
int i = 1;
}
public class TestData {
Data al = new Data();
final Data a2 = new Data();
final Data a21;
static final Data a3 = new Data();
public static void main(String[] args) {
TestData test = new TestData();
test.a21 = new Data();// (1)
test.al = new Data();//(2)
test.a2 = new Data();//(3)
test.a3 = new Data();//(4)
}
}答案:
1.class TestData 中变量 a21 是 final 类型的变量,应该在声明时初始化.
2.main 方法中 test.a2, test.a21, test.a3 均为 final 类型,不能被赋值.
3.
abstract class Something {
private abstract String dosomethin () ;
}
答案:
在抽象类中的抽象方法修饰符中只能是 public 或者 protected,不能是 private.
简答题(每小题 6 分,共 3 题)
三.
1. String s =new String(“xyz”);创建了几个 String Object? 创建了哪几个对象?
答:
创建 2 个 String Object.
字符串对象“xyz”被创建,并保存到字符串池中.
对象引用 s 所指向的对象是通过 new 创建的,其值共享字符串池中”xyz”的值.
知识扩展:
1.
String a = "abc" ;
String b = "def" ;
String c = "abc" + "def" ;
问:上面三行创建了几个对象?
答:3 个 String Object,分别是字符串”abc”,”def”,”abcdef”.
String a = “abc” ;
String b = new String(“abc”);
问:上面两行创建了几个对象?
答:2 个对象,分别是字符串池中的”abc”对象,由 b 引用的通过 new 创建的 String 对象.
2.
3.
String a = "abc" ;
String b = "def" ;
String c = "abc" + "def" ;
System.out.println(c == d);
问:输出结果?
答:false
2. Sleep() 和 wait()有什么区别?
答:
sleep()使当前线程陷入休眠状态.
wait()使线程陷入等待状态,除非被唤醒.
知识扩展:
休眠状态的线程不释放运行资源,在休眠结束后,直接进入运行状态,而不用等待被
JVM 线程调度器再次选中.这是和等待状态的最大区别.
等待状态是一种特殊的就绪状态.使线程陷入等待状态是指暂时剥夺了线程当前所拥有
的 CPU 时间片和获取 CPU 时间片的资格,使其进入就绪状态.除非被唤醒,或者等待时间已满,
该线程将一直等待,不会被赋予 CPU 时间片.处于等待状态的线程一旦恢复执行,将从上次结
束执行时的端点处开始执行,而不是从头开始.唤醒在此对象上等待的一个线程,用 notify()方
法,唤醒在此对象上等待的所有线程,用 notifyAll()方法。
3. 接口是否可以继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具
体类(concrete class)?
答:
接口可以继承(extends)接口.
抽象类可以实现(implements)接口.
抽象类可以继承(extends)具体类.
四. 问答与编程(总分:37 分)
1.forward 和 redirect 的区别 (7 分)
答:
forward 是转发请求,是服务器端的协作,转发过程没有客户端参与.转发是在同一个请求
当中,所有请求作用域的参数在转发的页面间都是有效的.
redirect 是重定向,中间需要浏览器的协作.重定向是作为不同的请求来看待的,所有请求
作用域的参数在重定向到下一个页面时都会失效.
2.说出数据库连接池的工作机制是什么?(12 分)
答:
创建缓冲池对象,用于保存和管理数据库连接,并初始化若干个空闲连接。
对于一个数据库访问请求,如果缓冲池对象中有空闲连接,则直接从缓冲池中取得一个
连接;如果缓冲池对象的空闲队列中没有连接,且连接数尚未达到最大连接数,则创建一个
新的连接,返回给请求线程。
访问请求结束时,将连接放入缓冲池对象的空闲队列。如果空闲连接数大于初始空闲连
接数,则释放连接。
3. 数据库编程(18 分)
有三张表,学生表(student),学生课程表(course),学生分数表(score),请设计三
张表的结构,并实现以下要求:
(1) 统计每个学生各科目平均分,要求显示学生姓名,平均分值,并筛选出平均分大于
60 的学生,显示顺序按照平均分降序排列。
(2) 写出以上功能的 sql 语句。
答:
一. 创建表结构:
--创建学生信息表
create table student(
id int NOT NULL AUTO_INCREMENT ,
name varchar(20) COMMENT '姓名',
PRIMARY KEY (id)
--创建课程信息表
create table course(
id int NOT NULL AUTO_INCREMENT ,
name varchar(20) COMMENT '课程名称',
PRIMARY KEY (id)
--创建分数信息表
create table score(
id INT NOT NULL AUTO_INCREMENT ,
studentId INT(20) COMMENT '学生 Id',
courseId INT(20) COMMENT '课程 Id',
score DOUBLE COMMENT '分数',
PRIMARY KEY (id)
);
);
);
二. 查询学生平均分:
SELECT b.name student , AVG(a.score) score
FROM score a , student b , course c
WHERE a.studentId = b.id AND a.courseId = c.id
GROUP BY student
ORDER BY score DESC ;
五.
编程题(20 分)
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节数截取的字符
串,但是要保证汉字不被截半个,如“我 ABC”4,应该截为“我 AB”,输入“我 ABC 汉 DEF”
6,应该输出为“我 ABC”而不是“我 ABC+汉的半个”。
/**
* 按字节数取子字符串,如果最后的字节是半个汉字,则舍去,如:"good 中国",
取 5 个字节,则为"good"
* @param str 原始字符串
* @param num 截取的字节数
* @return 结果字符串
* @author yangxuefeng 2009-7-4
*/
public String split(String str , int byteNum) throws Exception{
//入参校验
if(null == str || 0 == str.trim().length()){
throw new Exception("输入参数:字符串不能为空") ;
}
if(byteNum <= 0){
throw new Exception("输入参数:字节数必须大于 0") ;
}
//将字符串转换为字节数组
byte array [] = str.getBytes();
if(byteNum > array.length){
throw new Exception("输入参数:字节数不能大于"+array.length) ;
}
//汉字字节长度
int cnByteNum = 0 ;
//累计汉字字节数
for (int i = 0; i < byteNum; i++) {
if (array[i] < 0) {//汉字字节
++ cnByteNum;
}
}
//如果汉字字节长度不是 2 的倍数,则舍去一个字节
int result = (cnByteNum % 2 == 0)?byteNum:byteNum-1;
return new String(array, 0, result);
}
算法题:
任取 1 到 13 数字中的 4 个数字(不重复),判断值相加是否等于 24,写出思路即可。