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方法获取对它的引用,继而调用其中的方法。
附件:
packageparent.career.blest;
class Singleton {
private Singleton(){}//在外部用new关键字会报错,只供内部使用
//注意这是private只供内部调用
private static Singleton instance = newSingleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
publicstatic Singleton getInstance() {
returninstance;
}
publicvoid say(String str){
System.out.println(str);
}
}
class commonClass{
public commonClass(){
System.out.println("这是一个普通类");
}
}
public classmySingleton{
public static void main(String args[])
{
Singleton sl =Singleton.getInstance();
Singleton sl2 =Singleton.getInstance();
sl.say("hello,world!");
sl2.say("hello,worldagain!");
System.out.println(sl==sl2);//输出true,说明sl,sl2指向同一个实例
commonClass cC = newcommonClass();
commonClass cC2 = newcommonClass();
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(HttpServletRequestrequest, HttpServletResponse response) throws
ServletException, IOException {
}
public void doGet(HttpServletRequestrequest, HttpServletResponse response) throws
ServletException, IOException {
}
}
5. 死锁的四个必要条件
解答:
>互斥条件:某段时间内某资源只能由一个进程使用。
>请求和保持:进程因请求资源而阻塞时,对已分配给它的资源保持不放。
>不剥夺条件:资源在未使用完前,不能被剥夺,由使用进程释放。
>环路条件:发生死锁时,有向图必构成一环路。
7.EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。
解答:
EJB包括Session Bean、EntityBean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。
对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。
对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。
Session Bean 还可以再细分为 Stateful Session Bean与 StatelessSession Bean,这两种的 Session Bean都可以将系统逻辑放在method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean的实体。Stateless Session Bean虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean的时候,EJBContainer并不会找寻特定的 Stateless Session Bean的实体来执行这个 method。换言之,很可能数个使用者在执行某个 Stateless Session Bean的 methods时,会是同一个 Bean的 Instance在执行。从内存方面来看,Stateful Session Bean与 Stateless Session Bean比较, Stateful Session Bean会消耗 J2EEServer较多的内存,然而 Stateful Session Bean的优势却在于他可以维持使用者的状态。
8.sleep()和 wait()有什么区别?
解答:
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
9.forward和redirect的区别
解答:
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
10.冒泡排序算法
解答:
packageparent.career.blest;
/**
* 冒泡排序算法演示:从小到大排列数组元素
* 原理:第一个元素和后面的一个元素比较,比较结果再和后面一个元素比较,依次类推
* 接着,第二个和后面元素比较,依次类推
*/
public classMaopao{
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.从键盘接收一个整数,并用递归求其阶乘。
解答:
packageparent.career.blest;
import java.io.*;
/**
* 用递归求阶乘算法
* 从键盘接收一个整数,然后求其阶乘
*/
public class DG_JC{
publicstatic int DG(int n){
if(n==1)return 1;
elsereturn n*DG(n-1);
}
publicstatic void main(String args[]){
intn = 0;
System.out.print("请输入一个整数:");
try{
BufferedReaderbr = new BufferedReader(new InputStreamReader(System.in));
n= Integer.parseInt(br.readLine());
br.close();
}catch(IOExceptione){
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的存储性能和特性
解答:
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
16.ArrayList和Vector的区别,HashMap和Hashtable的区别
解答:就ArrayList与Vector主要从二方面来说:
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
就HashMap与HashTable主要从三方面来说:
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value
17.不用字符串处理函数,怎么实现以单词为单位的逆序
例如:从控制台输入 hello word **
输出:** word hello
解答:
public class hello{
public static void main(String[] args) throws IOException {
for (int i = args.length - 1; i >=0; i--) {
System.out.print(args[i] + "");
}
}//执行时,跟数组元素,如:java hello wei gui ping (现在args[]={wei,gui,ping})
18.构造一个类来描述屏幕上的一个点,该类的构成包括点的x和y两个坐标,以及一些对点进行的操作,包括:取得点的坐标值,对点的坐标进行赋值,编写应用程序生成该类的对象并对其进行操作。
解答:
Class Point{
Privatefloat x;
Privatefloat y;
PublicPoint(){
This.x= 0;
This.y= 0;
}
Public Point(float x, float y){
This.x= x;
This.y= y;
}
Public void move(float m,float n ){
//将点移动向x方向移动m,向y方向移动n
This.x += m;
This.y += n;
}
Publicvoid show(){
//显示坐标位置
System.out.println(“坐标为(”+this.getX()+”,”+this.getY()+”)”);
}
//getter/setter方法
Public void setX(float x){
This.x = x;
}
Public float getX(){
Return this.x;
}
Publicvoid setY(float y){
This.y = y;
}
Public float getY(){
Return this.y;
}
}
19.写出下列算法的时间复杂度。
(1)冒泡排序 O(n*n)
(2)选择排序 O(n*n)
(3)插入排序 O(n*n)
(4)快速排序 O(n*log n)
(5)堆排序 O(n*log n)
(6)归并排序 O(n*log n)
20. EJB与JAVA BEAN的区别以及EJB的基本架构?
答:Java Bean是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。
EJB的基本架构
答:一个EJB包括三个部分:
Remote Interface接口的代码
package Beans;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface Add extends EJBObject
{
//some method declare
}
Home Interface接口的代码
package Beans;
import java.rmi.RemoteException;
import jaax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface AddHome extends EJBHome
{
//some method declare
}
EJB类的代码
package Beans;
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javx.ejb.SessionContext;
public class AddBean Implements SessionBean
{
//some method declare
}
21.Java中的Reflection作什么用?
解答:
自省是软件分析自己的能力。这个功能由Class类中的java.lang.reflect包和元素所提供。自省是一个重要的功能,当我们使用被称为Java Beans的组件时将用到它。它允许你在运行时而不是在编译时分析一个软件组件并且动态的描述它的功能。例如,通过使用自省,你能决定一个类支持哪些方法、构造函数和成员属性。
22.Java中的序列化(serialization)?
解答:
序列化(serialization)是把一个对象的状态写入一个字节流的过程。当你想要把你的程序状态存在一个固定的存储区域例如文件时,它是很管用的。稍后,你就可以运用序列化过程存储这些对象。
Serializable接口:只有一个实现Serializable接口的对象可以被序列化工具存储和恢复。Serializable接口没有定义任何成员没,它只用来表示一个类可以被序列化。如果一个类可以序列化,它的所有子类都可以序列化。
声明成transient的变量不被序列化工具存储。同样,static变量也不被存储。
23.客服端调用EJB对象的几个基本步骤
解答:
设置JNDI服务工厂以及JNDI服务地址系统属性,查找Home接口,从Home接口调用Create方法创建Remote接口,通过Remote接口调用其业务方法。
24.请对以下在J2EE中常用的名词进行解释(或简单描述)
web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接**互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。
EJB容器:Enterprisejava bean容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。
JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
RMI/IIOP:(RemoteMethod Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。
25.MVC的各个部分都有那些技术来实现?如何实现?
解答:
MVC是Model-View-Controller的简写。"Model"代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller"是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。
26.STRUTS的应用(如STRUTS架构)
解答:
Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。 Struts有如下的主要功能:一.包含一个controller servlet,能将用户的请求发送到相应的Action对象。二.JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。三.提供了一系列实用对象:XML处理、通过Javareflection APIs自动处理JavaBeans属性、国际化的提示和消息。
数据库部分
1.设有关系EMP(ENO,ENAME,SALARY,DNO),其中各属性的含义依次为职工号、姓名、工资和所在部门号,以及关系DEPT(DNO,DNAME,MANAGER),其中各属性含义依次为部门号、部门名称、部门经理的职工号。(回答下列题目)
(1).列出各部门中工资不低于600元的职工的平均工资。
解答:
SELECT AVG(月工资) FROM EMPGROUP BY部门号
WHERE SALARY >=600
(2).请用SQL语句将“销售部”的那些工资数额低于600的职工的工资上调10%。
解答:
CREAT VIEW V AT职工表
WHERE (部门号==销售部AND 工资<600);
UPDATA V
SET 工资=工资*1.1