当前位置: 首页 > >

201004_java企业面试题整理

发布时间:

1、1+2+3??+100 构建一个函数。 (易) 答案:
public int Sum(int n) { if(n == 1) return 1; else return n + Sum(n - 1); }

2、描述冒泡算法。 (易) 答案: 基本思路:对尚未排序的各元素从头到尾依次比较相邻的两个元素是否逆序(与 欲排顺序相反) ,若逆序就交换这两元素,经过第一轮比较排序后便可把最大(或最 小)的元素排好,然后再用同样的方法把剩下的元素逐个进行比较,就得到了你所 要的顺序。可以看出如果有 n 个元素,那么一共要进行 n-1 轮比较,第 i 轮要进 行 j=n-i 次比较。 (如:有 5 个元素,则要进行 5-1 轮比较。第 3 轮则要进行 5-3 次 比较) 3、堆和栈的区别! (难) 答案: 二、堆和栈的理论知识 申请方式 堆: 由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为 b 开辟空间 栈: 需要程序员自己申请,并指明大小,在 c 中 malloc 函数 申请后系统的响应 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常 提示栈溢出。 堆: 首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的 申请时, 申请大小的限制 栈:在 Windows 下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。 这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS 下,栈的大小是 2M(也有的说是 1M,总之是一个编译时就确定的 常数) ,如果申请的空间超过栈的剩余空间时,将提示 overflow。因此,能从栈

获得的空间较小。 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链 表来存储的空闲内存地址的, 自然是不连续的,而链表的遍历方向是由低地址向 高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空 间比较灵活,也比较大。 申请效率的比较: 栈由系统自动分配,速度较快。但程序员是无法控制的。 堆是由 new 分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来 最方便.

堆和栈中的存储内容 栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句 的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的 C 编译器 中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈 的。

小结: 堆和栈的区别可以用如下的比喻来看出: 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请) 、付钱、和吃(使用) ,吃 饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处 是快捷,但是自由度小。 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味, 而且自由度大。 4、用单利模式构建一个类(中) 答案: public class SingletonTest { private static SingletonTest instance; private SingletonTest() {} public static SingletonTest getInstance() { if (instance == null) { instance = new SingletonTest();} return instance; } 5、索引是怎样来提高搜索速度的! (难)

答案: 使用索引可快速访问数据库表中的特定信息。 索引是对数据库表中一列或多列的 值进行排序的一种结构,例如 employee 表的姓(lname)列。如果要按姓查找 特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。 索引是一个单独的、 物理的数据库结构,它是某个表中一列或若干列值的集 合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 索引提供指向存储在表的指定列中的数据值的指针, 然后根据您指定的排序 顺序对这些指针排序。 数据库使用索引的方式与您使用书籍中的索引的方式很相 似:它搜索索引以找到特定值,然后顺指针找到包含该值的行。 6、画一个项目的体系结构图。 (难) 答案:

1, 对 MVC 的理解?(中) 答案: MVC 是 Model-View-Controller 的 缩 写 。 Model ” 代 表 的 是 应 用 的 业 务 逻 辑 ( 通 过 “ JavaBean,EJB 组件实现) ,”View”是应用的表示面,用于与用户的交互(由 JSP 页 面产生)“Controller”是提供应用的处理过程控制(一般是一个 SERVLET)通过这种设计 。 模型所应用逻辑处理过程和显示逻辑分成不同的组件实现这些组件可以进行交互和重用 MODEL 层实现系统中的业务逻辑 VIEW 层用于与用户的交互 Controller 层是 Model 与 View 之间沟通的桥梁, 可以分派用户的请求并选择恰当的视图以用于显示, 同时它也可以解释用

户的输入并将它们映射、为模型层可执行的操作 2.抽象类和接口的区别?(中) 答案: 接口是公开的,不能包含私有的方法或变量,而抽象类是可以有私有方法或私有变量的, 实现接口的一定要实现接口里定义的所有方法, 而实现抽象类可以有选择地重写需要用到的 方法, 接口可以实现多重继承, 而一个类只能继承一个超类, 但可以通过继承多个接口实现多重继 承, 接口还有标识(里面没有任何方法,如 Remote 接口)和数据共享(里面的变量全是常量) 的作用. 一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。 3.同步和异步有何异同,在什么情况下分别使用它们?(难) 答案: 通俗版: 举个例子:普通 B/S 模式(同步)AJAX 技术(异步) 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕 -------------------------------------------------------------------------------------------------------------------同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告 诉你听到了,才一起去吃饭。 异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。 所以,要我请你吃饭就用同步的方法,要请我吃饭就用异步的方法,这样你可以省钱。 -------------------------------------------------------------------------------------------------------------------举个例子 打电话时同步 发消息是异步

综述版: 异步通信”是一种很常用的通信方式。异步通信在发送字符时,所发送的字符之间的时间间 隔可以是任意的。当然,接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加 上,那么发送端发送字符就没有意义,因为接收端根本无法接收) 。发送端可以在任意时刻 开始发送字符, 因此必须在每一个字符的开始和结束的地方加上标志, 即加上开始位和停止 位,以便使接收端能够正确地将每一个字符接收下来。异步通信的好处是通信设备简单、便 宜,但传输效率较低(因为开始位和停止位的开销所占比例较大) 。 异步通信也可以是以帧作为发送的单位。接收端必须随时做好接收帧的准备。这是,帧的首 部必须设有一些特殊的比特组合,使得接收端能够找出一帧的开始。这也称为帧定界。帧定 界还包含确定帧的结束位置。 这有两种方法。 一种是在帧的尾部设有某种特殊的比特组合来 标志帧的结束。或者在帧首部中设有帧长度的字段。需要注意的是,在异步发送帧时,并不 是说发送端对帧中的每一个字符都必须加上开始位和停止位后再发送出去, 而是说, 发送端 可以在任意时间发送一个帧, 而帧与帧之间的时间间隔也可以是任意的。 在一帧中的所有比 特是连续发送的。发送端不需要在发送一帧之前和接收端进行协调(不需要先进行比特同 步) 每个字符开始发送的时间可以是任意的 t0 0 1 1 0 1 1 0 起始位结束位 t 每个帧开始发送 。

的时间可以是任意的以字符为单位发送以帧为单位发送帧开始帧结束 “同步通信”的通信双方必须先建立同步,即双方的时钟要调整到同一个频率。收发双方不 停地发送和接收连续的同步比特流。 但这时还有两种不同的同步方式。 一种是使用全网同步, 用一个非常精确的主时钟对全网所有结点上的时钟进行同步。 另一种是使用准同步, 各结点 的时钟之间允许有微小的误差,然后采用其他措施实现同步传输。

串口进行通信的方式有两种: 同步通信方式和异步通信方式。 同步通信方式要求通信双方以 相同的时钟频率进行, 而且准确协调, 通过共享一个单个时钟或定时脉冲源保证发送方和接 收方的准确同步,效率较高;异步通信方式不要求双方同步,收发方可采用各自的时钟源, 双方遵循异步的通信协议,以字符为数据传输单位,发送方传送字符的时间间隔不确定,发 送效率比同步传送效率低。 4.说说你所熟悉或听说过的 J2EE 中的几种常用模式,及对设计模式的看法(中) 答案: 工厂模式、单例模式、代理模式、门面模式等 设计模式就是解决某一类问题的方法论 5.servlet 的生命周期(中) 答案: 实例化?初始化?服务?销毁 6.连接相数据库的几中方式(中) 答案: 直连 桥连 JNDI 7.String s=new String(“abc”);创建了几个对象?(易) 两个,一个是”abc”,一个是指向”abc”的引用 北京分形科技有限公司的笔试题目 选择题: 1. 下列是类和对象关系得是(B) (易) A.苹果和橘子 B.水果和苹果 C.水果和水果刀 D.苹果和水果刀 2.Int i=0; i=i++;执行这 2 句话后变量 i 的值为(A) (难) A. 0 B. 1 C. 2 D. 3 程序题
一、.怎样用 2 个栈实现队列(难) 队列的要求是先进先出,用两个栈可以很容易的实现 假设其中一个栈为 s1, 另一个为 s2 1. 入队:将元素放入 s1 中,s2 始终为空 2. 出队: 1). 首先将 s1 中的元素全部导入 s2 的栈中,清空 s1, 2). 然后再将 s2 栈顶元素出栈,保留下来, 3). 将 s2 剩余元素导入 s1 中,恢复数据原有顺序,就可以了

二、用递归实现任意一个数的阶乘(中)
public class test { public static void main(String [] args) {

System.out.println(fuc(100)); }

public static double fuc(int n) { if(n==1) return 1; else return n*fuc(n-1); } } 三、使用递归检索指定文件夹中的资源(难)

package com.accp; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Recursive { private static List fileList = new ArrayList(); /** * 使用递归搜索指定文件夹中的资源 * * @param path * 要搜索的文件目录 * @return 包含文件路径的列表 */ public static List searchFile(String path) { try { // List fileList = new ArrayList(); File dir = new File(path); File[] files = dir.listFiles(); if (files == null) { return null; }

for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { fileList.add(files[i].getAbsolutePath()); searchFile(files[i].getAbsolutePath()); } else { String strFileName = files[i].getAbsolutePath() .toLowerCase(); fileList.add(files[i].getAbsolutePath()); } } return fileList; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } public static void main(String[] args) { String path = "c:\\java"; long start = System.currentTimeMillis(); Recursive r = new Recursive(); List files = r.searchFile(path); System.out.println("共有文件数量:" + files.size()); System.out.print("总共用时:"); System.out.println(System.currentTimeMillis() - start); Iterator i = files.iterator(); while (i.hasNext()) { System.out.println(i.next()); } } } 四、编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数,然后打印出这个十 进制整数对应的二进制形式。 这个程序要考虑输入的字符串不能转换成一个十进制整数的情 况,并对转换失败的原因要区分出是数字太大,还是其中包含有非数字字符的情况。(难)
import java.io.*; public class Dicemal { public static void main(String[] args) throws Exception {

int shang=0,yu; boolean flag=false; System.out.println("请输入一个数字(最大值为<"+Integer.MAX_VALUE+"):"); InputStream is = System.in; InputStreamReader isr=new InputStreamReader(is); BufferedReader br=new BufferedReader(isr); String str=br.readLine(); char[] ch=new char[str.length()]; str.getChars(0, str.length(), ch, 0); for(int a=0;a<str.length();a++) { if(!Character.isDigit(ch[a])) { System.out.println("有非数字字符"); System.exit(0); } } try { shang=Integer.parseInt(str); flag=true; } catch(Exception e) { System.out.println("数字过大"); } str=""; if (flag) { while (shang != 0) { yu = shang % 2; shang = shang / 2; str = yu + str; } } System.out.println(str); } }

1.请写出你知道的 JAVA 开源软件,并用一句话说明其功能。(中) 答:Struts WEB框架 Spring IOC/AOP 框架 Hibernate ORM 框架

DWR ajax 框架 Log4j 日志调试 Validator 验证框架 2.构建工具 Ant 使用的缺省 xml 文件名是?(中) 答:Build.xml 3.简述什么是 SOA。 (难) 答: 面向服务的体系结构(Service-Oriented Architecture,SOA)是一个组件模型,它将应用 程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口 是采用中立的方式进行定义的,它应该独立于实现服务的硬件*台、操作系统和编程语言。 这使得构建在各种这样的系统中的服务可以一种统一和通用的方式进行交互。 4.XML 在 JAVA 中有那些解析方法。 (难) DOM/SAX 5.WAR 包中的 jar 一般是放在哪个目录下?(难) 答:lib 6.简述 Junit 和单元测试的作用?(中) 答:检查程序和预期设计的是否一致. 7.什么是工作流?(难) 答: 工作流(Work Flow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一 起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。 工作流要解决的主要问 题是:为实现某个业务目标,在多个参与者之间,利用计算机,按某种预定规则自动传递文 档、信息或者任务。简单地说,工作流就是一系列相互衔接、自动进行的业务活动或任务。 我们可以将整个业务过程看作是一条河,其中流过的河水就是工作流。 工作流属于计算机支持的协同工作 (Computer Supported Cooperative Work, CSCW) 的一部分。后者是普遍地研究一个群体如何在计算机的帮助下实现协同工作的。 许多公司采用纸张表单,手工传递的方式,一级一级审批签字,工作效率非常低下,对 于统计报表功能则不能实现。而采用工作流软件,使用者只需在电脑上填写有关表单,会按 照定义好的流程自动往下跑, 下一级审批者将会收到相关资料, 并可以根据需要修改、 跟踪、 管理、查询、统计、打印等,大大提高了效率,实现了知识管理,提升了公司的核心竞争力。 金航网信息技术有限公司 1. <jsp:include>与<@ include>的区别分别在什么时候使用(中). 答:动作属于动态包含,可以传参,而指令则属于静态包含,不可传参. 2. JavaEE 是什么?(中) 答:是 sun 提出的一种规范和标准.现在有很多种实现 3. 什么是 webService, 有使用经验吗? (中) 答:基于WWW的一和服务,可以实现异构*台间的相互调用. 4. Struts,webWork 的理解. (中) 答:两个实现了MVC的WEB应用程序开发的框架. 5. 对 Spring 的理解. (中) 答:Spring 是一个容器框架,其核心机制在于IOC和AOP

6. ORM 的中间控件有哪些(举例). (中) 答:Hibernate , IbatIs, JDO , EntityBean
北京鑫万佳科技有限公司(java) 1. JSP 内置对象有哪些,,分别简述作用?(中) 答: request 表示 HttpServletRequest 对象。它包含了有关浏览器请求的信息 response 表示 HttpServletResponse 对象,并提供了几个用于设置浏览器的响应的方法 out 对象是 javax.jsp.JspWriter 的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。 pageContext 表示一个 javax.servlet.jsp.PageContext 对象。它是用于方便存取各种范围的名字空间 session 表示一个请求的 javax.servlet.http.HttpSession 对象。Session 可以存贮用户的状态信息 applicaton 表示一个 javax.servle.ServletContext 对象。这有助于查找有关 servlet 引擎和 servlet 环境的信息 config 表示一个 javax.servlet.ServletConfig 对象。该对象用于存取 servlet 实例的初始化参数。 page 表示从该页面产生的一个 servlet 实例

2. JSP 动作有哪些,简述作用?(中)
答:

jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个 JavaBean。 jsp:setProperty:设置 JavaBean 的属性。 jsp:getProperty:输出某个 JavaBean 的属性。 jsp:forward: 把请求转到一个新的页面。jsp:plugin: 根据浏览器类型为 Java 插件生成 OBJECT 或 EMBED 标记。 3. 写出 JAVA 的 8 个基本数据类型(易)
答: Short, char, int, float, double, byte, Boolean, long

4. 请写出线程同步的方法(难) 答:synchronized{} 5. 写出 java 异常处理的 5 个关键字(中)
答: Try , catch, finally, throw, throws

6. 描述 break 和 continue 控制循环的流程不同之处(中)
答:break 退出牡循环体,continue 指退出当前这次循环,继续进入下一次循环.

7. 下面语句是否正确(难)
Public class hi{ Public int addOne(final int x) { return ++x; } } 这样写对嘛? 不对,final 意味着不可以修改.

1.接口和抽象类有什么区别?(中) 接口是公开的,不能包含私有的方法或变量,而抽象类是可以有私有方法或私有变量的,

实现接口的一定要实现接口里定义的所有方法, 而实现抽象类可以有选择地重写需要用到的 方法, 接口可以实现多重继承, 而一个类只能继承一个超类, 但可以通过继承多个接口实现多重继 承, 接口还有标识(里面没有任何方法,如 Remote 接口)和数据共享(里面的变量全是常量) 的作用. 一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。 2.String s = new String("xyz");创建了几个 String Object?(中) 两个对象,一个是“xyx”,一个是指向“xyx”的引用对象 s。 3.代码改错(难) short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 = s1 + 1; (s1+1 运算结果是 int 型,需要强制转换类型) short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 += 1;(可以正确编译) 4.是否可以继承 String 类?(难) String 类是 final 类故不可以继承。 5.try {}里有一个 return 语句, 那么紧跟在这个 try 后的 finally {}里的 code 会不会被执行, 什 么时候被执行,在 return 前还是后?(易) 会执行,在 return 前执行。 6. 常见的 runtime exception 有哪些?。(易) ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException,

RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException NullPointException 7.HashMap 与 HashTable 的区别。(中) 一.历史原因:Hashtable 是基于陈旧的 Dictionary 类的, HashMap 是 Java 1.2 引进的 Map 接口 的一个实现 二.同步性:Hashtable 是线程安全的,也就是说是同步的,而 HashMap 是线程序不安全的, 不是同步的 三.值:只有 HashMap 可以让你将空值作为一个表的条目的 key 或 value 8.代码推断?(中) Math.round(11.5)等於多少? Math.round(-11.5)等於多少? Math.round(11.5)==12 Math.round(-11.5)==-11 round 方法返回与参数最接*的长整数. 9.GC 是什么? 为什么要有 GC? (难) GC 是垃圾收集的意思(Gabage Collection) Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的, Java 语言没有提供释放已分配内存的显示操作方法。 10.数组有没有 length()这个方法? String 有没有 length()这个方法?(易) 数组没有 length()这个方法,有 length 的属性。String 有有 length()这个方法 11.构造器 Constructor 是否可被(覆盖)override? (易) 构造器 Constructor 不能被继承,因此不能重写 Overriding,但可以被重载 Overloading。 12.Java 有没有 goto?(易) java 中的保留字,现在没有在 java 中使用。

13.启动一个线程是用 run()还是 start()?(中) 启动一个线程是调用 start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它 可以由 JVM 调度并执行。 这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 14.两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对?(中) 不对,有相同的 hash code。 15.&和&&的区别。(中) &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and) 。

16.final, finally, finalize 的区别。 [中] final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally 是异常处理语句结构的一部分,表示总是执行。 finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法, 可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 17.swtich 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上? (中) switch(expr1)中,expr1 是一个整数表达式。应该是 int、 short、 char byte。 long,string 都不能作用于 swtich。 31. 编程题: 写一个 Singleton 出来。 [难] Singleton 模式主要作用是保证在 Java 应用程序中,一个类 Class 只有一个实例存在。 第一种形式: 定义一个类, 它的构造函数为 private 的, 它有一个 static 的 private 的该类变量, 在类初始化时实例话,通过一个 public 的 getInstance 方法获取对它的引用,继而调用其中的 方法。 public class Singleton { private Singleton(){} private static Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; } } 第二种形式: public class Singleton { private static Singleton instance = null; public static synchronized Singleton getInstance() { if (instance==null) instance=new Singleton(); return instance; } }

String tempStr = ""; try { tempStr = new String(str.getBytes("ISO-8859-1"), "GBK"); tempStr = tempStr.trim(); } catch (Exception e) { System.err.println(e.getMessage()); } return tempStr; }

1、 String 与 StringBuffer 的区别(中) 答:String 一但声明,在内存中是不可改变的,而StringBuffer 是可变的字符序列。 2、 char 型变量中能不能存贮一个中文汉字?为什么?(中) 答:可以,就为采用 Unicode 编码. 3、 Float 型 float f=3.4 是否正确?(易) 答:不正确,应为:float f = 3.4f; 4、 下面语句执行后的结果是什么?(难) 答案: false; true
String a="teststringA"; StringBuffer b =new StringBuffer("teststring A"); String c="teststringA"; System.out.println (a.equals(b.toString()));

5、 System.out.println (a==c);class.forname 的作用?为什么要用? 6、 说明抽象类与接口的相同点和不同点(中) 答: 1.是否可以被多继承 2.是否可以包含方法体 3. 是否可以包含私有成员 4.用途不同 7、 JSP 中动态 INCLUDE 与静态 INCLUDE 的区别?(难) 答:动态包含可以传递参数,而静态则不可以。 8、 JSP 有哪些内置对象,作用分别是什么?(中) 答: request 表示 HttpServletRequest 对象。它包含了有关浏览器请求的信息 response 表示 HttpServletResponse 对象,并提供了几个用于设置浏览器的响应的方法 out 对象是 javax.jsp.JspWriter 的一个实例,并提供了几个方法使你能用于向浏览器回送输出 结果。 pageContext 表示一个 javax.servlet.jsp.PageContext 对象。它是用于方便存取各种范围的名字 空间 session 表示一个请求的 javax.servlet.http.HttpSession 对象。 Session 可以存贮用户的状态信息 applicaton 表示一个 javax.servle.ServletContext 对象。 这有助于查找有关 servlet 引擎和 servlet 环境的信息 config 表示一个 javax.servlet.ServletConfig 对象。 该对象用于存取 servlet 实例的初始化参数。 page 表示从该页面产生的一个 servlet 实例 (一) Java 部分: 1. 以下程序代码将输出什么? (难)
答案:3 null public class Test { static int a = 3; static String b = null; public void reset(){ a =4;

b = "abc"; } public static void main(String[] args) { System.out.println(a + " " + b); } }

2. 以下程序代码输出的变量 i 的值为多少?(难)
答案:199 public class Test { public static void main(String[] args) { int i = 99; add(i); System.out.println(i + 100); } public static void add(int i){ i += 100; } } 3. 以下程序代码中哪行代码将产生错误?(难) class Parent { private String name; public Parent(){ } } public class Child extends Parent{ private String dev; public Child(){ } public String getValue(){ return name; } public static void main(String[] args) { Parent p = new Parent(); } } //产生错误

4. 以下程序代码的输出结果为?(难) 答案:mqv
public class Test { public static void test(){ try{ generateException(); System.out.print("e"); }catch(NumberFormatException ex){ System.out.print("j"); }finally{ System.out.print("m"); } } public static void generateException(){ throw new ArrayIndexOutOfBoundsException(); System.out.print("h"); } public static void main(String[] args) { try{ test(); }catch(Exception ex){ System.out.print("q"); }finally{ System.out.print("v"); } } } //语法错误

(二) 问答题: 1. MVC 的各个部分通常由哪些技术来实现?如果熟悉 Struts 框架技术,请描述在 Struts 框 架中的 MVC 如何实现。(中) 答: M: Module(模型层) ,一般由 JavaBean 实现 V: View(视图层),一般由JSP页面实现 C:Ctroller(控制器),一般由 Servlet 实现. Struts 是实现了MVC的控制器框架,其中,它对Module 没有做特殊的限制,主要是在控 制器上做了工作,其核心控制器是 ActionServlet 首先接受客户端请求,然后会根据配置文件 交给相应的局部控制器来处理.该框架的 View 层主要是JSP和 Tags 构成.
2.写出Servlet 的生命周期(中)

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service 方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服

务器决定将实例销毁的时候调用其destroy方法。
3.forward 和redirect的区别(易)

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读 取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿 来的,所以它的地址栏中还是原来的地址。 redirect就是服务端根据逻辑,发送一个状 态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新 请求,所以session,request参数都可以获取。
4.JNDI是什么?(难) JNDI全称 Java Naming and Directory Interface JNDI是Java*台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很 多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。 这意味着任何基于名字的技术都能通过JNDI而提供服务, 只要JNDI支持这项技术。 JNDI目前所支 持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows 注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。 5.错误404,500分别表示什么?(中) 404,没有找到该页(没有找到资源)。 500,内部错误。

1.对 mvc 的理解?(易) MVC(Model-View-Controller,模型—视图—控制器模式)用于表示一种软 件架构模式。它把软件系统分为三个基本部分:模型(Model) ,视图(View) 和控制器(Controller) 。 * 控制器- 程序员编写程序应有的功能(实现算法等等) * 视图 - 界面设计人员进行图形界面设计 * 模型 - 数据库专家进行数据管理和数据库设计 由于 MVC 的三个模块相互独立,改变其中一个不会影响其他两个,软件的 可扩展性和可维护性大大增加。 开发人员可以通过自己的专长进行分组开发。 在 Java 应用程序中, 视图一般由 jsp 或 html 充当, 控制器由 Servlet 或 Struts 充当,模型层由 JavaBean 或 EJB 充当。 2.数据库联接的几种方式?(中) JAVA 连接数据库的方式有多种: 根据所需要的不同数据库驱动分,分为四种: 1:1 类驱动。这就是 JDBC-ODBC 桥的方式。但这种方式不适合程序的重用与 维护,不推荐使用。需要数据库的 ODBC 驱动。 2: 类驱动。 2 这就是 JDBC+厂商 API 的形式。厂商 API 一般使用 C 编写,所以, 这种方式也不长使用。 3:3 类驱动。这就是 JDBC+厂商 Database Connection Server+DataBase 的形式。 这种方法就是在 JAVA 与 DATABASE 之间价起了一台专门用与数据库连接的 服务器(一般由数据库厂商提供) 。他的好处在于能优化连接。 4:4 类驱动。这就是纯 JDBC+DATABASE 的连接方式。也是推荐的连接方式。

这使得 APPLICATION 与数据库分开, 开发者只需关心内部逻辑的实现而不需注 重数据库连接的具体实现。在这其中有两种连接的方式: 硬编码方式,就是在程序中硬性编入数据库连接的所须参数。 JNDI DataSource 方式。就是在程序运行的外布环境中又称(Context)设置一个 datasource 数据源,有一个 jndi 名称,程序只须查找此名称就可得到一个数据库 连接的对象。 3.抽象类和接口的区别?(中) 1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次 继承关系。但是,一个类却可以实现多个 interface。 2.在 abstract class 中可以有自己的数据成员,也可以有非 abstarct 的成员方 法,而在 interface 中,只能够有静态的不能被修改的数据成员(也就是必须是 static final 的,不过在 interface 中一般不定义数据成员) ,所有的成员方法都是 abstract 的。 3.abstract class 和 interface 所反映出的设计理念不同。 其实 abstract class 表示 的是"is-a"关系,interface 表示的是"like-a"关系。 4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象 方法。接口中则不能有实现方法。 5.接口中定义的变量默认是 public static final 型,且必须给其初值,所以实 现类中不能重新定义,也不能改变其值。 6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以 重新赋值。 7.接口中的方法默认都是 public,abstract 类型的。 4.String s = new String(“abc”);是几个对象?(难) 如果在此语句之前没有用到”abc”,该语句会创建两个对象,"xyz"就是创造 了一个 String 对象,然后调用的 String 类中的 String(String)的构造方法创建的 另外一个对象,"xyz"在全局数据区,s 指向的对象在堆中。 如果语句如下: String s1 = new String("abc"); //创建二个对象 String s2 = new String("abc"); //创建一个对象,并且以后每执 行一次创建一个对象 5.Sevlet 的生命周期?(易) Servlet 是一种可以在 Servlet 容器中运行的组件,那么理所当然就应该有一个从 创建到销毁的过程,这个过程我们可以称之为 Servlet 生命周期。 Servlet 的生命 周期可以分为加载、实例化、初始化、处理客户请求和卸载五个阶段,体现在方 法上主要是 init() 、service()和 destroy()三个方法。生命周期的具体说明 如下: Servlet 容器完成加载 Servlet 类和实例化一个 Servlet 对象 init()方法完成初始化工作,该方法由 Servlet 容器调用完成 service()方法处理客户端请求,并返回响应结果 destroy()方法在 Servlet 容器卸载 Servlet 之前被调用,释放一些资源

6. 简述 TCP 的 3 次握手建立连接(难) 在 TCP/IP 协议中, TCP 协议提供可靠的连接服务, 采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认; SYN: 同步序列编号(Synchronize Sequence Numbers) 第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1) ,同时自 己也发送一个 SYN 包(syn=k) ,即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态; 第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确* ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完 成三次握手。 完成三次握手,客户端与服务器开始传送数据

7. 数据库左连接和右连接的区别?(易) 左连接就是保留左边表的相关字段, 如果右边表相关字段有不匹配的, null 以 填充之。 右连接就是保留右边表的相关字段, 如果左边表相关字段有不匹配的, null 以 填充之 8. 简述垃圾回收?(中) Java 语言中一个显著的特点就是引入了垃圾回收机制,使 c++程序员最头疼 的内存管理的问题迎刃而解,它使得 Java 程序员在编写程序的时候不再需要考 虑内存管理。由于有个垃圾回收机制,Java 中的对象不再有“作用域”的概念, 只有对象的引用才有“作用域” 。垃圾回收可以有效的防止内存泄露,有效的使 用可以使用的内存。 垃圾回收器通常是作为一个单独的低级别的线程运行,不可 预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回 收, 程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回 收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收

9. 用任意语言写出一个堆栈的代码(中) 使用 java.util.Stack 可以直接创建堆栈对象, Stack 类描述了一个对象的后进先 出 (LIFO) 堆 栈 , pop() 方 法 删 除 栈 顶 的 对 象 并 把 它 作 为 该 函 数 的 值 返 回,push(Object)把一个对象压入栈顶。 用 LinkedList 也可以模拟堆栈实现: public class Stack { private LinkedList list = new LinkedList(); public void add(Object obj){ list.addLast(obj); } public Object get(){ return list.removeLast(); } public static void main(String[] args){ Stack stack = new Stack(); stack.add("1"); stack.add("2"); System.out.println(stack.get()); } } 10.用递归求出斐波那契数列的第 30 位数?(中) public static long fib(int n) { if (n == 1 || n==2) return 1; else return fib(n-1) + fib(n-2); } 调用 fib(30)即可得到结果 11. 写出一个函数实现将两个有序数组合并位一个有序数组(中) void MergeArray(int [] pArray1, int nLen1, int [] pArray2, int nLen2, int [] pArray) { int i, j, n; i = j = n = 0; while (i < nLen1 && j < nLen2) 拷贝完某一个数组的元素为止 { if (pArray1[i] < pArray2[j]) 素 { pArray[n++] = pArray1[i++]; }

// 循环一直进行到

// 拷贝 array1 的元

else if (pArray1[i] > pArray2[j]) 元素 { pArray[n++] = pArray2[j++]; } else 贝 { pArray[n++] = pArray2[j++]; ++i; } } if (i == nLen1) 拷贝完毕就拷贝 array2 的元素 { while (j < nLen2) pArray[n++] = pArray2[j++]; } else 拷贝完毕就拷贝 array1 的元素 { while (i < nLen1) pArray[n++] = pArray1[i++]; } }

// 拷贝 array2 的

// 相等的元素拷

// 如果 array1 已经被

// 如果 array2 已经被

12、说出 ArrayList,Vector, LinkedList 的存储性能和特性(中) ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储 的数据以便增加和插入元素, 它们都允许直接按序号索引元素,但是插入元素要 涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使 用了 synchronized 方法 (线程安全)通常性能上较 ArrayList 差, LinkedList , 而 使用双向链表实现存储, 按序号索引数据需要进行前向或后向遍历,但是插入数 据时只需要记录本项的前后项即可,所以插入速度较快。 13、Collection 和 Collections 的区别。(易) Collection 是集合类的上级接口,继承于它的接口主要有 Set 和 List. Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集 合的搜索、排序、线程安全化等操作。 14、&和&&的区别。(易) &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 15、HashMap 和 Hashtable 的区别。(中)

HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完成了 Map 接口,主要区别在于 HashMap 允许空(null)键值(key),由于非线程安全,效 率上可能高于 Hashtable。 HashMap 允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。 HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey。因为 contains 方法容易让人引起误解。 Hashtable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map interface 的一个实现。 最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多个 线程访问 Hashtable 时,不需要自己为它的方法实现同步,而 HashMap 就必须 为之提供外同步。 Hashtable 和 HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很 大的差异。 16、final, finally, finalize 的区别。(中) final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可 继承。 finally 是异常处理语句结构的一部分, 表示总是执行。 finalize 是 Object 类的一个方法, 在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖 此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 17、sleep() 和 wait() 有什么区别? (中) sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会 给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放 对象锁。wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对 象锁,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 18、 Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值的类 型?(易) 方法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同表现。重写 Overriding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个类 中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数, 我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类 中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了 多个同名的方法, 它们或有不同的参数个数或有不同的参数类型,则称为方法的 重载(Overloading)。Overloaded 的方法是可以改变返回值的类型。 19、error 和 exception 有什么区别?(易) error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢 出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从 不会发生的情况。 20、Static Nested Class 和 Inner Class 的不同。(难)

Static Nested Class 是被声明为静态(static)的内部类,它可以不依赖于 外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。 21、什么时候用 assert。 (中) assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持 这种机制。在实现中,assertion 就是在程序中的一条语句,它对一个 boolean 表达式进行检查,一个正确程序必须保证这个 boolean 表达式的值为 true;如 果该值为 false,说明程序已经处于不正确的状态下,系统将给出警告或退出。 一般来说,assertion 用于保证程序最基本、关键的正确性。assertion 检查通 常在开发和测试时开启。为了提高性能,在软件发布后,assertion 检查通常是 关闭的。 22、GC 是什么? 为什么要有 GC?(中) GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问 题的地方, 忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目 的,Java 语言没有提供释放已分配内存的显示操作方法。

23、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? (中) short s1 = 1; s1 = s1 + 1; (s1+1 运算结果是 int 型,需要强制转换类型) short s1 = 1; s1 += 1;(可以正确编译) 24、启动一个线程是用 run()还是 start()?(中) 启动一个线程是调用 start()方法,使线程所代表的虚拟处理机处于可运行状 态, 这意味着它可以由 JVM 调度并执行。 这并不意味着线程就会立即运行。 run() 方法可以产生必须退出的标志来停止一个线程。 25、给我一个你最常见到的 runtime exception。(易) ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException 26、List, Set, Map 是否继承自 Collection 接口? (易) List,Set 是,Map 不是

27、abstract 的 method 是否可同时是 static,是否可同时是 native,是否可同 时是 synchronized? (中) 都不能 28、数组有没有 length()这个方法? String 有没有 length()这个方法?(易) 数组没有 length()这个方法,有 length 的属性。String 有 length()这个方法。

29、Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还 是 equals()? 它们有何区别?(易) Set 里的元素是不能重复的,那么用 equals()方法来区分重复与否。equals() 是判读两个 Set 是否相等。equals()和==方法决定引用值是否指向同一对象 equals()在类中被覆盖, 为的是当两个分离的对象的内容和类型相配的话,返回 真值。 30、构造器 Constructor 是否可被 override?(易) 构造器 Constructor 不能被继承,因此不能重写 Overriding,但可以被重载 Overloading。 31、是否可以继承 String 类?(易) String 类是 final 类故不可以继承。 32、 switch 是否能作用在 byte 上, 是否能作用在 long 上, 是否能作用在 String 上?(易) switch(expr1)中,expr1 是一个整数表达式。因此传递给 switch 和 case 语 句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于 switch。 33、 {}里有一个 return 语句, try 那么紧跟在这个 try 后的 finally {}里的 code 会不会被执行,什么时候被执行,在 return 前还是后?(易) 会执行,在 return 前执行。 34、编程题: 用最有效率的方法算出 2 乘以 8 等於几? (中) 2 << 3 35、两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这 句话对不对?(中) 不对,有相同的 hash code。 36、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性, 并可返回变化后的结果,那么这里到底是值传递还是引用传递? (易)

是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传 递到方法中时, 参数的值就是对该对象的引用。对象的内容可以在被调用的方法 中改变,但对象的引用是永远不会改变的。 37、当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进 入此对象的其它方法?(中) 不能,一个对象的一个 synchronized 方法只能由一个线程访问。 38、编程题: 写一个 Singleton 出来。(中) Singleton 模式主要作用是保证在 Java 应用程序中,一个类 Class 只有一个实 例存在。一般 Singleton 模式通常有几种形式:第一种形式: 定义一个类,它的 构造函数为 private 的,它有一个 static 的 private 的该类变量,在类初始化 实例化, 通过一个 public 的 getInstance 方法获取对它的引用,继而调用其中的 方法。 public class Singleton { private Singleton() { } private static Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; } }第二种形式: public class Singleton { private static Singleton instance = null; public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 39: “AA12321abc” 请把这个字符串中重复的字母分别计数! 说出你的思路! (中) 方法有很多种: 可以用 map 存放字母和出现的次数 取出字符串的第一个字符(首字母),利用的字符串的 replaceAll 方法将符合正 则表达式(第一个字符)替代为空, 此字母出现的次数为原始的字符串长度减去替 代后的字符串长度。如果下一个字母没没有被统计过(用 map 的 contains 方法 判断)循环迭代找出下一个字母的统计次数 40. java 的几种对象(PO,VO,DAO,BO,POJO)解释 (中) PO: persistant object 持久对象 最形象的理解就是一个 PO 就是数据库中的一条记录。 好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。

BO: business object 业务对象 主要作用是把业务逻辑封装为一个对象。 这个对象可以包括一个或多个其它的对 象。 比如一个简历,有教育经历、工作经历、 关系等等。 我们可以把教育经历对应一个 PO,工作经历对应一个 PO, 关系对应一个 PO。 建立一个对应简历的 BO 对象处理简历,每个 BO 包含这些 PO。 这样处理业务逻辑时,我们就可以针对 BO 去处理。 VO : value object 值对象 ViewObject 表现层对象 主要对应界面显示的数据对象。对于一个 WEB 页面,或者 SWT、SWING 的一个界 面,用一个 VO 对象对应整个界面的值。 DTO : Data Transfer Object 数据传输对象 主要用于远程调用等需要大量传输对象的地方。 比如我们一张表有 100 个字段,那么对应的 PO 就有 100 个属性。 但是我们界面上只要显示 10 个字段, 客户端用 WEB service 来获取数据,没有必要把整个 PO 对象传递到客户端, 这时我们就可以用只有这 10 个属性的 DTO 来传递结果到客户端,这样也不会暴 露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它 的身份就转为 VO POJO : plain ordinary java object 简单 java 对象 个人感觉 POJO 是最常见最多变的对象,是一个中间对象,也是我们最常打交道 的对象。 一个 POJO 持久化以后就是 PO 直接用它传递、传递过程中就是 DTO 直接用来对应表示层就是 VO DAO: data access object 数据访问对象 这个大家最熟悉,和上面几个 O 区别最大,基本没有互相转化的可能性和必要. 主要用来封装对数据库的访问。通过它可以把 POJO 持久化为 PO,用 PO 组装出 来 VO、DTO 41. Jdk1.5 的新特性(中) 泛型,for-each 循环,自动装包/拆包,枚举,可变参数,

静态导入

42. 什么是 IOC(易) IoC,Inversion of Control,控制反转,其原理是基于 OO 设计原则的 The Hollywood Principle:Don't call us, we'll call you。也就是说,所有的组 件都是被动的(Passive),所有的组件初始化和调用都由容器负责。组件处在 一个容器当中,由容器负责管理 IoC 模式的目标是将组件的配置与使用分离开。

43.什么是 AOP(易)? AOP 为 Aspect Oriented Programming 的缩写,意为:面向方法(切面)编程,可以 通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统 一添加功能的一种技术。它的目的是将公共问题抽象成 Aspect 统一实现,让程 序员只关注业务实现 44. 使用 DWR 是在页面上要导入的 js 文件是什么?(易) 包括 DWR 框架的 util.js engine.js 以及自己发布的 js 45. Struts1 和 Struts2 的区别(难) action 类: ? Struts1 要求 Action 类继承一个抽象基类。 Struts1 的一个普遍问题是使用抽 象类编程而不是接口。 ? Struts 2 Action 类可以实现一个 Action 接口,也可实现其他接口,使可选 和定制的服务成为可能。Struts2 提供一个 ActionSupport 基类去 实现 常用的 接口。Action 接口不是必须的,任何有 execute 标识的 POJO 对象都可以用作 Struts2 的 Action 对象。 线程模式: ? Struts1 Action 是单例模式并且必须是线程安全的,因为仅有 Action 的一个 实例来处理所有的请求。单例策略限制了 Struts1 Action 能作的事,并且要在 开发时特别小心。Action 资源必须是线程安全的或同步的。 ? Struts2 Action 对象为每一个请求产生一个实例,因此没有线程安全问题。 (实际上,servlet 容器给每个请求产生许多可丢弃的对象,并且不会导致性能 和垃圾回收问题) Servlet 依赖: ? Struts1 Action 依赖于 Servlet API ,因为当一个 Action 被调用时 HttpServletRequest 和 HttpServletResponse 被传递给 execute 方法。 ? Struts 2 Action 不依赖于容器,允许 Action 脱离容器单独被测试。如果需 要,Struts2 Action 仍然可以访问初始的 request 和 response。但是,其他的 元素减少或者消除了直接访问 HttpServetRequest 和 HttpServletResponse 的 必要性。 可测性: ? 测试 Struts1 Action 的一个主要问题是 execute 方法暴露了 servlet API(这 使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一 套 Struts1 的模拟对象(来进行测试)。 ? Struts 2 Action 可以通过初始化、设置属性、调用方法来测试,“依赖注入” 支持也使测试更容易。 捕获输入:

? Struts1 使用 ActionForm 对象捕获输入。 所有的 ActionForm 必须继承一个基 类。因为其他 JavaBean 不能用作 ActionForm,开发者经常创建多余的类捕获输 入。动态 Bean(DynaBeans)可以作为创建传统 ActionForm 的选择,但是,开 发者可能是在重新描述(创建)已经存在的 JavaBean(仍然会导致有冗余的 javabean)。 ? Struts 2 直接使用 Action 属性作为输入属性,消除了对第二个输入对象的需 求。 输入属性可能是有自己(子)属性的 rich 对象类型。 Action 属性能够通过 web 页面上的 taglibs 访问。Struts2 也支持 ActionForm 模式。rich 对象类型,包 括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了 taglib 对 POJO 输入对象的引用。 表达式语言: ? Struts1 整合了 JSTL,因此使用 JSTL EL。这种 EL 有基本对象图遍历,但是 对集合和索引属性的支持很弱。 ? Struts2 可以使用 JSTL,但是也支持一个更强大和灵活的表达式语言-- "Object Graph Notation Language" (OGNL). 绑定值到页面(view): ? Struts 1 使用标准 JSP 机制把对象绑定到页面中来访问。 ? Struts 2 使用 "ValueStack"技术,使 taglib 能够访问值而不需要把你的页 面(view)和对象绑定起来。ValueStack 策略允许通过一系列名称相同但类型 不同的属性重用页面(view)。 类型转换: ? Struts 1 ActionForm 属性通常都是 String 类型。Struts1 使用 Commons-Beanutils 进行类型转换。每个类一个转换器,对每一个实例来说是不 可配置的。 ? Struts2 使用 OGNL 进行类型转换。提供基本和常用对象的转换器。 校验: ? Struts 1 支持在 ActionForm 的 validate 方法中手动校验,或者通过 Commons Validator 的扩展来校验。 同一个类可以有不同的校验内容, 但不能校验子对象。 ? Struts2 支持通过 validate 方法和 XWork 校验框架来进行校验。 XWork 校验框 架使用为属性类类型定义的校验和内容校验,来支持 chain 校验子属性 Action 执行的控制: ? Struts1 支持每一个模块有单独的 Request Processors(生命周期),但是模 块中的所有 Action 必须共享相同的生命周期。 ? Struts2 支持通过拦*鞫颜唬↖nterceptor Stacks)为每一个 Action 创建 不同的生命周期。堆栈能够根据需要和不同的 Action 一起使用 46. Hibernate 的映射关系有哪些?并说明原理(中) 一对一 一对多 多对一 多对多

实现 ORM 功能的时候, 主要的文件有: 映射类 (*.java) 映射文件 、 (*.hbm.xml) 以及数据库配置文件(*.properties 或*.cfg.xml),它们各自的作用如下。 ⑴映射类:它的作用是描述数据库表的结构,表中的字段在类中被描述成属性, 将来就可以实现把表中的记录映射成为该类的对象。 ⑵映射文件: 它的作用是指定数据库表和映射类之间的关系,包括映射类和数据 库表的对应关系、 表字段和类属性类型的对应关系以及表字段和类属性名称的对 应关系等。 ⑶数据库配置文件: 它的作用是指定与数据库连接时需要的连接信息,比如连接 哪中数据库、登录用户名、登录密码以及连接字符串等 Hibernate 的实现原理:通过解析数据库配置文件获取数据库连接信息并建立连 接,通过解析映射文件可以获取映射类名、属性名、表名以及字段名等信息,得 到名字后通过反射机制可以得到映射类信息,调用构造方法创建对象,调用每个 属性的 set 方法给对象设值完成数据的装载 47. Struts 原理(中) Struts 是 MVC 的一种实现,它将 Servlet 和 JSP 标记(属于 J2EE 规范)用 作实现的一部分。Struts 继承了 MVC 的各项特性,并根据 J2EE 的特点,做了相 应的变化与扩展。 控制: XML 文件 Struts-config.xml,与之相关联的是 Controller,在 Struts 中,承担 MVC 中 Controller 角色的是一个 Servlet,叫 ActionServlet。 ActionServlet 是一个通用的控制组件。这个控制组件提供了处理所有发送到 Struts 的 HTTP 请求的入口点。它截取和分发这些请求到相应的动作类(这些动 作类都是 Action 类的子类)。另外控制组件也负责用相应的请求参数填充 Action From (通常称之为 FromBean) ,并传给动作类 (通常称之为 ActionBean) 。 动作类实现核心商业逻辑,它可以访问 java bean 或调用 EJB。最后动作类把控 制权传给后续的 JSP 文件,后者生成视图。所有这些控制逻辑利用 Struts-config.xml 文件来配置。 视图:主要由 JSP 生成页面完成视图,Struts 提供丰富的 JSP 标签库: Html, Bean,Logic,Template 等,这有利于分开表现逻辑和程序逻辑。 模型:模型以一个或多个 java bean 的形式存在。这些 bean 分为三类:Action Form、Action、JavaBean or EJB。Action Form 通常称之为 FormBean,封装了 来自于 Client 的用户请求信息,如表单信息。Action 通常称之为 ActionBean, 获取从 ActionSevlet 传来的 FormBean,取出 FormBean 中的相关信息,并做出 相关的处理,一般是调用 Java Bean 或 EJB 等。 流程:在 Struts 中,用户的请求一般以*.do 作为请求服务名,所有的*.do 请求均 被指向 ActionSevlet,ActionSevlet 根据 Struts-config.xml 中的配置信息,将用户 请求封装成一个指定名称的 FormBean,并将此 FormBean 传至指定名称的 ActionBean,由 ActionBean 完成相应的业务操作,如文件操作,数据库操作等。 每一个*.do 均有对应的 FormBean 名称和 ActionBean 名称,这些在 Struts-config.xml 中配置。 48.Spring 原理(中)

spring 的最大作用 ioc/di,将类与类的依赖关系写在配置文件中,程序在运行时根 据配置文件动态加载依赖的类,降低的类与类之间的藕合度。它的原理是在 applicationContext.xml 加入 bean 标记,在 bean 标记中通过 class 属性说明具体类 名、通过 property 标签说明该类的属性名、通过 constructor-args 说明构造子的参 数。其一切都是返射,当通过 applicationContext.getBean("id 名称")得到一个类实 例时,就是以 bean 标签的类名、属性名、构造子的参数为准,通过反射实例对 象,唤起对象的 set 方法设置属性值、通过构造子的 newInstance 实例化得到对 象。正因为 spring 一切都是反射,反射比直接调用的处理速度慢,所以这也是 spring 的一个问题。 spring 第二大作用就是 aop,其机理来自于代理模式,代理模式有三个角色分别 是通用接口、代理、真实对象代理、真实对象实现的是同一接口,将真实对象作 为代理的一个属性,向客户端公开的是代理,当客户端调用代理的方法时,代理 找到真实对象,调用真实对象方法,在调用之前之后提供相关的服务,如事务、 安全、日志。 49.Hibernate 原理(中) Hibernate 的实现原理:通过解析数据库配置文件获取数据库连接信息并建立连 接,通过解析映射文件可以获取映射类名、属性名、表名以及字段名等信息,得 到名字后通过反射机制可以得到映射类信息,调用构造方法创建对象,调用每个 属性的 set 方法给对象设值完成数据的装载 50. 定义数组(易) type arrayName[] 51.说说数据连接池的原理(中) 对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。该模式正 是为了解决资源的频繁分配?释放所造成的问题。为解决上述问题,可以采用数 据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲 池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从 “缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大 连接数来防止系统无尽的与数据库连接。 更为重要的是我们可以通过连接池的管 理机制监视数据库的连接的数量?使用情况, 为系统开发?测试及性能调整提供依 据 52.如何配置 Tomcat(易) 1.下载 j2sdk 和 tomcat 2.安装和配置你的 j2sdk 和 tomcat 配置 JAVA_HOME CATALINA_HOME 3.在 server.xml 文件中可进一步修改配置 53. 10.Ajax 如何实现的(易) 实现 Ajax 的关键是使用 XMLHttpRequest 对象(下简称 XHR 对象) Step 1. 创建 XHR 对象实例 Step 2. 向服务器做请求

Step 3. 指定回调函数, 即当服务器返回结果时如何处理结果 Step 4. 使用 XHR 对象的 send 方法发送请求 54.如何实现代码的版本控制(中) 在服务器端建立该项目的数据库,并保存你选定的项目源文件的第一个版本。客 户端任一用户要获得某源文件的修改权利,需进行 check out 操作。之后客户端 一般每完成一个无编译错误的版本想保存的时候,进行 check in 操作,将当前版 本保存在服务器端上并成为最新版本(注意,不是覆盖以前的哟)。任一客户端 可以方便地得到服务器上的文件的任意版本(如果有权限的话)。一般还实现了 一个重要的功能是版本比较, 任一客户端可以利用版本控制工具对某文件的不同 版本进行版本比较, 它会标记出不同版本的同名文件的不同点,可以轻易地看出 版本内容的演化 常用的工具有 vss 和 cvs 55. J2EE 的好处是什么(中) J2EE 的全称是 Java 2 Platform Enterprise Edition,它是由 SUN 公司领导、各厂商 共同制定并得到广泛认可的工业标准。 业界各大中间件厂商如 BEA、 IBM、 Oracle 都积极地促进了它的“诞生”、“长大”。 从一开始,J2EE 走的就是开放路线——众多厂商共同制定规范,使得 J2EE 吸收了这些厂商多年来在系统设计、系统集成方面的经验、教训。同时,这些厂 商对新技术发展的预测以及各自独到的观点, 也会在 J2EE 的规范中体现。 所以, J2EE 产品可以满足当前不断变化、日趋复杂的商业需求。 保护企业的投资 对于很多企业而言, 在多年的发展过程中,它会有自己的技术人员设计开发 的系统, 也会有从专业软件公司那里买来的系统。这些系统可能是由同一种编程 语言写的,也可能是由不同的编程语言写的;可能运行在相同的操作系统上,也 可能需要运行在不同的操作系统上。 为了保护已有投资, 企业在构建新系统的时候,会尽量利用已有的系统以节 约人力物力并加快系统开发的速度。参加 J2EE 规范制定的各厂商都在自己的产 品中实现了和老系统的接口,如 BEA 的 WebLogic 可以直接调用 Tuxedo 中的服 务,IBM 的 WebSphere 也可以调用 CICS 的服务。Java 本身的跨*台性,使得 J2EE 产品几乎可以在任何操作系统上运行。因此,选择 J2EE,企业可以充分利用 已有硬件和操作系统。 对于系统将来的扩展,J2EE 规范也考虑得很周全。J2EE 规范强制开发者把 业务逻辑封装成可重用的组件模式。在系统扩展的时候,原来的组件可以直接使 用。另外,即使企业重新购买了别的 J2EE 产品,由于所有的 J2EE 产品都遵循 一个统一的规范,原来的组件只要经过极少的改动就可以在新的 J2EE 产品上使 用。这样,也避免了企业被一家厂商绑死。 56. Vector 和 ArrayList 的区别(中) 1,vector 是线程同步的,所以它也是线程安全的,而 arraylist 是线程异步的,是 不安全的。如果不考虑到线程的安全因素,一般用 arraylist 效率比较高。

2,如果集合中的元素的数目大于目前集合数组的长度时,vector 增长率为目前 数组长度的 100%,而 arraylist 增长率为目前数组长度的 50%.如过在集合中使用数 据量比较大的数据,用 vector 有一定的优势。 3,如果查找一个指定位置的数据,vector 和 arraylist 使用的时间是相同的,都是 0(1),这个时候使用 vector 和 arraylist 都可以。而如果移动一个指定位置的数据花 费的时间为 0(n-i)n 为总长度,这个时候就应该考虑到使用 linklist,因为它移动一 个指定位置的数据所花费的时间为 0(1),而查询一个指定位置的数据时花费的时 间为 0(i)。 57.Action 有几种?(中) 除了基本的 Action 之外, Struts 还提供了几个其他类型的 Action , 这些 Action 大大 丰富了 Struts 的功能。下面介绍如下儿个常用的 Action 。 ? DispatchAction: 能同时完成多个 Action 功能的 Action 。 ? ForwardActon: 该类用来整合 Struts 和其他业务逻辑组件,通常只对请求作有 效 性检查。 ? IncludeAction: 用于引入其他的资源和页面。 ? LookupDispatchAction: DispatchAction 的子类,根据按钮的 key ,控制转发给 action 的方法。 ? MappingDispatchAction: DispatchAction 的子类,一个 action 可映射出多个 Action 地址。 ? SwitchAction: 用于从一个模块转换至另一个模块,如果应用分成多个模块时, 就可以使用 SwitchAction 完成模块之间的切换。 58. 说说你知道的排序方式(难) 一 插入排序 该算法在数据规模小的时候十分高效,该算法每次插入第 K+1 到前 K 个有序数 组中一个合适位置,K 从 0 开始到 N-1,从而完成排序: 二 冒泡排序 这可能是最简单的排序算法了,算法思想是每次从数组末端开始比较相邻两元 素,把第 i 小的冒泡到数组的第 i 个位置。i 从 0 一直到 N-1 从而完成排序。 (当 然也可以从数组开始端开始比较相邻两元素,把第 i 大的冒泡到数组的第 N-i 个 位置。i 从 0 一直到 N-1 从而完成排序。)三,选择排序 选择排序相对于冒泡来说,它不是每次发现逆序都交换,而是在找到全局第 i 小 的时候记下该元素位置,最后跟第 i 个元素交换,从而保证数组最终的有序。 相对与插入排序来说,选择排序每次选出的都是全局第 i 小的,不会调整前 i 个 元素了。 四 Shell 排序 Shell 排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点: 1)当数据规模小的时候非常高效 2)当给定数据已经有序时的时间代价为 O(N)

所以,Shell 排序每次把数据分成若个小块,来使用插入排序,而且之后在这若 个小块排好序的情况下把它们合成大一点的小块,继续使用插入排序,不停的合 并小块,知道最后成一个块,并使用插入排序。 这里每次分成若干小块是通过“增量” 来控制的,开始时增量交大,接* N/2, 从而使得分割出来接* N/2 个小块,逐渐的减小“增量“最终到减小到 1。 一直较好的增量序列是 2^k-1,2^(k-1)-1,.....7,3,1,这样可使 Shell 排序时间复杂度达 到 O(N^1.5) 五 快速排序 快速排序是目前使用可能最广泛的排序算法了。 一般分如下步骤: 1)选择一个枢纽元素(有很对选法,我的实现里采用去中间元素的简单方法) 2)使用该枢纽元素分割数组,使得比该元素小的元素在它的左边,比它大的在 右边。并把枢纽元素放在合适的位置。 3)根据枢纽元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽 元素自己,对左边的,右边的分别递归调用快速排序算法即可。 快速排序的核心在于分割算法,也可以说是最有技巧的部分。 还有归并排序,堆排序,桶式排序,基数排序 59. 冒泡排序的时间复杂度(易) O(n*n) 60. 查出一个表中 30 到 50 条的数据,sql 语句(易) Select top 21 * from 表名 where id not in (select top 29 id from 表名 order by id) order by id 61.说一下存储过程如何定义,怎么用(易) Create procedure procedue_name [@parameter data_type][output] [with]{recompile|encryption} as sql_statement 解释: output:表示此参数是可传回的 with {recompile|encryption} recompile:表示每次执行此存储过程时都重新编译一次 encryption:所创建的存储过程的内容会被加密 使用:exec proc 存储过程名 参数列表 62.tcp 与 udp(难) OSI 和 tCp/Ip 模型在传输层定义两种传输协议: (或传输控制协议) UDp tCp 和 (或用户数据报协议) 。

UDp UDp 与 tCp 的主要区别在于 UDp 不一定提供可靠的数据传输。事实上,该协 议不能保证数据准确无误地到达目的地。UDp 在许多方面非常有效。当某个程 序的目标是尽快地传输尽可能多的信息时(其中任意给定数据的重要性相对较 低) ,可使用 UDp。ICQ 短消息使用 UDp 协议发送消息。 许多程序将使用单独的 tCp 连接和单独的 UDp 连接。重要的状态信息随可靠 的 tCp 连接发送,而主数据流通过 UDp 发送。 tCp tCp 的目的是提供可靠的数据传输, 并在相互进行通信的设备或服务之间保持一 个虚拟连接。tCp 在数据包接收无序、丢失或在交付期间被破坏时,负责数据恢 复。它通过为其发送的每个数据包提供一个序号来完成此恢复。记住,较低的网 络层会将每个数据包视为一个独立的单元,因此,数据包可以沿完全不同的路径 发送, 即使它们都是同一消息的组成部分。这种路由与网络层处理分段和重新组 装数据包的方式非常相似,只是级别更高而已。 为确保正确地接收数据,tCp 要求在目标计算机成功收到数据时发回一个确认 (即 ACK) 。如果在某个时限内未收到相应的 ACK,将重新传送数据包。如果 网络拥塞,这种重新传送将导致发送的数据包重复。但是,接收计算机可使用数 据包的序号来确定它是否为重复数据包,并在必要时丢弃它 63.sql 中如何去掉重复数据?(中) 分为是否有主键两种情况 如果没有主键: --将不重复的记录插入临时表 select distinct * into temp from test select * from temp --删除原表数据 delete test --从临时表复制过来 insert into test select * from temp select * from test --如果有主键 delete test2 where id not in ( select min(id) from test2 group by A,B )

select * from test2 64. html 水*对齐和垂直对齐的属性?如何获取单选按钮的值?(易) 水*:align 垂直: valign 单选按钮的值:form.控件名[i].value 65.容器的理解(中) 容器也是 java 程序,它的主要作用是为应用程序提供运行环境。 ,容器用来接 管安全性、并发性、事务处理、交换到辅助存储器和其它服务的责任 以 tomcat 为例:Tomcat 是一个后台服务进程,其它的 servlet(相当于 DLL)是 在 Tomcat 容器内运行,Broswer 只与 Tomcat 通迅; Tomcat 接受 browser 的请求, 经过一系列动作(如果是静态网页,那么装载,按 http 协议形成响应流;如果是 动态的如 JSP,那就要调用 JDK 中的 servlet.jsp 接口,解释形成静态网页,按 http 协议生成响应流发送回 browser)后,形成静态网页,返回响应。
Java 面试题总结 难 中 易

8. JSP 内置对象有哪些,,分别简述作用? 答:内置九大对象: a) b) c) d) e) f) request 对象:客户端的请求信息被封装在 request 对象中,通过它才能了解到客户的需求,然后做 出响应。它是 HttpServletRequest 类的实例。 response 对象:response 对象包含了响应客户请求的有关信息,但在 JSP 中很少直接用到它。它是 HttpServletResponse 类的实例。 session 对 象 : session 对 象 指 的 是 客 户 端 与 服 务 器 的 一 次 会 话 , 从 客 户 连 到 服 务 器 的 一 个 WebApplication 开始,直到客户端与服务器断开连接为止。它是 HttpSession 类的实例。 out 对象:out 对象是 JspWriter 类的实例,是向客户端输出内容常用的对象。 page 对象:page 对象就是指向当前 servlet 自身,有点象类中的 this 指针。 application 对象:application 对象实现了用户间数据的共享,可存放全局变量。它开始于服务器 的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间 的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用 户对此的访问。服务器的启动和关闭决定了 application 对象的生命。它是 ServletContext 类的实 例。 g) exception 对象:exception 对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这 个对象。如果一个 JSP 页面要应用此对象,就必须把 isErrorPage 设为 true,否则无法编译。他实际 上是 java.lang.Throwable 的对象。 h) pageContext 对象:pageContext 对象提供了对 JSP 页面内所有的对象及名字空间的访问,也就是说 他可以访问到本页所在的 SESSION,也可以取本页面所在的 application 的某一属性值,他相当于页 面中所有功能的集大成者,它的本 类名也叫 pageContext。 i) config 对象: config 对象是在一个 Servlet 初始化时, 引擎向它传递信息用的, JSP 此信息包括 Servlet 初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个 ServletContext 对象) 。 9. JSP 动作有哪些,简述作用?

答: JSP 动作是一系列可以调用内建于网络服务器中的功能的 XML 标签。 a) b) c) d) e) f) g) h) jsp:include 和子过程类似,JAVA SERVLET 暂时接管对其它指定的 JSP 页的请求和响应。当处理完该 JSP 页后就马*芽刂迫ń换沟鼻 JSP 页。这样 JSP 代码就可以在多个 JSP 页中共享而不用复制。 jsp:param 可以在 jsp:include, jsp:forward 或 jsp:params 块之间使用。指定一个将加入请求的 当前参数组中的参数。 jsp:forward 用于处理对另一个 JSP 或 SERVLET 的请求和响应。控制权永远不会交还给当前 JSP 页。 jsp:plugin Netscape Navigator 的 老 版本 和 Internet Explorer 使 用 不同 的 标 签 以嵌 入 一 个 applet。这个动作产生为嵌入一个 APPLET 所需要的指定浏览器标签。 jsp:fallback 如果浏览器不支持 APPLETS 则会显示的内容。 jsp:getProperty 从指定的 JavaBean 中获取一个属性值。 jsp:setProperty 在指定的 JavaBean 中设置一个属性值。 jsp:useBean 创建或者复用一个 JavaBean 变量到 JSP 页。

10. 写出 JAVA 的 8 个基本数据类型 答:byte、short、int、long、float、double、char、boolean 11. 请写出线程同步的方法 答:synchronized 12. 写出 java 异常处理的 5 个关键字,并简单描述作用 答:try、catch、finally、throw、throws 13. 描述 break 和 continue 控制循环的流程不同之处,简单写代码说明 答:break——中断本次循环并跳出当前循环 continue——中断本次循环并继续下次循环 14. 下面语句是否正确 public class hi{ public int addOne(final int x) { return ++x; } } 这样写对嘛? 答:这样写不对! 因为 addOne 中的参数是 final 类型的,不能够更改。 15. 写四个基本的 sql 语句,分别是增加,更新,查询,删除,其中查询返回数据且按序降序排序。 答: 增加:insert into users (user_name, user_password) values(‘test’,’123456’); 更新:update users set user_password=’12345678’; 删除:delete from users where user_name=’test’; 查询:select user_name,user_password from users order by user_name desc; 16. 写一个方法将两个数组合并成一个数组返回

答: public static Object[] concat(Object[] array1, Object[] array2) { if(array1 == null && array2 == null){ return new Object[0]; } if(array1 == null){ return array2; } if(array2 == null){ return array1; } int length1 = array1.length; int length2 = array2.length; Object[] concatArray = new Object[length1 + length2]; System.arraycopy(array1, 0, concatArray, 0, length1); System.arraycopy(array2, 0, concatArray, length1, length2); return concatArray; } 17. 用 java 编写一个截取字符串的函数,输入一个字符串和字节数,输入为按字节截取的字符串,但要保 证汉字不被截取半个,例如: “我 abc” ,4,应截取为:我 ab”,输入“我 abc 汉字”6,应该是输出” 我 abc“。而不是”我 abc”+汉的半个 答: public static String substring(String source, int length) { String isoResource = ""; try { isoResource = new String(source.getBytes("GBK"), "ISO8859_1"); } catch (java.io.IOException e) { isoResource = ""; } int strLength = isoResource.length(); if (strLength <= 0) { return ""; } if (length <= 0) { length = 0; } if (length > strLength) { length = strLength; } byte[] bs = null; try {

bs = source.getBytes("GBK"); } catch (UnsupportedEncodingException ex) { ex.printStackTrace(); bs = new byte[0]; } int i = 0; for (i = length - 1; i >= 0; i--) { if (bs[i] > 0) { break; } } if ((length - 1 - i) % 2 == 1) { length = length + 1; } return new String(bs, 0, length); } 18. 一个工程,包含哪些阶段?你在一般从事哪个阶段? 答:工程阶段包括:需求分析、架构设计、系统开发、系统测试、系统部署、系统维护等等 19. UML 有哪几类图,你都用过什么工具,简述方法。 答:UML 用例图与 UML 时序图 20. 你都知道什么文档类别?他们的作用是什么?测试用例应写在什么文档里? 答:需求分析文档、开发文档、测试文档、数据库设计文档等等。 21. 你都知道什么关系型数据库?你所熟悉的数据库是哪个? 答:MySQL、SQLServer、Oracle、DB2、Sysbase 比较熟悉 SQLServer 22. 有三张表 学生表 课程表 选课表 (1) (2) (3) 用 sql 语句建表,主键,自己设计。 查询年龄 20 岁以下的学生,要查 5 个字段,并且这 5 个字段含概了这 3 张表,且第一个表里没 用.Net3.5 中的 LINQ 实现第二问。

有年龄列,只有生日列。

23. ORM 框架技术用过什么? 答:常见的 ORM 框架有:Torque,OJB,Hibernate,TopLink,Castor JDO,TJDO,Active Record,ADO.NET Entity Framework。用过的是:Hibernate、ADO.NET Entity Framework 、JPA 24. SO OSI7 层模型是哪 7 层,分别是干什么用的? 25. TCP/UDP 的区别 答:TCP 协议保证数据传输的完整性

UDP 协议不保证 26. 你知道的应用层协议都有什么?他们的端口是多少? 答: a) b) c) d) e) f) g) TCP/IP 协议——传输控制协议(Transmission Control Protocol, TCP)和网际协议(Internet Protocol,IP) 。 TELNET 协议——Telnet 协议是 TCP/IP 协议族中的一员,是 Internet 远程登陆服务的标准协议和主 要方式。 SMTP 协议——简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是事实上的在 Internet 传输 email 的标准。 FTP 协议——文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标 准协议。 POP3 协议——邮局协议版本 3(Post Office Protocol - Version 3) 。是 TCP/IP 协议族中的一员。 主要用于支持使用客户端远程管理在服务器上的电子邮件。 UDP 协议——用户数据报协议 (User Datagram Protocol, UDP) 是一个简单的面向数据报的传输层协 议,是不可靠的数据报协议。 GPRS 技术——通用分组无线服务技术(General Packet Radio Service,GPRS)是 GSM 移动电话用户 可用的一种移动数据业务。 它经常被描述成“2.5G” ,也就是说这项技术位于第二代(2G)和第三代 (3G)移动通讯技术之间。 27. 无线局域网用的协议是? 答:GPRS。通用分组无线服务技术(General Packet Radio Service,GPRS)是 GSM 移动电话用户可 用的一种移动数据业务。 它经常被描述成“2.5G”,也就是说这项技术位于第二代(2G)和第三代(3G) 移动通讯技术之间。 28. 10 个随机数冒泡排序 答:public void sort(int[] values) { if (values == null) { return null; } int temp = 0; for (int i = 0; i < values.length; i++) { for (int j = i; j < values.length - 1; j++) { if (values[j + 1] > values[i]) { temp = values[j + 1]; values[j + 1] = values[i]; values[i] = temp; } } } } 29. 1-2+3-4+5-6+7-??+n 实现这个算法,要求传入参数 n,并且要考虑数量很大的情况。 答:public BigInteger operate(int n) {

BigInteger sum = new BigInteger("0"); for (int i = 1; i <= n; i++) { BigInteger num = new BigInteger(i + ""); if (i % 2 == 0) { num = num.negate(); } sum = sum.add(num); } return sum; } 30. doGet 方法的参数 答:HttpServletRequest 与 HttpServletResponse 31. 用 javascript 写出 AJAX 调用的基本实现? 答: <script> var http_request = false; //向服务器发起 XMLHTTP 请求。 function send_request() {//初始化、指定处理函数、发送请求的函数 http_request = false; //开始初始化 XMLHttpRequest 对象 if(window.XMLHttpRequest) { //Mozilla 浏览器 http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) {//设置 MiME 类别 http_request.overrideMimeType('text/xml'); } } else if (window.ActiveXObject) { // IE 浏览器 try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } if (!http_request) { // 异常,创建对象实例失败 window.alert("不能创建 XMLHttpRequest 对象实例."); return false; } url="http://localhost:8888/zf10/submit.jsp?operation=other&top=5"; http_request.onreadystatechange = processRequest;

// 确定发送请求的方式和 URL 以及是否同步执行下段代码 http_request.open("GET", url, true); http_request.send(null); } // 处理返回信息的函数 function processRequest() { if (http_request.readyState == 4) { if (http_request.status == 200) { // 判断对象状态 // 信息已经成功返回,开始处理信息

var returnStr = http_request.responseText; document.getElementById("newsCtrl").innerHTML = returnStr; } else { //页面不正常 alert("您所请求的页面有异常。"); } } } </script> 32. Xhtml XSLT xPath CSS 名词解释 答: XHTML——可扩展超文本置标语言(eXtensible HyperText Markup Language,XHTML) ,是一种置标 语言,表现方式与超文本置标语言(HTML)类似,不过语法上更加严格。从继承关系上讲,HTML 是一种基 于标准通用置标语言 (SGML) 的应用, 是一種非常灵活的置標語言, XHTML 则基于可扩展置标语言 而 (XML) , XML 是 SGML 的一个子集。 XSLT——XSLT 是扩展样式表转换语言(Extensible Stylesheet Language Transformations)的简称,把 XML 文档转化为另一文档的转换语言,即将源文档的所有数据或者部分数据,利用 XPath 进行选择,生成 另外的 XML 文档或者其他可直接显示或打印的文件格式(例如 HTML 文件、RTF 文件或者 TeX 文件) 。XSLT 语言是声明性的语言,即 XSLT 程序本身只是包含了一些转换规则的文档。而这些规则可以被递归地应用到 转换过程中。XSLT 处理程序会首先确定使用 XSLT 中的哪些规则,然后根据优先级作出相应的转换操作。 XSLT 本身也是一份 XML 文档,所以它也必须遵守严格的 XML 规范。 Xpath——XPath 即为 XML 路径语言(XML Path Language) ,它是一种用来确定 XML 文档中某部分位置的语 言。XPath 基于 XML 的树状结构,提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其 作为一个通用的、介于 XPointer 與 XSL 间的语法模型。但是 XPath 很快的被開發者採用來當作小型查詢 語言。 CSS——Cascading Style Sheets(层叠样式表/串樣式列表) ,简写为 CSS,由 W3C 定义和维护的标准, 一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语言。CSS 最主要的目的是将文件的结构(用 HTML 或其他相关的语言写的)与文件的显示(CSS)分隔开来。 33. 你知道的设计模型有哪些?谈谈 singleton 和 Adapter 思想 答:单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、修饰模式、命令模式、组合模式等等 34. 用报表打网页某个区域的技术方案。 答:在后台处理该区域,生成报表。 22 一个旅行者来到一个岛上旅行,岛上有两个部落,X 部落和 Y 部落,已知道 X 部落的人都说真话,Y 部

落的人都说假话,旅行者遇到了个土著人 A,问 A 是哪个部落的,A 说自己是 X 部落的,旅行者相信了他,让 他给自己当导游。然后他们又遇到了一个土著人 B,旅行者让 A 去问 B 是哪个部落的,A 回来告诉旅行者, 说 B 也是 X 部落的。旅行者晕了,于是问逻辑博士,A 是哪个部落的,逻辑博士说:A 确实就是 X 部落的。 请问,为什么? 答:因为岛上的人无论是属于哪个部落,都说自己是 X 部落的人。A 回来说: “他说他是 X 部落的人。,说 ” 明 A 说真话。 35. 一个正三角形,每个角上有一只蚂蚁,三只蚂蚁同时走,但不确定冲哪个角走,请问三只蚂蚁互不相 撞的几率有多大? 答:1/4。 计算出所有的可能性(P33) ,以及三只蚂蚁互不相撞的可能性(2,同时顺时针或者同时逆时针) 。 36. 谈谈 final, finally, finalize 的区别 答:final 是修饰符,用于修饰类和变量,表明该类或者变量不可更改。 finally 是用于表明该关键字描述的方法块是最终会被执行的。 finalize 是超级对象 Object 的方法 37. &和&&的区别 答:&是逻辑与,&&是短路与 对于 exp1&exp2 而言,即便 exp1 为 false,exp2 也会被执行,最终返回 false。意思就是说,无论如何, &两边的表达式都回被判断。 对于 exp1&&exp2 而言,如果 exp1 为 false,exp2 不会被执行,直接返回 false。意思就是说,只有当 exp1 为 true 时,才会继续判断 exp2。 38. Collection 和 Collections 的区别 答:Collection 是集合接口。而 Collections 是用于处理集合的工具类。 39. sleep() 和 wait() 有什么区别 答:sleep()是休眠,wait()是等待。 40. sqlserver 中的操作员是() A)dbo 答:A 41. 用最有效率的方法算出 2 乘以 8 等于几? 答:用位运算。2<<3 42. 什么是 linux 的基本命令 答:ls(列出某目录所有文件) ,mv(移动文件) ,cp(复制文件) ,rm(删除文件) ,cat(查看文文件) , ln(创建链接) ,shutdown(关机) ,reboot(*簦┑鹊取 43. Sql server 的存储过程是否了解 答:了解 B)administrator C)sa D)可以与数据库交互的用户

44. 在数据库方面都学过什么? 答:学过 SQL 语句、存储过程 45. 在上次的笔试题上打了多少分,为什么有问题 答: 46. JDBC 读取数据源的方法: 答:直接通过 JNDI 读取、使用 properties 配置文件、在连接池中配置 47. 简述一下 Hibernate。 答:Hibernate 是一个持久化框架,提供了持久化操作,使用了 OR 映射,完成了对数据库的读写。 48. Hibernate 实体文件配置的要点。 a) b) 每一个实体节点的 id 不能重复。 Id 节点有 genarate,column 属性,property 节点有 name,type 属性。

49. Many-to-one 的配置。 <many-to-one name="departInfo" class="com.myoffice.entity.DepartInfo" fetch="select" lazy="false"> <column name="DepartId" not-null="true" /> </many-to-one> 50. *时看了哪些课外文章。 答: 51. Hibernate 使用的 API 主要有哪些 答案:Configuration,SessionFactory,Session,Transction 52. 简述一下 Spring。 答:Spring Framework 是一个开源的 Java/Java EE 的应用程序框架。Spring Framework 提供了一个简易 的开发方式,这种开发方式,将避免那些可能致使底层代码变得繁杂混乱的大量的属性文件和帮助类。 Spring 中包含的关键特性 ? ? ? ? ? 强大的基于 JavaBeans 的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用 程序的组建更加快捷简易。 一个可用于从 applet 到 Java EE 等不同运行环境的核心 Bean 工厂。 数据库事务的一般化抽象层,允许宣告式(Declarative)事务管理器,简化事务的划分使之与底层无 关。 内建的针对 JTA 和 单个 JDBC 数据源的一般化策略,使 Spring 的事务支持不要求 Java EE 环境, 这与一般的 JTA 或者 EJB CMT 相反。 JDBC 抽象层提供了有针对性的异常等级(不再从 SQL 异常中提取原始代码), 简化了错误处理, 大大 减少了程序员的编码量. 再次利用 JDBC 时,你无需再写出另一个 '终止' (finally) 模块. 并且面 向 JDBC 的异常与 Spring 通用数据访问对象 (Data Access Object) 异常等级相一致. ? 以资源容器,DAO 实现和事务策略等形式与 Hibernate,JDO 和 iBATIS SQL Maps 集成。利用众多 的翻转控制方便特性来全面支持, 解决了许多典型的 Hibernate 集成问题. 所有这些全部遵从

Spring 通用事务处理和通用数据访问对象异常等级规范. ? 灵活的基于核心 Spring 功能的 MVC 网页应用程序框架。开发者通过策略接口将拥有对该框架的高 度控制, 因而该框架将适应于多种呈现(View)技术, 例如 JSP, FreeMarker, Velocity, Tiles,iText 以及 POI。值得注意的是,Spring 中间层可以轻易地结合于任何基于 MVC 框架的网页层,例如 Struts,WebWork,或 Tapestry。 ? 提供诸如事务管理等服务的面向方面编程框架。

53. Spring 自带的 AOP 有哪些。 答:@AspectJ 和基于 Schema 的两种切面定义的 AOP 54. Spring 里的声明式事务是怎么实现的。 先定义一个类,实现 MethodBeforeAdvice、AfterReturningAdvice 等接口。 在 Spring 配置文件里配置 advice 的 bean,然后配置代理类,在类里注入 advice 和目标类。 55. Spring 依赖注入有哪几种方式。 答:构造注入、接口注入、Set 方法注入、映射注入。 56. 什么是 AOP。 答:AOP 是面向方面编程。是把不是特定于某个事物的,很多事物共有的方面抽取出来,形成一个模块, 这个模块可以植入不同的系统,完成相同的操作。 57. 什么是 IOC。 答:IOC 是依赖注入,它实现了类与类之前的松藕合。不必在代码中出现一个类对另一个类的依赖,使得 维护方便。 58. 简述一下 Struts 的核心流程。 答: Struts 最主要的部分是 ActionServlet, 核心控制器, web 容器加载的时候, 在 就加载 ActionServlet, ActionServlet 通过查询字符串,把请求转发给 Action,Action 处理请求,在处理过程中,调用业务层, 然后把处理结果保存在 request 中,转发到展示给用户的页面。 59. Action 存在的作用域。 答:request。 60. 怎样布置 web 应用程序。 答:有三种方法:一种是把应用程序文件夹拷贝到 webapps 目录下,一种是把应用程序打成 war 包,拷贝 到 webapps 目录下,一种是在 tomcat 配置文件里把其他位置的应用程序文件夹配置下来。 61. 一个网页里有 10 个 div,一个网页里有 10 个 table,这两个页面哪个速度更快。 答:DIV 速度更快一些。因为对于 DIV 的解释是从内到外,而对于 TABLE 的解释则是见到</table>才会显 示所有的内容。 62. 一个 td 标签,有一个 id,里面是空的,怎样通过 javascript 在标签里设置文字。 答:使用 document.getElementById(“<td 的 Id>”).innerText = “111”;

63. 怎样使用 javascript 删除表格的一行数据。 答案:document.getElementById(“tableId”).deleteRow(rowIndex)。 64. 说说对 Hibernate 的理解,怎么使用 Hibernate 的; 答:Hibernate 是一个持久化解决方案,是对象-关系映射框架。首先在程序中加载 Hibernate 支持,再创 建 Hibernate 配置文件,创建实体类和映射文件。 65. 在 Hibernate 中所使用的类; 答:主要使用了:Session,SessionFactory,Transaction,Configuration; 66. 说说对 Struts 的理解,怎么使用 Struts 的; 答:按一定的规则组合在一起的,可重用的组件。 67. 在运行静态页面时,乱码问题怎么处理? 答:设置页面编码方式 68. 怎么使用 log4g 处理空指针异常? 答:配置一下异常的捕获处理 69. 说说 javaWeb; 答: 70. 单位,用户,角色,权限四个表之间是什么关系; 答:单位和用户表之间是一对多的关系,用户和角色之间是多对多的关系,角色和权限之间也是多对多的 关系。 71. 什么是 MVC 模式; 答: (Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式。 它把软件系统分为三个基本部分:模型(Model) ,视图(View)和控制器(Controller) 。 模型—视图—控制器模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程 序某一部分的重复利用成为可能。除此之外此模式通过对复杂度的简化使程序结构更加直观。软件系统通 过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。 a) 模型(Model)——“数据模型” (Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的 处理方法。 “模型”有对数据直接访问的权利,例如对数据库的访问。 “模型”不依赖“视图”和“控 制器” ,也就是说,模型不关心它会被如何显示或是如何被操作。但是模型中数据的变化一般会通过 一种刷新机制被公布。为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从 而,视图可以了解在数据模型上发生的改变。 (比较:观察者模式(软件设计模式) ) b) 视图(View)——视图层能够实现数据有目的的显示(理论上,这不是必需的) 。在视图中一般没有 程序上的逻辑。为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model) ,因此应该事 先在被它监视的数据那里注册。 c) 控制器(Controller)——控制器起到不同层面间的组织作用,用于控制应用程序的流程。它处理事 件并做出响应。 “事件”包括用户的行为和数据模型上的改变。

72. servlet,jsp 跟 MVC 是什么关系? 答:servlet——控制层,jsp——显示层。 73. 自定义标签是怎么使用的? 答: 继承 Struts 的相关标签基类 (BodyTagSupport 或者 BaseHandlerTag) 并且实现相关方法 , (doStartTag 和 doEndTag)即可。 74. public class a { int il=9; static int i2=9; final int i3=10; } 请 指出 static 和 final 所代表的含义 答:static 是指该变量为类变量,在内存中只有一份,所有该类对象共享该变量; Final 是指该变量为常量,不能被修改。 75. 类 a 的成员变量如果没有初始化缺省是什么值? Class bbb{} public class a{ boolean a1; int a2; String a3; bbb a4; int[] a5; } 答: Class bbb{} public class a{ boolean a1;//false; int a2;//0 String a3;//null bbb a4;//null int[] a5;//null } 76. 下面的程序有问题?该如何纠正? public class MyClass{ public static void main(String arguments[]){ amethod(arguments); } public void amethod(String[] arguments){ System.out.println(arguments); System.out.println(arguments[1]);

} } 答:在静态方法中不能调用非静态方法和属性。 两种改法:要么把 amethod()声明为 static,要么在 main 方法中构造 MyClass 对象,由 MyClass 对象调用 amethod()方法。 77. 类成员的默认访问和 public,protected,private 访问指示符代表的含义? 答:public 指该变量可以被所有其他对象访问;protected 指该变量只能被继承类访问;private 指该变 量只能被本类对象访问。 78. 下面代码有什么问题? abstract class MineBase{ abstract void amethod(); static int I ; } public class Mine extends MineBase{ public static void main(String argv[]){ int[] ar=new int[5]; for(i=0;i<ar.length;i++) System.out.println(ar[i]); } } 答:Mine 是 MineBase 的子类,要么实现 MineBase 的抽象方法 amethod(),要么把自己声明为 abstract。 79. 布局管理器(Layout Manager)是做什么用的?举几个 SDK 提供的布局管理器? 答:用来管理 UI 界面对象布局的。 常见的有 FlowLayout、GridLayout 等。 80. 下面哪些是正确的? 1)The ActionListener interface has no corresponding Adapter class 2) The processing of an event listener requires a try/catch block 3) If multiple listeners are added to a component only events for the last listener added will be processed 4) If multiple listeners are added to acomponent the events will be processed for all but with no guarantee in the order 答:3 81. 下面哪些是正确的? 1) A class may extend only one other class and implement only one interface 2) interfaces are the Java approach to addressing its lack of multiple inheritance but require implementing classes to create the functionality of the Interfaces. 3) All of the variables in an interface are implicitly static and final 4) All of the methods in an interface are implicitly abstract 答:2、3、4

82. 根据前面给出的类,下面四个哪些编译没有错误 interface Iface{} Class Cface implements Iface{} Class Base{}; Public class ObRef extends Base{ ObRef ob=new ObRef(); Base b=new Base(); Object o1=new Object(); Iface o2=new Cface(); } 1)o1=o2; 2)b=ob; 3)ob=b; 4)o1=b; 答:1、2、4 83. 下面哪些是正确的? 1) At the root of the collection hierarchy is a class called Collection 2) The collection interface contains a method called enumerator 3) The interator method returns an instance of the Vector class 4) The set interface is designed for unique elements 答:4 84. 下面的程序合理吗?(其中 Items[i]是 String 类型的数组)?为什么?如何改进? public String statement(){ String =””; for(int i=0;i<500;i++) s+=Item[i]; return s; } 答:String 的连接操作(+=)会产生很多对象,性能不好 public String statement(){ StringBuffer buffer = new StringBuffer(); for(int i=0;i<500;i++) buffer.append(Item[i].toString()); return buffer.toString(); } 85. 通常情况下,下面这段程序怎样改进才更合理?为什么? try{ Statement sm = con.createStatement(); ResultSet rs=sm.execQuery(“SQL 字符串”);

int i=rs.getInt(1); //其它语句 rs.close(); sm.close(); }catch(SQLException e){ 处理程序 } 答:数据库的释放应该在 finnaly 块中 Statement sm = null; ResultSet rs = null; try{ m = con.createStatement(); rs=sm.execQuery(“SQL 字符串”); int i=rs.getInt(1); //其它语句 }catch(SQLException e){ 处理程序 }finally{ try{ if(rs != null && !rs.isClosed()){ rs.close(); } }catch(Exception ex){ rs = null; } try{ if(sm != null){ sm.close(); } }catch(Exception ex){ sm = null; } } 86. 假如一个 JAVA 程序 bbb.java 用到了 aaa.jar 中的某个类,所需的其他类都正确定义在类路径中。 aaa.jar 放在目录 c:\aaa 中,假如在环境变量 CLASSPATH 加入目录 c:\aaa(继比如 Classpath=其他 目录或者文件 c:\aaa)bbb.java 成功编译为 bbb.class 那么 java bbb.class 会运行成功吗?如果不能运行话,什么原因? 答:能够正确运行。 87. 如果编译和运行下面的代码,哪一个会发生 class Base{ private void amethod (int iBase){ System.out.println(“Base.amethod”);

} } class Over extends Base{ public static void main(String vrgv[]){ Over o=new Over(); int iBase=0; o.amethod(iBase); } public void amethod(int iOver){ System.out.println(“Over.amethod”); } } 1)Compile time error complaining that Base amethod is private 2)Runtime error complaining that Base amethod is private 3)Output of “Base.amethod”; 4)Output of “Over.amethod”; 答:4 88. JAVA 是具有对象回收(垃圾回收)功能 的,简要说明为什么还有“内存泄漏”现象? 答:垃圾回收是指对于那些没有被引用的对象,JVM 会自动回收。 但是,如果很多对象依然被其他对象引用,那么 JVM 就不会回收,这就造成“内存泄漏”现象 89. Hibernate 的三种状态

90. static 和 final 的区别 答:static 所修饰的对象全局对象,static 所修饰的属性是类属性。static 对象和属性在内存中只存在 一份。 final 修饰的对象是不可更改的对象,final 修饰的属性是常量,也不可更改。 91. 下面代码有错误吗?为什么? public class Test{ public static void main(string []args){ amethod(); } public void amethod(){ System.out.prinln("this amethod "); } } 答:在静态方法中不能调用非静态方法和属性。 两种改法: 要么把 amethod()声明为 static, 要么在 main 方法中构造 Test 对象, Test 对象调用 amethod() 由 方法。 92. 下面这段代码合理吗?如不合理应怎样改正?

public String setout(){ String s=""; for(int i=0;i<500;i++){ s+=i; } return i; } 答:字符串连接操作(+=)会产生很多中间对象,性能不好。 public String setout(){ StringBuffer buffer=new StringBuffer(); for(int i=0;i<500;i++){ buffer.append(i); } return buffer.toString(); } 93. 你都看过那些 Java 方面的书? 94. 递归:0,1,1,2,3,5,8,13,21??第 30 位是什么数值,要求用递归方法。 答: public class Fibonacci{ int fib(int n){ if (n == 0) return 0; else if (n == 1) return 1; else return fib(n-1) + fib(n-2); } public static void main(String[] args){ int[] fi=new int[30]; Fibonacci f = new Fibonacci(); for(int i=0;i<30;i++){ fi[i]=f.fib(i+1); System.out.print(fi[i]+“\t“); } } } 95. 除了用 session,application,cookie 在页面之间传值还有哪些方法? 答:request.setAttribute();以及 URL 方式 96. 什么是 SQL 注入?举例说明 答:SQL 资料隐码攻击(SQL injection)又称为隐码攻击、SQL 注入等,是发生于应用程式之资料库层的 安全漏洞。简而言之,是在输入的资料字串之中夹带 SQL 指令,在设计不良的程式当中忽略了检查,那麽 这些夹带进去的指令就会被资料库伺服器误认为是正常的 SQL 指令而执行,因此招致到破坏。

例子 某个网站的登入验证的 SQL 查询代码为 strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');" 恶意填入 userName = "' OR '1'='1";与 passWord = "' OR '1'='1";时,将导致原本的 SQL 字串被填为 strSQL = "SELECT * FROM users WHERE (name = '' OR '1'='1') and (pw = '' OR '1'='1');" 也就是实际上运行的 SQL 命令会变成下面这样的 strSQL = "SELECT * FROM users;" 因此达到无帐号密码,亦可登入网站。所以 SQL 隐码攻击被俗称为骇客的填空游戏。 97. 写一个 getWeek(aDate)方法,根据时间返回星期一星期二。。 。。 答:public String getWeek(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); switch (dayOfWeek) { case 1: return "星期日"; case 2: return "星期一"; case 3: return "星期二"; case 4: return "星期三"; case 5: return "星期四"; case 6: return "星期五"; case 7: return "星期六"; } return ""; } 98. Hibernate 的缓存是在何时清除的? 答: 99. Hibernate 中的 inverse 设为 false 是什么意思? 答:代表由自己来维护数据关系 100.简述 Struts 工作流程 答:首先 actionservlet 是 strtus 最核心的组件,当 web 容器启动时,actionservlet 就被初始化,并加 载 struts 配置文件,从而得知哪个 action 与哪个 actionform 是关联的,并且知道哪个请求路径与哪个 action 关联。当一个.do 请求到来是,首先会被 actionservlet 拦截,并根据配置信息分析该请求路径对 应的 actionbean 和 formbean, 如前面加法器请求页面提交时, 是请求 http://localhost:8080/zf2/add.do,

因此 actionservelt 根据 struts 配置信息查找 path 属性为/add 的 actionbean,于是找到 addaction,并 得知该 action 的 name 属性为 addform,于是找到 addform 的实例(如果不存在,则创建) 之后,将请求中包含的值填充到 formbean 中,然后在 action 中实例化模型层的对象对请求数据进行处理, 并将返回的结果,发送到视图层。 (使用 actionforward) 101.写一个存储过程,一个表 test 有三列 ID,name,password,当输入的用户名和密码和数据库相同时 返回 1,否则返回 0 答: 102.显示数据时原来是一列,如何改为两列? 103.public class StaticTest{ static int x=10; static { x+=5; } public static void main(String args[]){ System.out.println("x="+x); } static { x/=3; } } 输出等于 5 为什么? 答:static int x=10; static {x+=5;} static {x/=3;} ——x=10; ——x=15; ——x=5;

104.int [] arr=new int[25] A.arr[24]==0 .B.arr[0]==null .C.arr[25]==0. D.arr[24]==null; 答:A。int 数组初始化时,所有元素全部初始化为 0 。 105.JSP 和 servlet 的生命周期和二者的关系。 答:生命周期分为 4 个阶段:1.加载。2.初始化。3.调用。4.销毁。 JSP 最终会被编译为 Servlet 执行。一般情况下,JSP 用以展示数据,作为 MVC 中 View 层出现,Servlet 用以控制业务流程,作为 MVC 中的 Control 层出现。 106.javascript 实现浮动广告,随浏览器的垂直滚动而滚动。 答:SCRIPT language="javascript"> var advInitTop=0; function inix(){ advInitTop=document.getElementById("advLayer").style.pixelTop; } function move(){

document.getElementById("advLayer").style.pixelTop=advInitTop+document.body.scrollTop; } window.onscroll=move; </SCRIPT> <BODY onLoad="inix()" > <DIV id="advLayer" style="position:absolute; left:16px;top:129px;width:144px; height:95px; z-index:1;"><A href="#"><IMG src="images/advpic.gif" width="180" height="230" border="0"></A></DIV> </BODY> 107.城门口站两个人。一个是骗子.一个是好人.骗子说假话.好人说真话.怎么判断谁是好人谁是骗子。 答:让 A 去问 B:你是好人么?如果 A 回话说 B 说自己是好人,则 A 就是好人。如果 A 回话说 B 说自己是 骗子,则 A 是骗子。 108.一个很有钱的人家。户主老婆要生孩子了。这时候户主要挂,死前留遗嘱,如果生儿子,儿子和妻子 各占一半家产。如果生女儿,女儿占 1/3 家产,其他给她妈。说完户主就死了。过两天妻子生了,双 胞胎一男一女。问这时候应该怎么分。 答:妻子与儿子的财产比例是 1:1,妻子与女儿的财产比例是 2:1,财产分成 5 份,妻子和儿子各拿 2 份, 女儿拿 1 份。 109. 堆和栈的原理。 它作为一种数据结构,是管理内存数据的一种方式,其特点就是后进先出,last in first out 即 LIFO 110、线程的原理。 在一个进程中启动多个子进程,该子进程就是线程.一般由 CPU 分时机制控制调度。 111、怎样用两个栈实现队列。 这个参考以下内容: 栈是一种后入先出的数据容器,因此对队列进行的插入和删除操作都是在栈顶上进行;队列是一种先入先 出的数据容器,我们总是把新元素插入到队列的尾部,而从队列的头部删除元素。我们通过一个具体的例 子来分析往该队列插入和删除元素的过程。首先插入一个元素 a,不妨把先它插入到 m_stack1。这个时候 m_stack1 中的元素有{a}, m_stack2 为空。 再插入两个元素 b 和 c, 还是插入到 m_stack1 中, 此时 m_stack1 中的元素有{a,b,c},m_stack2 中仍然是空的。这个时候我们试着从队列中删除一个元素。按照队列先入 先出的规则,由于 a 比 b、c 先插入到队列中,这次被删除的元素应该是 a。元素 a 存储在 m_stack1 中, 但并不在栈顶上,因此不能直接进行删除。注意到 m_stack2 我们还一直没有使用过,现在是让 m_stack2 起作用的时候了。如果我们把 m_stack1 中的元素逐个 pop 出来并 push 进入 m_stack2,元素在 m_stack2 中的顺序正好和原来在 m_stack1 中的顺序相反。 因此经过两次 pop 和 push 之后, m_stack1 为空, m_stack2 而 中的元素是{c,b,a}。 这个时候就可以 pop 出 m_stack2 的栈顶 a 了。 之后的 m_stack1 为空, m_stack2 pop 而 的元素为{c,b},其中 b 在栈顶。这个时候如果我们还想继续删除应该怎么办呢?在剩下的两个元素中 b 和 c,b 比 c 先进入队列,因此 b 应该先删除。而此时 b 恰好又在栈顶上,因此可以直接 pop 出去。这次 pop 之后,m_stack1 中仍然为空,而 m_stack2 为{c}。从上面的分析我们可以总结出删除一个元素的步骤:当 m_stack2 中不为空时,在 m_stack2 中的栈顶元素是最先进入队列的元素,可以 pop 出去。如果 m_stack2 为空时,我们把 m_stack1 中的元素逐个 pop 出来并 push 进入 m_stack2。由于先进入队列的元素被压到 m_stack1 的底端,经过 pop 和 push 之后就处于 m_stack2 的顶端了,又可以直接 pop 出去。接下来我们再 插入一个元素 d。我们是不是还可以把它 push 进 m_stack1?这样会不会有问题呢?我们说不会有问题。因

为在删除元素的时候,如果 m_stack2 中不为空,处于 m_stack2 中的栈顶元素是最先进入队列的,可以直 接 pop;如果 m_stack2 为空,我们把 m_stack1 中的元素 pop 出来并 push 进入 m_stack2。由于 m_stack2 中元素的顺序和 m_stack1 相反,最先进入队列的元素还是处于 m_stack2 的栈顶,仍然可以直接 pop。不 会出现任何矛盾。我们用一个表来总结一下前面的例子执行的步骤:操作 m_stack1 m_stack2 append a {a} {} append b {a,b} {} append c {a,b,c} {} delete head {} {b,c} delete head {} {c} append d {d} {c} delete head {d} {} 总 结 完 push 和 pop 对 应 的 过 程 之 后 , 我 们 可 以 开 始 动 手 写 代 码 了 。 参 考 代 码 如 下 : /////////////////////////////////////////////////////////////////////// // Append a element at the tail of the queue /////////////////////////////////////////////////////////////////////// template<typename T> void CQueue<T>::appendTail(const T& element) { // push the new element into m_stack1 m_stack1.push(element); } /////////////////////////////////////////////////////////////////////// // Delete the head from the queue /////////////////////////////////////////////////////////////////////// template<typename T> void CQueue<T>::deleteHead() { // if m_stack2 is empty, // and there are some elements in m_stack1, push them in m_stack2 if(m_stack2.size() <= 0) { while(m_stack1.size() > 0) { T& data = m_stack1.top(); m_stack1.pop(); m_stack2.push(data); } } // push the element into m_stack2 assert(m_stack2.size() > 0); m_stack2.pop(); 112、什么是工作流。 工作流(Work Flow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则 在计算机中以恰当的模型进行表示并对其实施计算。工作流要解决的主要问题是:为实现某个业务目标, 在多个参与者之间,利用计算机,按某种预定规则自动传递文档、信息或者任务。简单地说,工作流就是 一系列相互衔接、自动进行的业务活动或任务。我们可以将整个业务过程看作是一条河,其中流过的河水

就是工作流。 可以把 OA 系统理解为工作流的一种解决方案。 113、什么是 SOA。 面向服务的体系结构(Service-Oriented Architecture,SOA)即 SOA.具体来讲它是一个组件模型,它将 应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中 立的方式进行定义的,它应该独立于实现服务的硬件*台、操作系统和编程语言。这使得构建在各种这样 的系统中的服务可以一种统一和通用的方式进行交互。 使用 SOA 可以更好、更灵活的为企事业构建应用程序和业务流程。

114、ant 打包。 Ant 是一种基于 Java 的 build 工具。 具体操作步骤比较繁琐,目前所有 IDE 都支持自动编译部署。

115、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and) 116、简述 TCP 的 3 次握手建立连接。 在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器 确认; SYN: 同步序列编号(Synchronize Sequence Numbers) 第二次握手: 服务器收到 syn 包, 必须确认客户的 SYN ack=j+1) 同时自己也发送一个 SYN 包 ( , (syn=k) , 即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态; 第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确* ACK(ack=k+1),此包发送完毕, 客户端和服务器进入 ESTABLISHED 状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据

117、shell 排序,插入排序。 shell 排序是一种插入排序法,它出自 D.L.Shell,因此而得名。Shell 排序又称作缩小增量排序。其 基本思想: 不*汛判虻亩韵蠓殖扇舾筛鲂∽椋酝恍∽槟诘亩韵蟛捎弥苯硬迦敕ㄅ判颍蓖瓿闪怂卸韵 都分在一个组内的排序后,排序过程结束。每次比较指定间距的两个数据项,若左边的值小于右边的值, 则交换它们的位置。间距 d 按给定公式减少: di+1 =(di +1)/2 ,直到 d 等于 1 为止。D 可以选取{9, 5,3,2,1}。 插入排序的基本思想: 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序,直到 待排序数据元素全部插入完为止。 即经过 i-1 遍处后,L[1..i-1]己排好序。 i 遍处理仅将 L 插入 L[1..i-1] 第 的适当位置 p,原来 p 后的元素一一向右移动一个位置,使得 L[1..i]又是排好序的序列。

118、启动一个线程是用 run()还是 start()? 启动线程是用 start 方法,调用 start 方法是会自动执行 run 方法。 119、什么是 EL? 答:EL 是 Expression Language 的缩写,即表达式语言,它是在在 jsp 页面中访问 JavaBean 的一种快速 有效的解决方案。




友情链接: