struts2面试题 1 2010年07月10日15:14 Struts1与Struts2的区别 ,它们常 用到哪几个 类 , 以及工 作流程 ? Struts1: ActionServlet[process()], RequestProcessor[processPreprocess()], PlugIn, Action, ActionForm, ActionForward,ActionMapping ,struts-config.xml Struts2: FilterDispatcher, ActionSupport, ServletActionContext[getResponse()], ModelDriven[getModel()],MethodFilterInterceptor struts.xml,它是在 WebWork 基础上 发展起来的 . Struts 工作流 程 : struts1: 发布 Struts Web 服务时 ,根据 web.xml 初始化 ActionServlet,ActionContext 等内容 . 在接到 一个 HttpRequest 请求后 ,ActionServlet 根据 struts-config.xml 中的配 置内容 ,将请求 的 参 数传到对应 的 Formbean 中,并设置 session.然后根据请求 中 的 Action 参数 ,在struts-config.xml 中查找 指定的 Action,并调用此 Action 来处理 请求 .根据 Action 的处理 结果 ,会返回 一个 forward 变量 ,此时通过 mapping.findForward()查找出 对应的 forward 所标示的 Action 或者 JSP 页面 ,将 请求转 到下一个处 理 .如果是 forward 指向 JSP 页面 ,则输出 到前台 . Struts2: (1)客户端 提交一个 HttpServletRequest 请求 (.action 或JSP 页面 ) (2)请求被 提交到一系列 Filter 过滤器 ,如ActionCleanUp 和FilterDispatcher 等 (3)FilterDispatcher 是Struts2控制器 的核心 ,它通常 是过滤器链 中的最后一 个过滤器 (4)请求 发 到 FilterDispatcher 后,FilterDispatcher 询问 ActionMapper 是否 需 要 调 用 某 个 Action 来处理 这个 Request(一般根据 URL 后缀是 否为 .action 来判断 ) (5)如果 ActionMapper 决定需 要调用某个 Action,FilterDispatcher 则把请 求交到 ActioProxy,由其 进行处 理 . (6)ActionProxy 通过 Configuration Manager(它会访问 struts.xml)询问框 架的配置文 件 ,找到需 要 调用的 Action 类. (7)ActionProxy 创建一个ActionInvocation 实例,而ActionInvocation 通过代理模式调用 Action,(在调用 之前会根据 配置文件加 载相关的所有 Interceptor 拦截器 ) (8)Action 执行完 毕后 ,返回一个 result 字符串 ,此时再 按相反的顺 序通过 Interceptor 拦截器 . (9) 最后 ActionInvocation 负责根据 struts.xml 中配置的 result 元素 ,找到与 返回值对应的 result, 决定进 行下一步输 出 . ?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 A PI(这使 得测试要依 赖 于 容器)。一个第三方扩展--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,因此 使用 JSTLEL。这种 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支持通过拦截器堆栈( Interceptor Stacks)为每一个 Action 创建不同的生命周期。堆 栈能够 根据需要和 不同的 Action 一起使 用。 Servlet,Filter 和Listener 实现的 接口 . Servlet 继承 HttpServlet 类 Filter 实现 Filter 接口 Listener 实现 HttpSessionListener,HttpSessionAttributeListener 接口 ------------------------------------------------------------------------------------ Java 面试中 ,最常被人 问到的几个 问题: 1. java.util.*包的 UML 结构图 。 2. Vector 和ArrayList、LinkedList 区别 ? Hashtable 和HashMap 之间的 区别 3. String、StringBuffer,StringBuilder 之间区 别。 --回答 -- 1. Collection ? | ? |_List ? |? |_LinkedList ? |? |_ArrayList ? |? |_Vector ? | |_Stack |? |_Set |_HashSet?? Map ? |? |_HashMap ? | ? | Dictionary ?|_ |_Hashtable Comparetor 2.? LinkedList 内部以 链表形式存 储数据 ?? ArrayList 内部以 数组形式存 储数据。 ? ? Vector 同ArrayList,不过 它与 ArrayList 比较起 来是 thread-safe 的。 ? ? Hashtable 是继承了 Dictionary,是线程安全的。 HashMap 实现了 Map 接口,不是线程安全 的。 ??? 如何保 证 线 程 安全 的 ? 每 个修 改 容 器 中数 据 的 操 作都 是 同 步 的( synchronized), 因此保 证了线程安 全。 3. String 是长 度 不 可 变 的 , StringBuffer 和StringBuilder 长度 都 是 可 以 变 化 的 。 StringBuffer 是线程 安全的, StringBuilder 不是线 程安全的。 ------------------------------------------------------------------------------==== 2、Anonymous Inner Class (匿名内部类) 是否可以extends( 继承)其它类,是否可以 implements(实现 )interface(接口 ) 答: 匿 名 的内部类是 没有名字的 内部类。 不能 extends(继承 ) 其它类 , 但 一 个内部类可 以作 为 一个接 口,由另一 个内部类实 现 3、Static Nested Class 和Inner Class 的不同 答:Nested Class (一般是 C++的说法),Inner Class (一般是 JAVA的说法 )。Java 内部类与 C++ 嵌套类 最大的不同 就在于是否 有指向外部 的引用上。 注 : 静态内 部类 ( Inner Class) 意 味着 1 创建一个 static 内部类的对象,不需要一个 外部类对象 , 2不能从一个 static 内部类的一个对 象访问 一个外部类 对象 4、&和&&的区别 答: &是位运 算符,表示 按位与运算 , &&是逻辑 运算符,表 示逻辑与( and) 5、Collection 和Collections 的区别 答: Collection 是集合 类的上级接 口, 继 承 与他的接口 主要有 Set?和List.Collections 是针对 集 合类的 一个帮助类 ,他提供一 系列静态方 法实现对各 种集合的搜 索、排序、 线程安全化 等操 作6、 什 么 时候用 assert 答:assertion(断言 )在软件 开发中是一 种常用的调 试方式, 很 多 开发 语 言中都 支持这种机 制。 在 实现中 , assertion 就是在 程序中的一 条语句, 它 对一个 boolean 表达 式进行 检查, 一 个正 确程序必须 保证这个 boolean 表达式 的值为 true; 如 果该 值为 false,说明 程序已经处于不正确 的状态下,系统将给出警告 或退出。一 般来说, assertion 用于保证程序 最基本、关键的正确性。 assertion 检查通常在开发和测试时开 启。为了提 高性能,在 软件发 布后, assertion 检查通 常是关闭的 7、String s = new String("xyz");创建了 几个 String Object 答:两 个,一个字 符对象,一 个字符对象 引用对象 8、Math.round(11.5)等於多 少 ? Math.round(-11.5)等於多 少 答:?Math.round(11.5)==12;Math.round(-11.5)==-11;round 方法返 回与参数最 接近的长整 数,参 数加 1/2后求其 floor 9、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;(可以 正确编译) 10、Java 有没有 goto 答: java 中的保 留字,现在 没有在 java 中使用 11、数组 有没有 length()这个方 法 ? String 有没有 length()这个方 法 答:数 组没有 length()这个方 法,有 length 的属性 。 String 有有 length()这个方 法 12、Overload 和Override 的区别 。 Overloaded 的方法 是否可以改 变返回值的 类型 答: 方 法 的 重 写 Overriding 和重 载 Overloading 是Java 多态 性的不同表现。重写Overriding 是父类 与子类之间 多态性的一 种表现, 重载 Overloading 是一个 类中多态性 的一种表现 。 如 果 在子类 中定义某方 法与其父类 有相同的名 称和参数, 我 们 说该方法被 重写 ?(Overriding)。子类 的对象使 用 这个 方法 时 ,将 调用 子 类中 的定 义 ,对 它而 言 ,父 类中 的 定义 如同 被 "屏蔽 "了。 如果在 一个类中定 义了多个同 名的方法, 它们或有不 同的参数个 数或有不同 的参数类型 ,则 称为方 法的重载 (Overloading)。Overloaded 的方法 是可以改变 返回值的类 型 13、Set 里的元 素是不能重 复的, 那 么用 什么方法来 区分重复与 否呢 ? 是用 ==还是 equals()? 它 们有何 区别 答:Set 里的元 素是不能重 复的, 那 么用 iterator()方法来 区分重复与 否。 equals()是判读 两个 Set 是否相 等 ????equals()和==方法决 定引用值是 否指向同一 对象 equals()在类中 被覆盖, 为 的是 当 两个分 离的对象的 内容和类型 相配的话, 返回真值 15、error 和exception 有什么 区别 答: error?表示恢 复不是不可 能但很困难 的情况下的 一种严重问 题。 比 如说内存 溢出。 不 可 能 指望程 序能处理这 样的情况 ????exception?表示一 种设计或实 现问题。也 就是说,它 表示如果 程序运 行正常,从 不会发生的 情况 16、List, Set, Map 是否继 承自 Collection 接口 答: ?List,Set 是, Map 不是 17、abstract class 和interface 有什么 区别 答:声 明方法的存 在而不去实 现它的类被 叫做抽象类 ( abstract?class) , 它 用于要创建 一个体 现某些 基本行为的 类, 并 为该类 声明方法, 但 不 能在该 类中实现该 类的情况。 不 能创建 abstract ?类的实 例。 然 而可以 创建一个变 量, 其 类型是 一个抽象类 , 并 让它 指向具体子 类的一个实 例。 不能有抽象构造函数或抽象静态方法。 Abstract?类的子类为它们父类中的所有抽象方法提供 实现, 否则它们也 是抽象类为 。取而代之 ,在子类中 实现该方法 。知道其行 为的其它类 可以 在类中 实现这些方 法接口 ( interface) 是 抽 象类的 变体。 在 接 口中, 所 有方法 都是抽象的 。 多 继承性可通过 实现 这样的 接口 而获得 。接 口中的 所有 方法都 是抽 象的, 没有 一个有 程序 体。 接口只可以定义 static?final 成员变量。接口的实现与子类相似,除了该实现类不 能从接口定 义中继 承行为。当 类实现特殊 接口时,它 定义(即将 程序体给予 )所有这种 接口的方法 。然 后,它 可以在实现 了该接口的 类的任何对 象上调用接 口的方法。 由于有抽象 类,它允许 使用 接口名 作为引用变 量的类型。 通常的动态 联编将生效 。引用可以 转换到接口 类型或从接 口类 型转换 , instanceof?运算符 可以用来决 定某对象的 类是否实现 了接口 18、abstract 的method 是否可 同时是 static,是否可 同时是 native,是否 可同时是 synchronized 答:都 不能 19、接口 是 否 可 继承 接 口 ? 抽象类 是 否 可 实现 (implements)接口 ? 抽象类 是 否 可 继承 实 体类 (concrete class) 答: 接 口可以继 承接口。 抽 象类可以 实现 (implements)接口, 抽 象类是 否可继承实 体类, 但 前 提是实 体类必须有 明确的构造 函数 20、构造器 Constructor 是否可被 override 答:构 造器 Constructor 不能被 继承,因此 不能重写 Overriding,但可 以被重载 Overloading 21、是否 可以继承 String 类 答: String 类是 final 类故不 可以继承 22、try {}里有一个 return 语句,那么紧跟在这 个 try 后的 finally {}里的 code 会不会被执行, 什么时 候被执行,在 return 前还是 后 答:会 执行,在 return 前执行 23、用最 有效率的方 法算出 2乘以 8等於几 答: 2?<3 24、两个 对象值相同 (x.equals(y) == true),但却 可有不同的 hash code,这句 话对不对 答:不 对,有相同的 hash?code 25、当一 个对象被当 作参数传递 到一个方法 后,此方法 可改变这个 对象的属性 ,并可返回 变 化后的 结果, 那么 这里到底是 值传递还是 引用传递答 : 是值传递 。 Java?编程语 言只有值传 递 参数。 当一个对象 实例作为一 个参数被传 递到方法中 时,参数的 值就是对该 对象的引用 。对 象的内 容可以在被 调用的方法 中改变,但 对象的引用 是永远不会 改变的 26、swtich 是否能作 用 在 byte 上,是否 能 作用 在 long 上,是否 能 作用 在 String 上答: witch (expr1)中,expr1是一个整数表达式。因此传递给?switch?和?case?语句的参数应该 是?int、?short、?char?或者 ?byte。long,string?都不能 作用于 swtich 27、ArrayList 和Vector 的区别 ,HashMap 和Hashtable 的区别 答:就 ArrayList 与Vector 主要从 二方面来说 .一.同步性 :Vector 是线程 安全的,也 就是说是同 步的,而 ArrayList 是线程 序不安全的 ,不是同步 的二 .数据增 长 :当需要 增长时 ,Vector 默认增 长为原 来一培, 而 ArrayList 却是原 来的一半就 HashMap 与HashTable 主要从 三方面来说 。 一. 历史原 因 :Hashtable 是基于 陈旧的 Dictionary 类的, HashMap 是Java 1.2引进的 Map 接口的 一 个实现 二 .同步性 :Hashtable 是线程 安全的, 也就是说 是同步的,而 HashMap是线程 序不安 全 的,不 是同步的三 .值:只有 HashMap 可以让 你将空值作 为一个表的 条目的 key 或value 28、char 型变量 中能不能存 贮一个中文 汉字 ?为什么 ? 答:是 能够定义成 为一个中文 的,因为 java 中以 unicode 编码, 一个 char 占16个字节 ,所以 放一个 中文是没问 题的 29、GC是什么 ??为什么 要有 GC 答: GC是垃圾 收集的意思 ( Gabage?Collection),内存处 理是编程人 员容易出现 问题的地方 , 忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃, Java 提供的 GC功能可以自 动监测 对象是否超 过作用域从 而达到自动 回收内存的 目的, Java 语言没 有提供释放 已分配内 存的显 示操作方法 。 30、float 型float f=3.4是否正 确 ? 答:不正确 。精度不准 确 ,应该用 强制类型转 换,如下所 示: float f=(float)3.4 32、抽象 类与接口? 答: 抽 象类与接口 都用于抽象 , 但是抽象 类 (JAVA中)可以有 自己的部分 实现, 而接口则 完 全 是一个标识 (同时有多重继 承的 功能 )。JAVA 类实现序例化 的方 法是实 现 java.io.Serializable 接口 Collection 框架中 实现比较要 实现 Comparable 接口和 Comparator 接口 33、STRING 与STRINGBUFFER 的区别 。 答:STRING 的长度 是不可变的 , STRINGBUFFER 的长度 是可变的。 如 果 你对字 符串中的 内 容经常进行操作,特别是内容要修改时,那么使用 StringBuffer,如果最后需要 String,那么 使用 StringBuffer 的toString()方法 34、谈谈 final, finally, finalize 的区别 答: final—修饰符( 关 键字 )如 果 一个 类被 声 明 为 final,意味着 它 不能 再派 生 出新 的子 类, 不能作 为父类被继 承。 因此一个类 不能既被声 明为 abstract 的, 又被声 明为 final 的。 将变 量 或方法 声明为 final, 可 以保 证它们在使 用中不被改 变。 被 声明为 final 的变量 必须在声明 时 给 定初值 , 而 在以 后的引用中 只能读取, 不 可修改 。 被 声明为 final 的方法 也同样只能 使用, 不 能重载 finally—再异常 处理时提供 finally 块来执 行任何清除 操作。 如 果 抛出一 个异常, 那 么 相匹配的 catch 子句就会执行,然后控制 就会进入 finally 块(如果有的话) finalize—方法 名。 Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的 清理工 作。这个方 法是由垃圾 收集器在确 定这个对象 没有被引用 时对这个对 象调用的。 它是 在Object 类中定 义的, 因 此 所有的类都 继承了它。 子 类 覆盖 finalize() 方法以 整理系统资 源 或者执 行其他清理 工作。 finalize() 方法是 在垃圾收集 器删除对象 之前对这个 对象调用的 35、面向 对象的特征 有哪些方面 ? 答:主要有以下四方面: 1.抽象:抽象就是忽略一个主 题中与当前 目标无关的 那些方面,以 便更充 分地注意与 当前目标有 关的方面。 抽象并不打 算了解全部 问题,而只 是选择其中 的一 部分,暂时不用部分细节。 抽象包括两 个方面,一 是过程抽象 ,二是数据 抽象。 2.继承:继 承是一 种联结类的 层次模型, 并 且 允许和 鼓励类的重 用, 它 提供了一 种明确表述 共性的方法 。 对象的一个新 类可 以从现 有的 类中派 生, 这个过 程称 为类继 承。 新类继 承了 原始类 的特 性, 新类称 为原始类的 派生类(子 类) , 而原 始类称为新 类的基类( 父类) 。 派 生类可以从 它的基 类那里继承方法和实例变 量,并且类可以修改或增加 新的方法使 之更适合特 殊的需要。 3.封 装:封 装是把过程 和数据包围 起来,对数 据的访问只 能通过已定 义的界面。 面向对象计 算始 于这个 基本概念, 即现实世界 可以被描绘 成一系列完 全自治、封 装的对象, 这些对象通 过一 个受保 护的接口访 问其他对象 。 4.?多态性 : 多态性是指 允许不同类 的对象对同 一消息作出 响 应。多 态性包括参 数化多态性 和包含多态 性。多态性 语言具有灵 活、抽象、 行为共享、 代码 共享的 优势,很好 的解决了应 用程序函数 同名问题。 36、String 是最基 本的数据类 型吗 答: 基 本数据 类型包括 byte、int、char、long、float、double、boolean 和short。java.lang.String 类是 final 类型的 , 因 此不 可以继承这 个类、 不 能 修改这 个类。 为 了 提高效 率节省空间 , 我 们 应该用 StringBuffer 类 37、int?和?Integer?有什么 区别 答: Java?提供两 种不同的类 型: 引用类 型和原始类 型 (或内置 类型) 。 Int 是java 的原始 数 据 类型, Integer 是java 为int 提供的封装类。 Java 为每个原始类型提供了封装类。原始类型封 装 类,booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble 引用类 型和原始类 型的行为完 全不同,并 且它们具有 不同的语义 。引用类型 和原始类型 具有 不同的 特征和用法 ,它们包括 :大小和速 度问题,这 种 类型以 哪种类型的 数据结构存 储,当 引用类 型和原始类 型用作某个 类的实例数 据时所指定 的缺省值。 对象引用实 例变量的缺 省值 为?null,而原 始类型实例 变量的缺省 值与它们的 类型有关 38、运行 时异常与一 般异常有何 异同 答:异 常表示程序 运行过程中 可能出现的 非正常状态 ,运行时异 常表示虚拟 机的通常操 作中 可能遇到的异常,是一种常见运行错误。 java 编译器要求方法必须声明抛出可能发生的非运 行时异 常,但是并 不要求必须 声明抛出未 被捕获的运 行时异常。 39、说出 ArrayList,Vector,?LinkedList 的存储 性能和特性 答: ArrayList 和Vector 都是使 用数组方式 存储数据, 此 数组元 素数大于实 际存储的数 据以 便 增加和 插入元素, 它们都允许 直接按序号 索引元素, 但是插入元 素要涉及数 组元素移动 等内 存操作,所以索引数据快而 插入数据慢 , Vector 由于使用了 synchronized 方法(线程安全), 通常性 能上较 ArrayList 差, 而 LinkedList 使用双 向链表实现 存储, 按 序号 索引数据需 要进 行 前向或 后向遍历, 但是插入数 据时只需要 记录本项的 前后项即可 ,所以插入 速度较快。 40、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 算法都 大概一样, 所 以性能不 会有很大的 差 异。 41、heap 和stack 有什么 区别 答:栈 是一种线形 集合,其添 加和删除元 素的操作应 在同一段完 成。栈按照 后进先出的 方式 进行处 理。堆是栈 的一个组成 元素 42、Java 的接口和 C++的虚类 的相同和不 同处 答: 由于 Java 不支持 多继承, 而 有 可能某个类 或对象要使 用分别在几 个类或对象 里面的方 法 或属性 ,现有的单 继承机制就 不能满足要 求。与继承 相比,接口 有更高的灵 活性,因为 接口 中没有任何实 现代 码。当 一个 类实现 了接 口以后 ,该 类要实 现接 口里面 所有 的方法 和属 性, 并且接口里面 的属 性在默 认状 态下面 都 是 public?static,所有方法默认 情况 下 是 public.一个类 可以实 现多个接口 。 43、Java 中的异 常处理机制 的简单原理 和应用 答:当 JAVA程序违 反了 JAVA的语义 规则时, JAVA虚拟机 就会将发生 的错误表示 为一个异 常。 违 反 语义规则包 括 2种情况 。 一 种是 JAVA类库内 置的语义检 查。 例 如数组下 标越界 ,会引 发IndexOutOfBoundsException;访问 null 的对象 时会引发 NullPointerException。另一种情况就 是JAVA允许程 序员扩展这 种语义检查 ,程序员可 以创建自己 的异常,并 自由选择在 何时用 throw 关键字 引发异常。 所有的异常 都是 java.lang.Thowable 的子类 。 43、垃圾 回收的优点 和原理。并 考虑 2种回收 机制 答: Java 语言中一个显著的特点就是引入了垃圾回收机制,使 c++程序员最头疼的内存管理 的问题 迎刃而解, 它 使得 Java 程序员 在编写程序 的时候不再 需要考虑内 存管理。 由 于 有个 垃 圾回收机制, Java 中的对象不再有 "作用域 "的概念,只有对象的引用才 有 "作用域 "。垃圾回 收可以 有效的防止 内存泄露, 有效的使用 可以使用的 内存。垃圾 回收器通常 是作为一个 单独 的低级 别的线程运 行,不可预 知的情况下 对内存堆中 已经死亡的 或者长时间 没有使用的 对象 进行清楚和回 收, 程序员 不能 实时的 调用 垃圾回 收器 对某个 对象 或所有 对象 进行垃 圾回 收。 回收机 制有分 代复制 垃圾回收和 标记垃圾回 收,增量垃 圾回收。 44、你所 知道的集合 类都有哪些 ?主要方法 ? 答:最常用的集合类是 ?List?和?Map。?List?的具体实现包括 ?ArrayList?和?Vector,它们是可 变大小 的列表, 比 较适合 构建、 存 储和操作 任何类型对 象的元素列 表。 ?List?适用于 按数值 索 引访问 元素的情形 。 ?Map?提供了 一个更通用 的元素存储 方法。 ?Map?集合类 用于存储元 素 对 (称作 "键"和"值") , 其 中每个键映 射到一个值 。 45、描述 一下 JVM 加载 class 文件的 原理机制 ? 答: JVM 中类的装载是由 ClassLoader 和它的子类来实现的 ,Java?ClassLoader?是一个重要的 Java 运行时 系统组件。 它负责在运 行时查找和 装入类文件 的类。 46、排序 都有哪几种 方法?请列 举 答: ??排序的 方法有: 插 入排 序 (直 接插入排序 、 希尔 排序) , 交 换排 序 (冒 泡排序、 快 速 排 序) , 选 择排序 (直接选择 排序、堆排 序) , 归并 排序,分配 排序(箱排 序、基数排 序)快速 排序的伪代码。 /?/使用快速排序方法 对 a[?0?:n-?1?]排序从 a[?0?:n-?1?]中选择一个元素作 为 m?i?d?d?l?e,该元 素为支点把 余下的元素 分割为两段 left?和r?i?g?h?t,使得 l?e?f?t 中的元 素 都小于 等于支点, 而 right?中的元 素都大于等 于支点递归 地使用快速 排序方法对 left?进行排 序 递归地 使用快速排 序方法对 right?进行排 序所得结果为 l?e?f?t?+?m?i?d?d?l?e?+?r?i?g?h?t 47、JAVA语言如 何进行异常 处理, 关 键字 : throws,throw,try,catch,finally 分别代 表什么意义 ? 在try 块中可 以抛出异常 吗? 答: Java 通过面 向对象的方 法进行异常 处理,把各 种不同的异 常进行分类 ,并提供了 良好的 接口。在 Java 中,每 个异常都是 一个对象, 它是 Throwable 类或其 它子类的实 例。当一个 方 法出现 异常后便抛 出一个异常 对象,该对 象中包含有 异常信息, 调用这个对 象的方法可 以捕 获到这 个异常并进 行处理。 Java 的异常 处理是通过 5个关键 词来实现的 : try、catch、throw、 throws 和finally。 一 般情 况下是用 try 来执行 一段程序, 如 果 出现异 常, 系 统会抛 出 ( throws) 一个异常,这时候你可以通 过它的类型 来捕捉( catch)它,或最后( finally)由缺省处理器 来处理。 用 try 来指定一 块 预防 所有 "异常 "的程序。 紧 跟 在 try 程序后面 , 应包 含一 个 catch 子句来 指定你想要 捕捉的 "异常 "的类型 。 throw 语句用 来明确地抛 出一个 "异常 "。throws 用来 标明一个成员函数可能抛出 的各种 "异常 "。Finally 为确保一段代码不管发生什 么 "异常 "都被 执行一 段代码。 可 以 在一个 成员函数调 用的外面写 一个 try 语句, 在 这个成员 函数内部写 另 一 个try 语句保 护其他代码 。每当遇到 一个 try 语句, "异常 "的框架 就放到堆栈 上面,直到 所有 的try 语句 都完成 。如果下一 级的 try 语句没 有对某种 "异常 "进行处 理,堆栈就 会展开,直 到 遇到有 处理这种 "异常 "的try 语句。 48、一个 ".java"源文件 中是否可以 包括多个类 (不是内部 类)?有什 么限制? 答:可 以。必须只 有一个类名 与文件名相 同。 49、java 中有几 种类型的流 ? JDK 为每种 类型的流提 供了一些抽 象类以供继 承,请说出 他们 分别是 哪些类? 答:字节流,字符流。字节流继承于InputStream?OutputStream,字符流继承于InputStreamReader ?OutputStreamWriter。在 java.io 包中还 有许多其他 的流,主要 是为了提高 性能和使用 方便。 50、java 中会存 在内存泄漏 吗,请简单 描述。 答:会 。自己实现 堆载的数据 结构时有可 能会出现内 存泄露,可 参看 effective java. 51、java 中实现 多态的机制 是什么? 答: 方 法 的 重 写 Overriding 和重 载 Overloading 是Java 多态 性的不同表现。重写Overriding 是父类 与子类之间 多态性的一 种表现,重载 Overloading 是一个 类中多态性 的一种表现 。 52、垃圾 回收器的基 本原理是什 么?垃圾回 收器可以马 上回收内存 吗?有什么 办法主动通 知 虚拟机 进行垃圾回 收 答: 对于 GC来说, 当 程序员 创建对象时 , GC就开始 监控这个对 象的地址、 大 小以及使 用 情 况。 通常, GC采用有 向图的方式 记录和管理 堆 (heap)中的所 有对象。 通过这 种方式确定 哪 些 对象是 "可达的 ",哪些 对象是 "不可达 的 "。当 GC确定一 些对象为 "不可达 "时, GC就有责 任 回收这 些内存空间 。 可以。 程序员 可以手动执行 System.gc(), 通知 GC运行, 但是 Java 语言 规范并 不保证 GC一定会 执行。 53、静态 变量和实例 变量的区别 ? 答: static?i?=?10;?//常量 ???class?A?a;??a.i?=10;//可变 54、什么是 java 序列化 ,如何实现 java 序列化 ? 答:序 列化就是一 种用来处理 对象流的机 制,所谓对 象流也就是 将对象的内 容进行流化 。可 以对流 化后的对象 进行读写操 作,也可将 流化后的对 象传输于网 络之间。序 列化是为了 解决 在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现 Serializable 接口, 该接口没有 需要实现的 方法, implements?Serializable 只是为 了标注该对 象 是可被序列化的,然后使用一个输出流(如:FileOutputStream) 来构造一个 ObjectOutputStream( 对象流)对象,接着,使用ObjectOutputStream 对象的 writeObject(Object?obj)方法就 可以将参数为 obj 的对象 写出 (即保存 其状态 ), 要 恢 复的话则 用 输入流 。 55、是否 可以从一个 static 方法内 部发出对非 static 方法的 调用? 答:不 可以 ,如果其 中包含对象的 method();不能 保证对象初 始化 . 56、写 clone()方法时 ,通常都有 一行代码, 是什么? 答: Clone?有缺省 行为, super.clone();他负责 产生正确大 小的空间, 并逐位复制 。 57、在 JAVA中,如 何跳出当前 的多重嵌套 循环? 答:用 break;?return?方法。 58、List、Map、Set 三个接 口,存取元 素时,各有 什么特点? 答: List?以特定 次序来持有 元素, 可有 重复元素。 Set?无法拥 有重复元素 ,内部排 序。 Map?保 存key-value 值, value 可多值 。 59、说出 一些常用的 类,包,接 口,请各举 5个 答:常用 的 类: BufferedReader??BufferedWriter??FileReader??FileWirter??String??Integer 常用 的包:java.lang??java.awt??java.io??java.util??java.sql 常用的接口: Remote??List??Map??Document??NodeList ---------------------------------------------------------------------------------------------- 线程编 程方面 ?? 60、java 中有几 种方法可以 实现一个线 程?用什么 关键字修饰 同步方法 ??stop()和suspend()方 法为何 不推荐使用 ? 答: 有 两种 实现方法, 分 别 是继承 Thread 类与实现 Runnable 接口用 synchronized 关键字 修 饰 同步方 法反对使用 stop(), 是 因 为它不 安全。 它 会 解除由 线程获取的 所有锁定, 而 且如 果对 象 处于一 种不连贯状 态,那么其 他线程能在 那种状态下 检查和修改 它们。结果 很难检查出 真正 的问题 所在。 suspend()方法容 易发生死锁 。调用 suspend()的时候 ,目标线程 会停下来, 但却 仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被 "挂起 " 的线程 恢复运行。 对任何线程 来说,如果 它们想恢复 目标线程, 同时又试图 使用任何一 个锁 定的资 源, 就 会造成 死锁。 所 以不 应该使用 suspend(), 而 应在自己的 Thread 类中置 入一个 标 志,指 出线程应该 活动还是挂 起。若标志 指出线程应 该挂起,便用 wait()命其进入等待状态。 若标志 指出线程应 当恢复,则 用一个 notify()重新启 动线程。 61、sleep()?和?wait()?有什么 区别 ?? 答: sleep 是线程 类( Thread)的方 法,导致此 线程暂停执 行指定时间 ,给执行机 会给其他线 程, 但 是监控 状态依然保 持, 到 时 后会自 动恢复。 调用 sleep 不会释 放对象锁。 wait 是Object 类的方法,对此对象调 用 wait 方法导致本线程放弃对象锁 ,进入等待 此对象的等 待锁定池, 只有针对此对象发 出 notify 方法(或 notifyAll)后本线程才进入对象锁定 池准备获得 对象锁 进入运 行状态。 62、同步 和异步有何 异同,在什 么情况下分 别使用他们 ?举例说明 。 答:如 果数据将在 线程间共享 。例如正在 写的数据以 后可能被另 一个线程读 到,或者正 在读 的数据 可能已经被 另一个线程 写过了,那 么这些数据 就是共享数 据,必须进 行同步存取 。当 应用程 序在对象上 调用了一个 需要花费很 长时间来执 行的方法, 并且不希望 让程序等待 方法 的返回 时,就应该 使用异步编 程,在很多 情况下采用 异步途径往 往更有效率 。 63、启动 一个线程是用 run()还是 start()? 答: 启 动一个线 程是调用 start()方法, 使 线程所 代表的虚拟 处理机处于 可运行状态 , 这 意味 着 它可以由 JVM 调度并 执行。 这 并不 意味着线程 就会立即运 行。 run()方法可 以产生必须 退出 的 标志来 停止一个线 程。 ? 64、当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其 它方法 ? 答:不 能,一个对 象的一个 synchronized 方法只 能由一个线 程访问。 65、请说 出你所知道 的线程同步 的方法。 答:wait():使一个 线程处于等 待状态, 并 且释放所 持有的对象的 lock。sleep():使一个 正在运 行 的线程 处于睡眠状 态, 是 一 个静态 方法, 调 用此方法 要捕捉 InterruptedException 异常。notify(): 唤醒一 个处于等待 状态的线程 ,注意的是 在调用此方 法的时候, 并不能确切 的唤醒某一 个等 待状态 的线程,而 是由 JVM 确定唤 醒哪个线程 ,而且不是 按优先级。 Allnotity():唤醒所 有处 入等待 状态的线程 ,注意并不 是给所有唤 醒线程一个 对象的锁, 而是让它们 竞争。 66、多线 程有几种实 现方法 ,都是什 么 ?同步有 几种实现方 法 ,都是什 么 ?? 答:多 线程有两种 实现方法, 分别是继承 Thread 类与实现 Runnable 接口 ?同步的 实现方面有 两种, 分 别是 synchronized,wait 与notify67、 线 程的基本 概念、 线 程 的基本状态 以及状态之 间 的关系 答:线程指 在程序执行 过程中,能 够执行程序 代码的一个 执行单位, 每个程序至 少都 有一个 线程,也就 是程序本身 。 Java 中的线 程有四种状 态分别是: 运行、就绪 、挂起、结 束 68、简述 synchronized 和java.util.concurrent.locks.Lock 的异同 ?? 答:主要相同点:Lock 能完成synchronized 所实现的所有功能主要不同点:Lock 有比 synchronized 更精确的线程 语义 和更好 的性 能。 synchronized 会自动释放锁 , 而 Lock 一定要 求程序 员手工释放 ,并且必须在 finally 从句中 释放。 ---------------------------------------------------------------------------------------------- Jsp 方面 69、forward?和redirect 的区别 答: forward 是服务 器请求资源 ,服务器 直接访问目 标地址的 URL,把 那个 URL 的响应 内 容 读取过 来,然后把 这些内容再 发给浏览器 ,浏览器根 本不知道服 务器发送的 内容是从哪 儿来 的,所以它的 地址 栏中还 是原 来的地 址。 ????redirect 就是服务端根 据逻 辑 ,发送一个状态 码 , 告诉浏 览器重新去 请求那个地 址,一般来 说浏览器会 用刚才请求 的所有参数 重新请求, 所以 session,request 参数都 可以获取。 70、jsp 有哪些 内置对象 ?作用分 别是什么 ? 答: JSP 共有以 下 9种基本 内置组件 ( 可与 ASP 的6种内部组件相对应):request 用户端 请 求,此请求会包含来自GET/POST 请求的参数?? response 网页传回用户端的回应?? pageContext 网页的属 性 是在 这里 管 理 ?? session 与请求有 关 的会 话期 ?? application servlet 正在执行的内容 ?? out 用来传送回应的输出 ?? config servlet 的构架部件 ?? page JSP 网页本 身?? exception 针对错 误网页,未 捕捉的例 外 71、jsp 有哪些 动作 ?作用分 别是什么 ? 答:JSP 共有以 下 6种基本 动作 ?? jsp:include:在页 面被请求的 时候引入一 个文件。 ?? jsp:useBean:寻找 或者实例化 一个 JavaBean。?? jsp:setProperty:设置 JavaBean 的属性 。 ?? jsp:getProperty:输出 某个 JavaBean 的属性 。 ?? jsp:forward:把请 求转到一个 新的页面。 ?? jsp:plugin:根据 浏览器类型为 Java 插件生成 OBJECT 或EMBED 标记 72、JSP 中动态 INCLUDE 与静态 INCLUDE 的区别 ? 答: 动 态 INCLUDE 用jsp:include 动作 实 现 ?? 它总是 会检查所含 文件中的变 化,适合用 于包含动态 页面,并且 可以带参数 ?? 静态 INCLUDE 用include 伪码实 现 ,定不会 检查所含文 件的变化, 适 用于包含 静态页面 ?? <%@ include file="included.htm" %> 73、两种 跳转方式分 别是什么 ?有什么 区别 ? 答:有两种,分别为:? ? 前者页 面不会转向 include 所指的 页面,只是 显示该页的 结果,主页 面还是原 来的页 面。 执行 完后还会回 来, 相当 于函数调用 。 并且可 以带参数 .后者完 全转向新页 面, 不 会再回 来。相当于 go to 语句。 74、JSP 的内置 对象及方法 。 答: request 表示 HttpServletRequest 对象。 它 包 含了有 关浏览器请 求的信息, 并 且提 供了几 个 用于获取 cookie,?header,?和session 数据的 有用的方法 。 ????? response 表示 HttpServletResponse 对象, 并 提 供了几 个用于设置 送回 ?浏览器的响应的方法(如 cookies,头信息 等) ????? out 对象是 javax.jsp.JspWriter 的一个实例, 并提 供了几 个方 法使你 能用 于向浏 览器 回送输出 结果。 ????? pageContext 表示一 个 javax.servlet.jsp.PageContext 对象。它 是 用于 方便 存 取各 种范 围 的名字 空间、 servlet 相关的 对象的 API,并且 包装了通用的 servlet 相关功 能的方法。 ????? session 表示 一 个 请 求 的 javax.servlet.http.HttpSession 对象 。 Session 可以 存 贮 用 户 的 状 态 信 息????? applicaton?表示一个 javax.servle.ServletContext 对象。 这 有助于 查找有关 servlet 引擎和 servlet 环境的 信息 ????? config 表示一个javax.servlet.ServletConfig 对象。该对象用于存取servlet 实例的初始化参 数。 ????? page 表示从 该页面产生 的一个 servlet 实例 ---------------------------------------------------------------------------