考试时间:60分钟
1 判断题。下列说法正确的打√,错误的打×。每题1分计20分。
-
构造函数是在对象被创建后,new运算符完成之前被调用的。
-
Java IO类的设计中,采用了Decorator设计模式,避免了类的层次结构过于复杂。
-
在委托事件模型中,源生成事件并把它发送给一个或多个监听器,每个监听器必须向事件源注册。
-
Java从语言级提供了对线程同步的支持。Java中每个对象都有一个用来同步的监控器。
-
-39右移3位的值为-5。
-
jsp运行在web容器中,javascript运行在浏览器中,servlet运行在web容器中,ejb运行在ejb容器中,容器运行在虚拟机中。jsp经过编译后生成servlet,编译是由容器完成的。
-
servlet在多线程模式下运行时,之所以不在doGet(),doPost()方法前加synchronized,原因是为了提高性能。但前提是在servlet中只能存放只读的实例变量,而将那些可能被修改的变量放到方法中。
-
hibernate和entity bean实现ORM功能。类之间一对一或一对多的关联关系映射成表之间的外键关系;类之间的多对多的关联关系映射成关联表和被关联表之间的外键关系。
-
EJB一般包括远程接口、Home接口、Bean类和其它工具类,以及部署描述文件。实体Bean还可能包括主键类。
-
<jsp:forward page=””/>不能转到应用程序以外的页面,而sendDirect() 则可以。
-
UML是统一建模语言,其中类图用来描述系统中类的结构以及类之间的关系;活动图用来描述用例的事件流。顺序图用来描述用例中一个事件流的实现。
-
采用工厂模式生成对象实例可以使调用方不必了解被生成对象的类的层次。即使类的层次发生变化,调用方也不用修改代码。
-
Http和TCP协议一样是有状态的协议。HTML常用来显示数据,而XML则通常用来存储数据。
-
数据库连接池允许有最大连接数和最小连接数,为提高性能,不要把两者设为相等。
-
在EJB CMR设计中,实体Bean间的关联字段不能暴露给客户端。同样Hibernate也不可以将类之间的关联字段暴露给客户端。
-
在java中不存在内存泄漏的问题。因为java虚拟机自动回收垃圾。
-
java类的类变量和实例变量位于内存的堆中,局部变量位于栈中,方法位于方法区中。
-
定义:String s1 = “uml”; String s2 = “uml”; String s3= new String(“uml”); String s4= new String(“uml”);那么,s1==s2;s3 == s4;s1.equals(s3);
-
在集合框架中,如果要访问ArrayList中的第n个元素,可以采用Iterator和get()两种方法,前者的效率更高。
-
javascript可以用来在jsp中验证数据输入的正确有效性。在一个jsp中只能有一个Form,可以使用javascript来提交jsp。
2 分析代码,写出程序执行的结果。6分
public class Static {
static int a = 5;
static String s = “”;
public Static() {
calculate();
}
public static void main(String args[]){
new Static();
new Static();
new Static().show();
}
public void calculate() {
a = a + 1;
s = s + 1;
}
public void show() {
System.out.println(“a = ” + a); //输出结果:____①_______________
System.out.println(“s = ” + s); //输出结果:_____②______________
}
static {
a = a + 10;
s = s + 1;
}
{
a = a + 5;
s = s +1;
}
}
3 根据程序说明,写出程序片断。10分
菲波那契数列的定义如下:
f(n) = f (n-1) +f(n-2) ,其中 f(1) = f(0) = 1, n >= 2。用递归算法计算出第n个元素的值。
4 分析下面的代码,必须将所有线程正确退出,请填空。10分
public class ThreadDemo {
Public static void main(String args[]) throws InterruptedException {
MyQueue queue = new MyQueue();
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
Thread.sleep(10000);
producer.setExitFlag():
consumer.setExitFlag();
___①________________
___②_________________
}
}
____③______class CommonThread implements Runnable {
MyQueue queue;
boolean exitFlag = false;
Thread thread;
CommonThread (MyQueue queue) {
this.queue = queue;
thread = new Thread(this);
__④__________;
}
public void setExitFlag() {
synchronized (this){
exitFlag = true;
}
}
public boolean testExitFlag() {
synchronized(this) {
return exitFlag;
}
}
class Consumer extends CommonThread {
Consumer(MyQueue queue) {
_⑤______________;
}
public void run() {
while (true) {
queue.get();
if (testExitFlag()) {
break;
}
}
}
}
class Producer extends CommonThread {
Producer (MyQueue queue) {
____⑥____________;
}
public void run() {
long count = 0;
while (true) {
queue.put(new String(“obj” + count));
if (testExitFlag()) {
break;
}
}
}
}
public class MyQueue {
final static int MAX_SIZE = 1024;
private ArrayList list;
public MyQueue() {
_______⑦________________
}
synchronized public void put(Object obj) {
try {
while (list.size() == MAX_SIZE) {
_____⑧_____________;
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
list.add(obj);
notifyAll();
}
synchronized public Object get() {
try {
___⑨_____________________ {
wait();
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
Object obj = list.remove(0);
___⑩__________________
return obj;
}
}
5 仔细分析下面的代码,然后填空。每空1分,计24分。
程序说明:类DynArray实现了一个动态数组。当数组的空间不够时动态分配空间。
public class DynArray {
private Object[] array;
private int index;
public DynArray() {
array = new Object[16];
index = -1;
}
// 向动态数组中添加一个对象obj。如果空间不够,重新分配空间。
public void add(Object obj) {
if (index == array.length -1) {
_⑴_
_⑵_
_⑶_
}
array[++index] = obj;
}
//从数组中删除一个指定对象。
public void remove(Object obj) {
if (index < 0) {
return;
}
for (int i = 0; i <= index; i++) {
if (array[i].equals(obj)) {
for (int j = i; j < index; j++) {
__⑷__
}
break;
}
}
index–;
}
//返回指定索引处的对象。
public Object getAt(int index) {
return array[index];
}
//返回当前数组的元素个数。
public int size() {
return index + 1;
}
}
//接口MySet定义一个集合操作
import java.util.Iterator;
public interface MySet {
public boolean put(Object obj);
public boolean remove(Object obj);
public Iterator iter();
public boolean contains(Object obj);
}
//类MyHashSet采用哈希表来存储集合元素
public class MyHashSet implements MySet {
private DynArray[] container;
private int count;
public MyHashSet() {
count = 0;
container = new DynArray[16];
}
//向集合中添加一个元素,但不允许重复元素,否则返回false。成功则返回true;
public boolean put(Object obj) {
if (contains(obj)) {
return false;
}
int hashCode = Math.abs(obj.hashCode());
int pos = _____⑸______;
if (container[pos] == null) {
______⑹_____;
}
______⑺____;
count++;
return true;
}
//从集合中删除一个元素,当集合中没有该元素时返回false。成功删除返回true;
public boolean remove(Object obj) {
if (!contains(obj)) {
return false;
}
int hashCode = Math.abs(obj.hashCode());
int pos = hashCode % container.length;
_____⑻____;
count–;
return true;
}
// 返回一个集合的迭代器
public Iterator iter() {
____⑼_____
}
// 判断集合中是否包括指定的元素。
public boolean contains(Object obj) {
Iterator iter = new MyIterator();
while (iter.hasNext()) {
Object theObj = iter.next();
if (theObj.equals(obj)) {
return true;
}
}
return false;
}
//一个实现标准Iterator接口的内部类。
class MyIterator implements Iterator {
private int containerIndex = 0;
private int iterCount = 0;
private int arrayIndex = 0;
public void remove() {
}
public boolean hasNext() {
if (___⑽______) {
return true;
}
else {
return false;
}
}
public Object next() {
Object obj = null;
while (containerIndex < container.length) {
if (container[containerIndex] == null) {
containerIndex++;
continue;
}
if (arrayIndex < container[containerIndex].size()) {
obj = ______⑾_________
arrayIndex++;
iterCount++;
break;
}
else {
containerIndex++;
arrayIndex = 0;
___⑿______
}
}
return obj;
}
}
}
6 根据UML类图的定义和关系,用java语言来实现。10分
说明:
-
Vehicle为抽象类;Car,Truck为Vehicle的子类;ICargoTransport为接口。Truck实现IcargoTransport接口。
-
类Person和Vechicle之间的关联关系如图所示。
-
Engine是一个类,它和Vehicle之间为聚合关系,即Vehicle包含Engine。
-
写出各个类、接口的定义,包括实例变量的定义,方法的定义和方法的示例性实现。
7 分析解答题。20分
设计一个学生选课系统,每个学生可以选修多门课程,多个学生可以同时选修同一门课程。学生信息为学号,姓名,课程信息为课程编号,课程名称。
-
请用SQL语句创建所需的数据库表,以及所有需要的约束等。(6分)
-
用SQL语句统计出每门课程有多少学生选修。(6分)
用SQL语句查询出选修3门或3门以上课程,并且其中选修了java课程的学生。(8分)
参考答案:
1 判断题。下列说法正确的打√,错误的打×。每题1分计20分。
1-12正确,13-20错误。
2 分析代码,写出程序执行的结果。6分
① 33
② 1111111
3 根据程序说明,写出程序片断。10分
public class Fibo {
public int f(int n) {
if (n == 0 || n == 1) {
return 1;
}
return f(n-1) + f(n-2);
}
}
4 分析下面的代码,必须将所有线程正确退出,请填空。10分
①producer.thread.join();
②consumer.thread.join();
③abstract
④thread.start();
⑤_super(queue)
⑥super(queue)
⑦list = new ArrayList(MAX_SIZE)
⑧wait()
⑨while(list.size==0)
⑩_notifyAll();
5 仔细分析下面的代码,然后填空。每空1分,计24分。
⑴ |
Object[] tempArray = new Object[array.length + 1] |
⑵ |
System.arraycopy(array,0,tempArray,0,array.length); |
⑶ |
array = tempArray; |
⑷ |
array[j] = array[j+1]; |
⑸ |
hashCode % container.length; |
⑹ |
container[pos] = new DynArray() |
⑺ |
container[pos].add(obj); |
⑻ |
container[pos].remove(obj); |
⑼ |
return new MyIterator(); |
⑽ |
iterCount < count |
⑾ |
container[containerIndex].getAt(arrayIndex) |
⑿ |
continue; |
6 根据UML类图的定义和关系,用java语言来实现。10分
public abstract class Vehicle {
private Engine engine;
public Vehicle() {
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public abstract String go();
public void startEngine() {
if (this.engine != null) {
this.engine.start();
}
}
public void stopEngine() {
if (this.engine != null) {
this.engine.stop();
}
}
public boolean isEngineOn() {
if (this.engine != null) {
return this.engine.isOn();
}
return false;
}
}
public class Car extends Vehicle{
public Car() {
}
public String go() {
if (this.isEngineOn()) {
return “!!!!”;
}
else {
return “…”;
}
}
}
public interface CargoTransport {
public void loadCargo();
}
public class Truck extends Vehicle implements CargoTransport {
public Truck() {
}
public String go() {
if (this.isEngineOn()) {
return “!!!”;
}
else {
return “…”;
}
}
public void loadCargo() {
System.out.println(“truck can load cargo.”);
}
}
public class Engine {
private boolean on;
public Engine() {
}
public void start() {
this.on = true;
}
public void stop() {
this.on = false;
}
public boolean isOn() {
return this.on;
}
}
public class Person {
private Vector vehicles = new Vector();
public Person() {
}
public void addVehicle(Vehicle v) {
vehicles.addElement(v);
}
}
7 分析解答题。20分
-
请用SQL语句创建所需的数据库表,以及所有需要的约束等。
create table student (id number not null, name nvarchar2(10), constraint pk_student primary key (id));
create table course(id number not null, name nvarchar2(10), constraint pk_course primary key (id));
create table enrollment(studentid number not null, courseid number not nul, constraint pk_enrollment primary key(studentid,courseid),constraint fk_student foreign key (studentid) references student(id),constraint fk_course foreign key (courseid) references course(id));
-
用SQL语句统计出每门课程有多少学生选修。
select course.name,count(course.name) from enrollment,course
where enrollment.courseid = course.id group by course.name
-
用SQL语句查询出选修3门或3门以上课程,并且其中选修了java课程的学生。
select * from student where student.id in
(
select enroll.studentid from student,enroll
where student.id = enroll.studentid group by enroll.studentid,student.name
having count(enroll.studentid) >= 3
)
and student.id in
(
select enroll.studentid from enroll,course where enroll.courseid = course.id and course.name = ‘java’
)