Java 部分
1 .求两个数的最大公约数
解答:
欧几理德原理 : 辗转相除法
public static int zdgys(int a,int b){
int x = a%b;
if(x==0) return b;
else return zdgys(b,x);
}
2. 关于 java 垃圾回收器的认识
解答:
对于 GC 来说,当程序员创建对象时, GC 就开始监控这个对象的地址、大小以及使用情况。通常, GC 采用有向图的方式记录和管理堆 (heap) 中的所有对象。通过这种方式确定哪些对象是 " 可达的 " ,哪些对象是 " 不可达的 " 。当 GC 确定一些对象为 " 不可达 " 时, GC 就有责任回收这些内存空间。可以。程序员可以手动执行 System.gc() ,通知 GC 运行,但是 Java 语言规范并不保证 GC 一定会执行。
3. 请问如何设计一个类,使其只能被初始化为一个实例。
解答:
Singleton 模式主要作用是保证在 Java 应用程序中,一个类 Class 只有一个实例存在。
第一种形式 : 定义一个类,它的构造函数为 private 的,它有一个 static 的 private 的该类变量,在类初始化时实例话,通过一个 public 的 getInstance 方法获取对它的引用 , 继而调用其中的方法。
附件:
package parent.career.blest;
class Singleton {
private Singleton(){}// 在外部用 new 关键字会报错,只供内部使用
// 注意这是 private 只供内部调用
private static Singleton instance = new Singleton();
// 这里提供了一个供外部访问本 class 的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
public void say(String str){
System.out.println(str);
}
}
class commonClass{
public commonClass(){
System.out.println(" 这是一个普通类 ");
}
}
public class mySingleton{
public static void main(String args[])
{
Singleton sl = Singleton.getInstance();
Singleton sl2 = Singleton.getInstance();
sl.say("hello,world!");
sl2.say("hello,world again!");
System.out.println(sl==sl2);// 输出 true, 说明 sl,sl2 指向同一个实例
commonClass cC = new commonClass();
commonClass cC2 = new commonClass();
System.out.println(cC==cC2);// 输出 false, 说明 cC,cC2 分别指向不同的实例
}
}
4 .有一个 1001 个元素的数组 a[n] ,每个元素都在 1 到 1000 这些整数中取值,其中有一个数值重复了,现在要设计一个算法找出这个数字,且每个元素只能被访问一次。不能用辅助的存储容器。
解答:
This number = (a[0]+a[1]+a[3]+ …… a[1000])-(1+2+3+ …… +1000)
servlet 生命周期以及 servlet 基本构架
解答:
servlet 有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由 javax.servlet.Servlet 接口的 init,service 和 destroy 方法表达。
Servlet 的基本架构:
public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
}
5. 死锁的四个必要条件
解答:
> 互斥条件:某段时间内某资源只能由一个进程使用。
> 请求和保持:进程因请求资源而阻塞时,对已分配给它的资源保持不放。
> 不剥夺条件:资源在未使用完前,不能被剥夺,由使用进程释放。
> 环路条件:发生死锁时,有向图必构成一环路。
7 . EJB 是基于哪些技术实现的?并说出 SessionBean 和 EntityBean 的区别, StatefulBean 和 StatelessBean 的区别。
解答:
EJB 包括 Session Bean 、 Entity Bean 、 Message Driven Bean ,基于 JNDI 、 RMI 、 JAT 等技术实现。
SessionBean 在 J2EE 应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他 EJB 组件。 EntityBean 被用来代表应用系统中用到的数据。
对于客户机, SessionBean 是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。
对于客户机, EntityBean 是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。
Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean 都可以将系统逻辑放在 method 之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体。 Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候, EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method 。换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。
8 . sleep() 和 wait() 有什么区别 ?
解答:
sleep 是线程类( Thread )的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。
wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll )后本线程才进入对象锁定池准备获得对象锁进入运行状态。
9 . forward 和 redirect 的区别
解答:
forward 是服务器请求资源,服务器直接访问目标地址的 URL ,把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect 就是服务端根据逻辑 , 发送一个状态码 , 告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以 session,request 参数都可以获取。
10 .冒泡排序算法
解答:
package parent.career.blest;
/**
* 冒泡排序算法演示 : 从小到大排列数组元素
* 原理:第一个元素和后面的一个元素比较,比较结果再和后面一个元素比较,依次类推
* 接着,第二个和后面元素比较,依次类推
*/
public class Maopao{
public static int[] mppx(int[] array){
for(int i =0;i<array.length; i++){
for(int j=i; j<array.length; j++){
int temp;
if(array[i]>array[j]){
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
return array;
}
public static void main(String args[]){
// 测试
int[] ar ={12,23,1,23,45,11,42,9,45,2,16,77,86,56,43};
ar = mppx(ar);
for(int i = 0;i<ar.length;i++){
System.out.print(ar[i]+" ");
}
}
}
11 .从键盘接收一个整数,并用递归求其阶乘。
解答:
package parent.career.blest;
import java.io.*;
/**
* 用递归求阶乘算法
* 从键盘接收一个整数,然后求其阶乘
*/
public class DG_JC{
public static int DG(int n){
if(n==1) return 1;
else return n*DG(n-1);
}
public static void main(String args[]){
int n = 0;
System.out.print(" 请输入一个整数: ");
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
br.close();
}catch(IOException e){
e.printStackTrace();
}
System.out.println(" 阶乘 "+n+"! = "+DG(n));
}
}
12 .什么时候使用 assert?
解答: 断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true 。如果表达式计算为 false ,那么系统会报告一个 Assertionerror 。它用于调试目的:
| assert(a > 0); // throws an Assertionerror if a <= 0 |
断言可以有两种形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
13 . 谈谈 final, finally, finalize 的区别。
解答:
final— 修饰符(关键字)如果一个类被声明为 final ,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract 的,又被声明为 final 的。将变量或方法声明为 final ,可以保证它们在使用中不被改变。被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final 的方法也同样只能使用,不能重载。
finally— 再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize— 方法名。 Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。 finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
14 . Collection 和 Collections 的区别。
解答:
Collections 是个 java.util 下的类,它包含有各种有关集合操作的静态方法。
Collection 是个 java.util 下的接口,它是各种集合结构的父接口。
15 .说出 ArrayList,Vector, LinkedList 的存储性能和特性
解答: