简答题
1.HashMap,LinkedMap,TreeMap的区别
HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap不支持线程同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致性。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
2.BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典的方法
属于处理流中的缓冲流,可以将读取的内容存在内存里面,有readLine()方法
3.throw 和 throws这两个关键字在java中有什么不同?
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛 出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛 出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层 调用处理。
4.如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理
4.什么是线程池? 为什么要使用它?
线程池是在任务数过多的情况下使用,线程池一创建就存在了默认个数的空线程等待接收任务执行,随着任务数的不断增加,线程池也会自动创建新的线程去接收任务并执行直到增加到 线程的上限数目,当其中一个线程执行完一个任务并不会立即销毁关闭,而是判断是否还有其他任务,有就接着执行任务,线程池避免了因频繁创建新线程和摧毁线程的开销
5.Servlet的生命周期
Servlet 生命周期:Servlet 加载—>实例化—>服务—>销毁。
init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。
service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
destroy(): 仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
6.什么是事务?
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。 事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。
四.代码题(20分,每题10分)
1.请写出常见的单例模式(写出一种得5分。两种10分)
第一种懒汉式(线程不安全)
public class SingletonDemo1 {
private static SingletonDemo1 instance;
private SingletonDemo1(){}
public static SingletonDemo1 getInstance(){
if (instance == null) {
instance = new SingletonDemo1();
}
return instance;
}
}
第二种懒汉式(线程安全)
public class SingletonDemo2 {
private static SingletonDemo2 instance;
private SingletonDemo2(){}
public static synchronized SingletonDemo2 getInstance(){
if (instance == null) {
instance = new SingletonDemo2();
}
return instance;
}
}
饿汉式
public class SingletonDemo3 {
private static SingletonDemo3 instance = new SingletonDemo3();
private SingletonDemo3(){}
public static SingletonDemo3 getInstance(){
return instance;
}
}
2.请写出你常用的一种排序方式(写出一种以上得10分)
/**
* 冒泡法排序
* 比较相邻的元素。如果第一个比第二个小,就交换他们两个。
* 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最小的数。
* 针对所有的元素重复以上的步骤,除了最后一个。
* 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
* `public static void bubbleSort(int[] a) {
int temp;
int size = a.length;
for(int i=1; i<size; i++) {
for(int j=0; j<size-i; j++) {
if(a[j] < a[j+1]) {
temp = a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
for(int aa : a)
System.out.print(aa+",");
System.out.println();
}
}
快速排序:
public static void quickSort01(int[] a, int start, int end) {
if(start >= end)
return;
int i = start;
int j = end;
int base = a[start];
while(i != j) {
while(a[j] >= base && j > i)
j--;
while(a[i] <= base && i < j)
i++;
if(i < j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
a[start] = a[i];
a[i] = base;
te(a, start, i - 1);
te(a, i + 1, end);
}
*/
/**
* 选择排序
* 在未排序序列中找到最小元素,存放到排序序列的起始位置
* 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列起始位置。
* 以此类推,直到所有元素均排序完毕。
*/
public static void selectSort(int[] numbers) {
int size = numbers.length;
int temp;
for (int i = 0; i < size; i++) {
int k = i;
for (int j = size - 1; j >i; j--) {
if (numbers[j] < numbers[k]) {
k = j;
}
}
temp = numbers[i];
numbers[i] = numbers[k];
numbers[k] = temp;
}
}
/**
* 插入排序
* 从第一个元素开始,该元素可以认为已经被排序
* 取出下一个元素,在已经排序的元素序列中从后向前扫描
* 如果该元素(已排序)大于新元素,将该元素移到下一位置
* 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
* 将新元素插入到该位置中
* 重复步骤2
*/
public static void insertSort(int[] numbers) {
int size = numbers.length, temp, j;
for(int i=1; i<size; i++) {
temp = numbers[i];
for(j = i; j > 0 && temp < numbers[j-1]; j--)
numbers[j] = numbers[j-1];
numbers[j] = temp;
}
}
五.SQL语句(30分)
系统中有一个表WCEmploy(职工号,姓名,部门名,工种,工资)
1.请用一个SQL语句查询每个部门的总人数
select department_name ,COUNT(DISTINCT id) from wcemploy GROUP BY department_name
2.请用一个SQL语句查询出不同部门的担任“钳工”的职工平均工资
select department_name ,AVG(salary) from wcemploy where type=’钳工’ GROUP BY department_name
3.请用一个SQL语句查询出不同部门的担任“钳工”的职工平均工资高于2000的部门
select department_name ,AVG(salary) as avgsalary from wcemploy where type=’钳工’ GROUP BY department_name HAVING AVG(salary)>2000
4.请用一个SQL语句查询每个部门低于平均工资的员工信息
select * from wcemploy w ,(select AVG(salary) as davg,department_name from wcemploy GROUP BY department_name)t where w.department_name = t.department_name and w.salary