- 2021-05-17 发布 |
- 37.5 KB |
- 188页
申明敬告: 本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
文档介绍
写在前面的话
Java高级软件工程师面试题 Java 高级软件工程师 班 级:_______________________ 姓名:_______________________ 联系电话:_______________________ 第 187 页 共 188 页 Java高级软件工程师面试题 写在前面的话 从我们翻开厚厚面试题学习开始,预示着我们离开学校的脚本越来越近了,就业压力越来越大了。偶尔会在脑海中勾画、想像我们以后工作的情景了,而步入社会参与竞争的第一步就是从学习如何面试!如何找工作开始。面试包括人事交流沟通与技术问答等相关环节,在这本面试题书中包含了这两部分内容,第一部分主要讲人事问题的一些常见问题,第二部分讲技术问答。在技术面试问答题中无法将所有公司可能问到的所有问题都一一收录进去;也无法对每个问题,每个知识做深入精细的分析讲解,因为这是一个没有结点的工作,所以除了学习这本书上的面试问答的知识外与课程相关的知识我们也要去学习。 在学校期间我们在学习老师教授给我们的专业知识的同时还有些知识是无法在学校的课堂中吸取到的,如:缓存cache、事务与并发、海量数据、Lucene、NoSQL、Hadoop、系统日志、单点登录、UI框架、项目管理与集成、设计模式、移动互联网开发、各公司自有开发框架等等,还有很多很多,因为软件开发行业所包含的技术包罗万象。我们虽然了目前软件行业的主流技术,但也有一些企业,因架构师或项目经理的技术特点,会选择一些我们未接触或未听说过的的技术架构,那么作为即将步入软件工程师行业的我们,必须要有重新学习新技术的心态和作好准备学习新技术的准备。同样,在以后的工作过程中也会遇到一些我们之前未接触过的技术或未遇到的项目Bug,这些都在要求我们在今后的工作和学习中还需要不断的学习,另外还要持有一颗:生命不息,学习不止的心。只有这样,我们才能成为软件行业与时俱进的技术人才。 最后也希望每位IT学子,通过面试题能够获得更多的收获,学有所成。也预祝每们学子能找到自己满意的工作。 第 187 页 共 188 页 Java高级软件工程师面试题 一、 简历制作与面试技巧 Ø 简历相关 1) 简历要求 简历主要是用人单位用来认识你、了解你的一种方式或一种参考,这点很重要。因为用人单位和你都不太了解对方,无论对你或者用人单位而言都是第一次打交道,在刚开始接触中。对你而言简历是你想要展现你的过去的一种形式。另外简历是我们在求职过程中与用人单位打交道的第一环节,这个环节过关了,才有可能进入下一环节。所以我们要认真的准备我们的简历,把我们优秀的过去通过简历来展现给面试官;让面试官通过简历来认识、了解你过去的经历。 2) 简历内容 包括个人基本信息、专业技能、工作经历、项目经验、所获证书、个人评价等内容。这些内容决定了你是否符合招聘岗位要求。 基本信息:面试官通过这部分来了解你是男,还是女,年龄、工作经验、应聘岗位、最高学历,看看这些方面是否符合他的招聘要求。 专业技术:面试官通过专业技术主要了解你对各种专业技能的掌握和使用情况,对比你所具有的这些技能是否符合他所招聘的岗位技能。 工作经历:面试官主要来了解你之前是否有工作的经验的人,还是应届生等等。 项目经验:面试官主要看看你是否有从事过相关工作的实际开发经验。 所获证书:看看是何种证书,证书的含金量怎么样。 人个评价:看看你的综合素质、个人性格等方面 3) 简历示例 u 基本信息 个人信息 姓 名: XXXX 性 别: XX 年 龄: 22 现 居 地: XX市XX区 毕业院校: 湖北大学 工作经验: 2年 专 业 计算机科学与技术 学 历: 本科 联系电话: XXXX 应聘职位: JAVA软件工程师 电子邮件: XXXX u 专业技能 专业技能 l 熟悉C、C#、Java等程序设计语言。 l 熟练掌握HTML、XML、CSS层叠样式、Javascript等前端脚本语言 l 熟练使用Struts1、Struts2、Spring3、Hibernate3、MyBatis、JQuery等主流开源框架进行应用开发。 l 熟练使用Oracle,SQLServer,MySQL关系型数据库。 l 熟练使用Tomcat,Weblogic,JBoss,Apache HTTP Server等服务器。 l 熟练使用MyEclipse,Dreamweaver,PL/SQL,PowerDesiger等开发工具。 l 熟悉JBPM工作流引擎原理 第 187 页 共 188 页 Java高级软件工程师面试题 u 工作经历 工作经验 工作时间 单位 职位 2010.3—2012.12 武汉智诚信息科技有限公司 Java工程师 2009.5--2010.1 中地数码武汉分公司 Java工程师 u 项目经验 项目经验 1 ²2010年4月--2010年10月: l 项目名称: 湖北黄冈市房地产税收一体化系统 l 开发框架: Struts2.0+Hibernate3.0+Spring2.0+Jquery+Xfire l 开发环境: jdk、tomcat、eclipse l 数据库: Oracle10 l 项目背景:为了实现客户方无纸化办公,提高办事效率,以及实现对下属各税务分局进行统一的税收管理,该管理系统包括:税源信息管理、纳税评估、行政执法、综合查询、系统设置、信息变更、电子档案、保有环节、信息比对、零散契税10个大模块。 l 责任描述: (1)首页电子地图显示:主要基于电子地图框架MapEasy进行二次开发,在原型功能上实现地物标注、等级缩放、瓦片移动、地图切换等功能。二次开发后通过地理位置显示各税务局所属片区土地交易信息、在建项目工程信息、并按坐标进行标注显示、查看、预览效果图,实现更方便、快捷、直观的操作和显示功能。 (2)各行政区税费统计:主要根据不同地税分局统计出欠税纳税人数、欠税总金额、应缴总金额、已缴总金额等,并以图形方式显示数据。 (2)系统设置:主要包括用户管理、权限设置、个人纳税人管理、单位纳税人信息管理、土地管理、税率设置、地图管理、基础数据管理。 Ø 面试环节 1) 面试准备 1、 了解清楚岗位需求与岗位职责。 2、 检查简历描述是否与所应聘的岗位需求一致。 3、 了解用人单位的一些基本信息,如:从事什么行业的,公司产品、岗位要求 4、 准备好用人单位所需的一切证件,以免白跑一趟。 2) 面试过程 1、 普通话标准。 2、 表现要自信、大方。 3、 沟通交流过程中表情自然、得当。 4、 着装要让人感觉很正自然、看着很舒服。 5、 交流过程中懂得谦让和尊重面试官 3) 面试自我介绍 1、 介绍个人基本信息,包括毕业院校。 2、 介绍之前的工作经历,包括岗位名称 3、 介绍之前参与的项目,包括客户方名称、技术架构 第 187 页 共 188 页 Java高级软件工程师面试题 1) 面试注意事项 内容过多,附网址:http://job.group.iteye.com/group/wiki/?category_id=13 上面的版块叫《求职宝典》,是iteye(专业Java技术站点)上主要针对IT行业求职过程分析和求职问题注意事项,包括如何写简历、如何跟IT经理面谈等内容。作为一个即将步入IT行业的初级程序员来说里面的内容不可错过。 一、 职场相关 人在求职或学习生活过程中,很多知识和信息是通过环境给我们传达的,下面我们随着这些问题来学习一下工作环境中的学问,请回答以下题目: Ø 学习教育、培训相关 1、 你们学校是属于几本? 2、 你的学历是全日制,还是非全日制? 3、 你为什么选择你所学的专业?有什么原因? 4、 你能列举一下:大一、大二、大三、大四分别学了哪些课程?你比较喜欢哪门课程?为什么喜欢? 5、 你毕业的毕业论文是什么题目?主要内容是什么?花了多长时间?是否有答辨,你的导师是怎么评论你的论文的? 6、 你毕业时修了多少学分?毕业时取得了哪些证书?是否有学位证? 7、 你的英语过了几级?英语的成绩是多少? 8、 说说你的大学生活?让你印象最深的是什么? 9、 你们学校有几个校区?每个校区有什么特点?你在哪个校区?附近有什么标志性的建筑?怎么到你们学校? 10、 你目前的档案在哪里?可以转到我们公司吗? Ø 职场相关 1、 你们公司在XX(市)的什么地方?公司有多少人?有多少个部门? 2、 你们公司的网址是什么?联系电话是多少? 3、 你们公司的大致的组织机构是怎么构成的?你属于哪个部门,你们部门在职责的是什么?你在公司的职位?是的直接汇报对象哪个职位? 第 187 页 共 188 页 Java高级软件工程师面试题 1、 你们公司主要面向哪些行业的?有哪些客户,列举一下?主要有做过哪些系统? 2、 你的项目经理叫什么名字,能介绍一下你对他的了解和看法吗? 3、 你在公司参与过哪些项目?你们公司跟哪些其它的公司有过合过? 4、 为什么离职?你有离职证明吗? 5、 你在公司做项目时,遇到困难怎么克服的?举例说明。 6、 你对加班怎么看? 7、 你和同事之间的关系怎么样?你怎么看待同事间相处关系? 8、 你所工作的城市有什么特色?城市有什么特产可以向我们介绍的?有什么好玩的景点可以推荐一下吗? 9、 平时下班后做些什么?周末在家主要做什么? 10、 你的项目代码可以拿来我们看看吗? 11、 谈谈你对工资的要求? 12、 你以前的工资构成? 13、 你的工资扣税吗?是怎么扣的? 14、 你原来有保险吗?保险号是多少?你原来的公司还有什么福利? 15、 你来来的工作是向谁汇报,一般会汇报一些什么内容? 16、 你平时一般会访问哪些技术网站? 第 187 页 共 188 页 Java高级软件工程师面试题 一、 技术面试题 (一) Java部分 1、 列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;java.util;java.io;java.sql;java.awt;java.net;javax.swing 2、 JDK中哪些类是不能继承的?【信雅达面试题】 【参考答案】 不能继承的是类是那些用final关键字修饰的类。一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是final的。 3、 String是最基本的数据类型吗? 【天能智健面试题】 【参考答案】 基本数据类型包括byte、int、char、long、float、double、boolean和short。 所以String不属于基本数据类型范畴内,但String属于最常见一种引用类型。 4、 short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 【博炎科技面试题】 【参考答案】 对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器会提示错误,需要强制转换类型。 对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,Java编译器会对它进行特殊处理,因此可以正确编译。 【分析】 主要考查几种基本数据类型在运算时的,由低到高会自动转换,而由高到低时会强制转换。 5、 Java 对象初始化顺序?【腾鹏科技面试题】 【参考答案】 分为两种,一种是本类的初始化,一种是含有父类的初始化顺序。这里分开来说, 本类的初始化顺序是:静态变量、静态初始化块、变量、初始化块、构造函数 继承类的初始化顺序是:父类静态变量、父类静态初始化块、子类静态变量、子类静态初始块、父类变量、父类初始化块、父类构造函数、子类变量、子类初始化块、子类构造函数。 【分析】 static{ System.out.println("静态块"); } { System.out.println("初始化模块"); } public ClassName() { System.out.println("构造方法"); } 第 187 页 共 188 页 Java高级软件工程师面试题 说明: 原则上回答全面的话,应该是完整的说出带有继承的这种类的初始化过程,下面有个步骤可以参考: 1. 装载程序的时候首先找到的是它的基(父)类,如果有多层基(父)类则会一级一级的往上找最后找到根基(父)类。 2.执行根基础(父)类中的static初始化,再执行下一个衍生类中的static,依此类推,一直保持这个顺序。 3.此时类已经装载完毕,开始创建对象,所有的基本数据类型都会设成它们的默认值,对象句柄设为null 4.调用基础(父)类的构造方法,基础(父)类的构建采用与衍生类构造方法完全相同的处理过程。 5.构造方法初始完之后,进行变量的初始化。 6.执行构造方法中剩余的部分。 1、 写几个线程安全类,不安全的,支持排序的类名?【软通动力面试题】 【参考答案】 Ø 线程安全类:Vector 、Hashtable、Stack。 Ø 线程不安全的类:ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap等。 Ø 支持排序的类有HashSet、LinkedHashSet、TreeSet等(Set接口下的实现都支持排序) 【分析】 此题主要考查集合框架的知识。在集合框架中Collection接口为集合的根类型,提供集合操作的常用API方法,该接口下派生出两个子接口,一个是不支持排序的List接口,一个是有自身排序的Set接口,所以回答排序与不排序分别从两接口的实现中在作答。线程安全上来说,Vector类比同属于List接口的ArrayList要早,是一个线程安全的类,在JDK1.2以后才推出一个异步的ArrayList类,比Vector类效率高。同理Stack继承自Vector也线程安全的类,另外在在Map接口的实现在Hashtable也是个线程安全的类。 2、 哪几个方法可以实现一个线程?【上海华信面试题】 【参考答案】 一是继承Thread ,重写 Thread 类的方法 run方法;另种是实现 runnable 接口并实现 run方法。 【分析】 考查线程的基本实现,很多公司喜欢考查这方面知识,另外补充一下关于线程的run方法,在多线程API中启动一个线程是调用start()方法,线程进入就绪状态。 3、 STOP()和SUSPEND()不推荐使用的原因? 【参考答案】 stop()是因为它不安全。它会解除由线程获取的所有锁定,当在一个线程对象上调用stop()方法时,这个线程对象所运行的线程就会立即停止,假如一个线程正在执行:synchronized void { x = 3; y = 4;} 由于方法是同步的,多个线程访问时总能保证x,y被同时赋值,而如果一个线程正在执行到x = 3;时,被调用了 第 187 页 共 188 页 Java高级软件工程师面试题 stop()方法,即使在同步块中,它也干脆地stop了,这样就产生了不完整的残废数据。而多线程编程中最最基础的条件要保证数据的完整性,所以请忘记线程的stop方法,以后我们再也不要说“停止线程”了。而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。 suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就 会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用 wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。 【分析】 1、 "=="和equals方法有什么区别?【中科软】 【参考答案】 ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。 如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。 equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码: String a=new String("foo"); String b=new String("foo"); 两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。 在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下: boolean equals(Object o){ return this==o; } 这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。 2、 静态变量和实例变量的区别? 【参考答案】 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。 第 187 页 共 188 页 Java高级软件工程师面试题 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。 例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。 public class VariantTest { public static int staticVar = 0; public int instanceVar = 0; public VariantTest() { staticVar++; instanceVar++; System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar); } } 备注:这个解答除了说清楚两者的区别外,最后还用一个具体的应用例子来说明两者的差异,体现了自己有很好的解说问题和设计案例的能力,思维敏捷,超过一般程序员,有写作能力! 1、 构造器的名能不能和类的名字相同? 【参考答案】 构造器的名称必须与类名相同。 【分析】 构造器或构造函数(有些书这样叫)主要用来对类的成员变量进行初始化,当类创建实例时调用。 2、 在一个主方法类可不可以调用一个非静态的方法? 【参考答案】 可以调用。因为Java的主方法(main)方法本身也是static类型方法,一个static类型方法,发起对另一个static方法的调用没有问题。 【分析】 静态方法可以调用其它的静态方法,但是不能调用非静态方法,这个好比Java中的类变量与实例变量的关系。类变量是被所有类成员共享,而实例变量只被该实例共享, 3、 一个类中可不可以有2个公共的方法? 【参考答案】 可以。Java中对公共方法的个数没有约束,但是对公共的类有约束,一个Java源文件中只能定义一个public类型的类。 第 187 页 共 188 页 Java高级软件工程师面试题 1、 GC是什么,为什么要使用它?【阿斯拓】 【参考答案】 GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域,从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。 【分析】 2、 说一下垃圾回收的原理,可以直接从内存中回收吗? 【参考答案】 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收,因为Java语言规范并不保证GC一定会执行。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 【分析】 3、 Java的异常有哪几种,有什么区别? 【参考答案】 两大类,一般异常和运行时异常。一般异常,这些异常是在定义方法时声明抛出的,这些异常必需用try catch抛出,或throws处理,如果不处理,程序将编译失败。比如:IOException、FileNotFoundException、SQLException等。 运行时异常是程序运行时可能报出的异常。可以用try catch抓取,也可以不做任何处理。例如:NullPointerException 异常就是一种比较常见的运行时异常。 【分析】 4、 switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 【参考答案】 在switch(表达式)中,括号表达式只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。 5、 Integer与int的区别? 【参考答案】 int是java提供的8种原始数据类型之一,另外Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。 6、 Java Reflection是什么?【】 第 187 页 共 188 页 Java高级软件工程师面试题 【参考答案】 JAVA反射,Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性。 【分析】 1、 写几个java.lang.Object类中的方法名称。 【参考答案】 主要有equals()、toString()、getClass()、hashCode()、clone()、 notify()、wait()、notify()方法。 【分析】 这种题能记多少个就说多少个,不一定要求你所有的都记住,但是要理解其中部分重要方法的含义和作用。 2、 &和&&的区别? 【参考答案】 &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。 &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。 &还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位。 【分析】 先说分别说两者的作用,再说出&&和&各自的不同之处。 3、 数组有没有length()这个方法,String有没有length()这个方法。 【参考答案】 数组没有length()方法,但有length属性 String有length()方法。 【分析】 考查平时使用数组和字符串的一些细节,一般在使用 4、 String s=new String(“xyz”)创建了几个对象 【参考答案】 2个string对象,一个是=null的s,一个是=“xyz”的string 两个或一个”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。 【分析】 5、 能不能自己写个类,也叫java.lang.String? 第 187 页 共 188 页 Java高级软件工程师面试题 可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载jre.jar包中的那个java.lang.String。由于在tomcat的web应用程序中,都是由webapp自己的类加载器先自己加载WEB-INF/classess目录中的类,然后才委托上级的类加载器加载,如果我们在tomcat的web应用程序中写一个java.lang.String,这时候Servlet程序加载的就是我们自己写的java.lang.String,但是这么干就会出很多潜在的问题,原来所有用了java.lang.String类的都将出现问题。 虽然java提供了endorsed技术,可以覆盖jdk中的某些类,具体做法是….。但是,能够被覆盖的类是有限制范围,反正不包括java.lang这样的包中的类。 例如,运行下面的程序: package java.lang; public class String { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("string"); } } 报告的错误如下: java.lang.NoSuchMethodError: main Exception in thread "main" 这是因为加载了jre自带的java.lang.String,而该类中没有main方法。 1、 你对面向对象思想的理解? 【参考答案】 面向对象编程(Object-Oriented Programming)简称OOP技术,是开发计算机应用程序的一种新方法、新思想。过去的面向过程编程中常常会导致所有的代码都包含在几个模块中,使程序难以阅读和维护,在做一些修改时常常牵一动百,使以后的开发和维护难以为继。而使用OOP技术,使用许多代码模块,每个模块都只提供特定的功能,它们是彼此独立的,可以增加代码重用的几率,更加有利于软件的开发、维护和升级。另外OOP的三大核心特性:继承、封装、多态的特性,使得在面对象编上能够设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低,所以这一编程思想是目前一种应用最为普遍的软件设计思想。 【分析】 2、 最常见的runtime exception运行时异常? 【参考答案】 ClassCastException(类型转换异常)、NumberFormatException(格式化异常)、 ArrayIndexOutOfBoundsException(数组越界异常)、ArithmeticException(算术异常)、 NullPointerException(空指针异常)等等 【分析】 这道题主要考查大家平时在项目开发过程中经常遇到的一些异常类型信息,通过这些异常来考查大家的项目经验与项目排错能力。 3、 用JDBC来实现访问数据库记录可以采用下面的几个步骤: 第 187 页 共 188 页 Java高级软件工程师面试题 【参考答案】 1、 通过驱动器管理器获取连接接口(Connection)。 2、 获得Statement或它的子类。 3、 指定Statement中的参数。 4、 通过Statement发送SQL语句。 5、 检查并处理返回的结果。 6、 关闭Statement。 7、 关闭连接接 【分析】 1、 Error和 exception的区别与联系? 【参考答案】 error 表示恢复不是不可能,但很困难的情况下的一种严重问题。比如说内存溢,网络故障等,不可能指望程序能处理的一类错误。 Exception 表示一种由程序设计或实现问题,像我们常说的异常处理,就是属于这类,一般程序可以捕获和处理这些异常。 【分析】 这道题的难点在Error很多时候由于我们无法重现这种Error导致很多同学甚至不知道Error到底是什么,所以很容易把题目中的两种错误划上等号。 2、 String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有? 【参考答案】 没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。 通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为 String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。 同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做: public class Demo { private String s; ... public Demo { s = "Initial 第 187 页 共 188 页 Java高级软件工程师面试题 Value"; } ... } 而非 s = new String("Initial Value"); 后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。 上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。 至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即 StringBuffer。 1、 Jdk1.5的新特性? 【参考答案】 JDK1.5的一个重要主题就是通过新增一些特性来简化开发,这些特性主要包括:泛型、ForEach循环、自动装包/拆包、枚举、可变参数、静态导入这些。 【分析】 2、 面向对象的特征有哪些方面? 【参考答案】 面向对象的编程语言有封装、继承 、多态等3个主要的特征。 u 封装 封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。 u 继承 在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。 u 多态 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。 3、 JVM工作原理? 运行jvm 字符码的工作是由解释器来完成的。解释执行过程分三步进行: 第 187 页 共 188 页 Java高级软件工程师面试题 代码的装入、代码的校验、和代码的执行。 装入代码的工作由“类装载器class loader”完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被调用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其他类。在本台计算机的所有类都在同一地址空间中,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用与特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内布局,java很好地解决了由超类改变而使子类 崩溃的问题,同时也防止了代码的非法访问。随后,被装入的代码由字节码校验器进行检查。校验器可以发现操作数栈益处、非法数据类型转化等多种错误。通过校验后,代码便开始执行了。 Java字节码的执行有两种方式: 1)即时编译方式:解释器先将字节编译成机器码,然后再执行该机器码。 2)解释执行方式:解释器通过每次解释并执行一小段代码来完成java字节。 码程序的所有操作。 1、 说说Java中的内存分配? Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作它用。 堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。 引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因。但是在写程序的时候,可以人为的控制。 2、 final, finally, finalize的区别。 【参考答案】 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码…… finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用 3、 Extends和Implement的不同? 【参考答案】 第 187 页 共 188 页 Java高级软件工程师面试题 extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了 比如 class A extends B implements C,D,E 1、 抽象类是否可以没有抽象方法?为什么? 【参考答案】 可以在java中用abstract关键字来修饰一个类时,这个类叫做抽象类。 抽象类中不一定要包含abstract方法,但一个类中包含了abstract方法,则这个类必须声明为abstract类。 2、 静态的多态和动态的多态的区别? 【参考答案】 静态的多态: 即为重载 ;方法名相同,参数个数或类型不相同。(overloading) 动态的多态: 即为重写;子类覆盖父类的方法,将子类的实例传与父类的引用调用的是子类的方法 实现接口的实例传与接口的引用调用的实现类的方法。 3、 说出一些常用的类,包,接口,请各举5个? 【参考答案】 常用的类:String、StringBuffer、 Integer 、Vector、ArrayList、Hashtable等 常用的包:java.lang java.io java.util 、java.sql 。 常用的接口:集合中的List、Set、 Map接口;与Servlet API相关的Servlet接口、HttpServletRequest,HttpServletResponse,HttpSession接口等。 4、 Collections和Collection的区别【天晟科技】 【参考答案】 Collection是个java.util下的接口,它是各种集合结构的父接口,定义了集合对象的基本操作方法。Collections是个java.util下的工具类,它包含有各种有关集合操作的静态方法,主要是针对集合类的一个帮助类或者叫包装类,它提供一系列对各种集合的搜索,排序,线程安全化等操作方法。 5、 Class.forName的作用?为什么要用? 【参考答案】 按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。加载完这个Class字节码后,接着就可以使用Class字节码的newInstance方法去创建该类的实例对象了。有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时才能确定,这时候就需要使用Class.forName去动态加载该类,这个类名通常是在配置文件中配置的,例如,spring的ioc中每次依赖注入的具体类就是这样配置的,jdbc的驱动类名通常也是通过配置文件来配置的,以便在产品交付使用后不用修改源程序就可以更换驱动类名。 6、 Socket如何获取本地ip地址? 第 187 页 共 188 页 Java高级软件工程师面试题 【参考答案】 InetAddress类提供的API来访问。InetAddress.getLocalAddress() 【分析】 1、 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类【天威诚信面试题】 【参考答案】 接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承具体类。抽象类中可以有静态的main方法。 备注:只要明白了接口和抽象类的本质和作用,这些问题都很好回答,你想想,如果你是java语言的设计者,你是否会提供这样的支持,如果不提供的话,有什么理由吗?如果你没有道理不提供,那答案就是肯定的了。 只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。 2、 用最有效率的方法算出2乘以8等於几? 【参考答案】 2 << 3 【分析】 因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以2乘以8等於几的最效率的方法是2 << 3。 3、 char型变量中能不能存贮一个中文汉字?为什么? 【参考答案】 char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。 4、 写clone()方法时,通常都有一行代码,是什么? 【参考答案】 clone 有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员。 5、 说说常用集合类有哪些?有哪些方法? 【参考答案】 通常我们使用的集合类都大多是由List、Set、Map这三类接口派生出来的类,例如: ArrayList、Vector、LinkedList、Stack、TreeSet、Hashtable、HashMap等 集合类的大部分方法都是由Collection接口定义的,主要包括有: add(E e)、remove(Object e)、addAll(),remove()、contains(Object obj)、clear()等 6、 请说出作用域public,private,protected,以及不写时的区别?【天威诚信面试题】 【参考答案】 这四个作用域的可见范围如下表所示。 说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。 第 187 页 共 188 页 Java高级软件工程师面试题 作用域 同一类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 备注:只要记住了有4种访问权限,4个访问范围,然后将全选和范围在水平和垂直方向上分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。 1、 构造器Constructor是否可被override? 【亿阳通讯面试题】 【参考答案】 构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。 2、 是否可以从一个static方法内部发出对非static方法的调用? 【世承软件面试题】 【参考答案】 不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。 3、 Math.round(11.5)等於多少? Math.round(-11.5)等於多少?【雾隐美地传媒】 【参考答案】 Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,所以,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,所以,Math.floor(11.6)的结果为11,Math.floor(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。 4、 abstract class(抽象类)和interface(接口)有什么区别? 【百度应用中心面试题】 【参考答案】 含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。 接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。 下面比较一下两者的语法区别: 1.抽象类可以有构造方法,接口中不能有构造方法。 2.抽象类中可以有普通成员变量,接口中没有普通成员变量 3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。 第 187 页 共 188 页 Java高级软件工程师面试题 4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然 eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。 5. 抽象类中可以包含静态方法,接口中不能包含静态方法 6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。 7. 一个类可以实现多个接口,但只能继承一个抽象类。 下面接着再说说两者在应用上的区别: 【分析】 这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等方面来回答。 1、 Collection框架中实现比较要实现什么接口? 【参考答案】 Comparable、Comparator接口 2、 是否可以继承String类? 【参考答案】 String类是final类故不可以继承。 3、 String 和StringBuffer的区别 【参考答案】 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。String类表示内容不可改变的字符串。而StringBuffer类表示内容可以被修改的字符串。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。 String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。 4、 StringBuffer与StringBuilder的区别 【参考答案】 StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。 5、 try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 【杭州天眼科技】 【参考答案】 第 187 页 共 188 页 Java高级软件工程师面试题 答案是在return之前。 【分析】 程序代码的运行结果: public class Test { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(new Test().test());; } static int test() { int x = 1; try { return x; } finally { ++x; } } } ---------执行结果 --------- 1 运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。 下面的程序代码输出的结果是多少? public class smallT { public static void main(String args[]) { smallT t = new smallT(); int b = t.get(); System.out.println(b); } public int get() { try { return 1 ; 第 187 页 共 188 页 Java高级软件工程师面试题 } finally { return 2 ; } } } 返回的结果是2。 我可以通过下面一个例子程序来帮助我解释这个答案,从下面例子的运行结果中可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。 在讲解答案时可以用下面的程序来帮助分析: public class Test { /** * @param args add by zxx ,Dec 9, 2008 */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(new Test().test());; } int test() { try { return func1(); } finally { return func2(); } } int func1() { System.out.println("func1"); return 1; } int func2() { System.out.println("func2"); 第 187 页 共 188 页 Java高级软件工程师面试题 return 2; } } -----------执行结果----------------- func1 func2 2 结论:finally中的代码比return 和break语句后执行。 1、 Java中的异常处理机制的简单原理和应用。 【参考答案】 异常是指java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。 Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。 java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try..catch处理或用throws声明,所以系统异常也称为unchecked异常。 2、 多线程有几种实现方法?同步有几种实现方法? 【参考答案】 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。 同步的实现方面有两种,分别是synchronized,wait与notify 。 a. wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 b. sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。 c. notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。 d. allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。 3、 启动一个线程是用run()还是start()? 【参考答案】 第 187 页 共 188 页 Java高级软件工程师面试题 启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。 1、 内部类可以引用外部类的成员吗?有没有什么限制? 【参考答案】 完全可以。如果不是静态内部类,那没有什么限制! 如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员。 2、 List 和 Map 区别?【软通动力】 【参考答案】 一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。 3、 ArrayList和Vector的区别【博炎科技】 【参考答案】 这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的。 接着说ArrayList与Vector的区别,这主要包括两个方面: 1、同步性: Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。 备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。 2、数据增长: ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长为原来的1.5倍。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。 4、 heap和stack有什么区别。 【参考答案】 Java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。 堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用 new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使 第 187 页 共 188 页 Java高级软件工程师面试题 用final修饰后,放在堆中,而不是栈中。 1、 Java 类实现序列化的方法(二种)?如在collection框架中实现排序,要实现什么样的接口 【参考答案】 java.io.Serializable接口或实现Externalizable 接口。 Collection框架中实现比较要实现Comparable 接口或 Comparator 接口,并实现比较方法 2、 JAVA实现向数据库添加一列。 【参考答案】 Connection con = null; ResultSet rs = null; Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_name"; Connection con = DriverManager.getConnection(url,"",""); StateManager sm =con.createStateMent(); String sql = " alter table student add age int; "; rs = sm.excute(sql); 3、 什么是Java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 【东软国际】 【参考答案】 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。 序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出,那么在另一端,通过ObjectInputStream对象的readObject(Object obj)获取到字节流数据后,要将字节流转换成原对象,这叫反序列化,以便将数据存储在文件中或在网络传输。 Serializable 接口描述启用其序列化功能,未实现此接口的类将无法使其任何状态序列化或反序列化。Serializable 接口没有方法或字段,仅用于标识可序列化的语义,标识实现了该接口的对象属性可被序列化。 4、 Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 【参考答案】 字节流,字符流两种类型流。字节流继承于InputStream、 OutputStream;字符流继承于Reader、Writer。 其它与IO操作相关的类都是派生至上述4个抽象类,如字节相关的:FileInputStream、FileOutputStream类;字符相关的:BufferedReader、BufferedWriter类 第 187 页 共 188 页 Java高级软件工程师面试题 1、 用JDBC如何调用存储过程 【参考答案】 通过JDBC组件中的CallableStatement接口实现调用存储过程。 核心代码如下: Class.forName("com.mysql.jdbc.Driver"); Connection conn= DriverManager.getConnection("jdbc:mysql:///test","root","root"); CallableStatement cstmt = cn.prepareCall("{call insert_Student(?,?,?)}"); cstmt.registerOutParameter(3,Types.INTEGER); cstmt.setString(1, "wangwu"); cstmt.setInt(2, 25); cstmt.execute(); 2、 JAVA事件有哪些模式? 【参考答案】 1、事件直接驱动模式。它的特点是直接而且快,是必须经常使用的,主要适合于迅速处理 前台的命令,通常就是我们说的command(命令)模式。。2.监控式事件模式。主要借助第三者来监控和触发事件,就是通常我们说的观察者模式。特点是: 有一个观察者置身事外在定期独立运行着,我们将我们要监听的事件向这个观察者注册,这样观察者就 代替我们来监听这个事件,应用客户端通过观察者来获得事件状况。 【分析】 3、 JVM加载class文件原理? 【参考答案】 所谓装载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或是这个接口的class对象的过程. 第 187 页 共 188 页 Java高级软件工程师面试题 在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备、解析 装载:查找和导入类或接口的二进制数据; 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 校验:检查导入类或接口的二进制数据的正确性; 准备:给类的静态变量分配并初始化存储空间; 解析:将符号引用转成直接引用; 初始化:激活类的静态变量的初始化Java代码和静态Java代码块 JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类 一个Java应用程序使用两种类型的类装载器:根装载器(bootstrap)和用户定义的装载器(user-defined)。 根装载器以某种默认的方式将类装入,包括那些Java API的类。在运行期间一个Java程序能安装用户自己定义的类装载器。根装载器是虚拟机固有的一部分,而用户定义的类装载器则不是,它是用Java语言写的,被编译成class文件之后然后再被装入到虚拟机,并像其它的任何对象一样可以被实例化。 Java类装载器的体系结构如下所示: Bootstrap(根装载器) | Extension (扩展装载器) | System | UserDefine1 / UserDefine2 UserDefine3 | UserDefine4 Java的类装载模型是一种代理(delegation)模型。当JVM 要求类装载器CL(ClassLoader)装载一个类时,CL首先将这个类装载请求转发给他的父装载器。只有当父装载器没有装载并无法装载这个类时,CL才获得装载这个类的机会。这样, 所有类装载器的代理关系构成了一种树状的关系。树的根是类的根装载器(bootstrap ClassLoader) , 在JVM 中它以"null"表示。除根装载器以外的类装载器有且仅有一个父装载器。在创建一个装载器时, 如果没有显式地给出父装载器, 那么JVM将默认系统装载器为其父装载器 下面针对各种类装载器分别进行详细的说明: 根(Bootstrap) 装载器:该装载器没有父装载器,它是JVM实现的一部分,从sun.boot.class.path装载运行时库的核心代码。 扩展(Extension) 装载器:继承的父装载器为根装载器,不像根装载器可能与运行时的操作系统有关,这个类装载器是用纯Java代码实现的,它从java.ext.dirs (扩展目录)中装载代码。 系统(System or Application) 装载器:装载器为扩展装载器,我们都知道在安装JDK的时候要设置环境变量(CLASSPATH ),这个类装载器就是从java.class.path(CLASSPATH 环境变量)中装载代码的,它也是用纯Java代码实现的,同时还是用户自定义类装载器的缺省父装载器。 小应用程序(Applet) 装载器: 装载器为系统装载器,它从用户指定的网络上的特定目录装载小应用程序代码。 1、 SOCKET中有几中连接方式,各有什么区别? 【参考答案】 Sockets有两种主要的操作方式:面向连接(TCP/IP)的和无连接(UDP)的。无连接的操作使用数据报协议,无连接的操作是快速的和高效的,但是数据安全性不佳. 面向连接的操作使用TCP协议.面向连接的操作比无连接的操作效率更低,但是数据的安全性更高 【分析】 2、 抽象类能否被实例化 ?抽象类的作用是什么? 【参考答案】 抽象类一般不能被实例化;抽象类通常不是由程序员定义的,而是由项目经理或模块设计人 设计抽象类的原因通常是为了规范方法名 抽象类必须要继承,不然没法用,作为模块设计者,可以把让底层程序员直接用得方法直接调用,而一些需要让程序员覆盖后自己做得方法则定义称抽象方法 【分析】 第 187 页 共 188 页 Java高级软件工程师面试题 1、 Linkedlist、Arraylist内部是如何实现的(更深入的问了LinkedList与ArrayList的区别) 【天威诚信面试题】 【参考答案】 ArrayList的内部实现是基于内部数组Object[],它更像是对数组实现的一种封装,所以在向ArrayList的前面或中间插入数据时,必须将其后的所有数据相应的后移,这样必然要花费较多时间。 而LinkedList的内部实现是基于一组双向链表实现的存储特性,所以提供了链表一样访问的API接口,它们在性能上有很大的差别。当你访问Linkedlist链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。 而当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能。 【分析】 2、 Hashtable的原理【北辰网络】 【参考答案】 通过节点的关键码确定节点的存储位置,即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),将此值解释为该节点的存储地址 3、 JDBC中的PreparedStatement相比Statement的好处? 【参考答案】 预编译语句java.sql.PreparedStatement ,扩展自 Statement,不但具有 Statement 的所有能力而且具有更强大的功能。不同的是,PreparedStatement 是在创建语句对象的同时给出要执行的sql语句。这样,sql语句就会被系统进行预编译,执行的速度会有所增加,尤其是在执行大语句的时候,效果更加理想 4、 sleep()和wait()区别 【参考答案】 sleep() 方法:线程主动放弃CPU,使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。典型地,sleep() 被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后重新测试,直到条件满足为止。 wait( ) :与notify()配套使用,wait()使得线程进入阻塞状态,它有两种形式,一种允许指定以毫秒为单位的一段时间作为参数,另一种没有参数,当指定时间参数时对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用 (网上的答案:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。) 第 187 页 共 188 页 Java高级软件工程师面试题 sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果),调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。对于wait的讲解一定要配合例子代码来说明,才显得自己真明白。 package com.huawei.interview; public class MultiThread { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub new Thread(new Thread1()).start(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } new Thread(new Thread2()).start(); } private static class Thread1 implements Runnable { @Override public void run() { // TODO Auto-generated method stub //由于这里的Thread1和下面的Thread2内部run方法要用同一对象作为监视器,我们这里不能用this,因为在Thread2里面的this和这个Thread1的this不是同一个对象。我们用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时,指向的都是同一个对象。 synchronized (MultiThread.class) { System.out.println("enter thread1..."); System.out.println("thread1 is waiting"); try { 第 187 页 共 188 页 Java高级软件工程师面试题 //释放锁有两种方式,第一种方式是程序自然离开监视器的范围,也就是离开了synchronized关键字管辖的代码范围,另一种方式就是在synchronized关键字管辖的代码内部调用监视器对象的wait方法。这里,使用wait方法释放锁。 MultiThread.class.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("thread1 is going on..."); System.out.println("thread1 is being over!"); } } } private static class Thread2 implements Runnable { @Override public void run() { // TODO Auto-generated method stub synchronized (MultiThread.class) { System.out.println("enter thread2..."); System.out.println("thread2 notify other thread can release wait status.."); //由于notify方法并不释放锁, 即使thread2调用下面的sleep方法休息了10毫秒,但thread1仍然不会执行,因为thread2没有释放锁,所以Thread1无法得不到锁。 MultiThread.class.notify(); System.out.println("thread2 is sleeping ten millisecond..."); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("thread2 is going on..."); System.out.println("thread2 is being over!"); } } } 第 187 页 共 188 页 Java高级软件工程师面试题 }) 1、 概述反射和序列化 【参考答案】 Reflection:是Java被视为动态语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。 序列化:就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时的问题。 2、 Java中实现多态的机制是什么? 【参考答案】 重写,重载 方法的重写Overriding和重载Overloading是Java多态性的不同表现。 重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。 果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 3、 Overload和Override的区别?Overloaded的方法是否可以改变返回值的类型? 【软通动力】 【参考答案】 Overload是重载的意思,Override是覆盖的意思,也就是重写。 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。 重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。 是否可以改变返回值类型,在重载的定义中,与方法是什么类型返回值无关。 【分析】 override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点: 1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果; 第 187 页 共 188 页 Java高级软件工程师面试题 2、覆盖的方法的返回值必须和被覆盖的方法的返回一致; 3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类; 4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。 overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点: 1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int)); 2、不能通过访问权限、返回类型、抛出的异常进行重载; 3、方法的异常类型和数目不会对重载造成影响; 4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。 1、 ClassLoader如何加载class 。 【参考答案】 jvm里有多个类加载,每个类加载可以负责加载特定位置的类,例如,bootstrap类加载负责加载jre/lib/rt.jar中的类, 我们平时用的jdk中的类都位于rt.jar中。extclassloader负责加载jar/lib/ext/*.jar中的类,appclassloader负责classpath指定的目录或jar中的类。除了bootstrap之外,其他的类加载器本身也都是java类,它们的父类是ClassLoader。 2、 ArrayList如何实现插入的数据按自定义的方式有序存放 【参考答案】 实现Comparable 比较接口,并实现compareTo方法。排序的方法,取决于compareTo方法中的比较定义的返回值,一般有3个返回值:1、-1、0表示不同的比较结果。 程序示例: class MyBean implements Comparable{ public int compareTo(Object obj){ if(! obj instanceof MyBean) throw new ClassCastException(); MyBean other = (MyBean) obj; return age > other.age?1:age== other.age?0:-1; } } class MyTreeSet { private ArrayList datas = new ArrayList(); public void add(Object obj){ for(int i=0;ihao are you
替换成 I am fine $('p').replaceWith('I am fine'); replaceAll 与replaceWith的用法前后调换一下即可。 3、 你觉得beforeSend方法有什么用? 【参考】 答:发送请求前可以修改XMLHttpRequest对象的函数,在beforeSend中如果返回false 可以取消本次的Ajax请求。XMLHttpRequest对象是唯一的参数 所以在这个方法里可以做验证 4、 siblings() 方法 和 $('prev~div')选择器是一样的嘛? 【参考】 答: $('prev~div') 只能选择'#prev'元素后面的同辈元素而siblings()方法与前后的文职无关,只要是同辈节点就都能匹配。
5、 你在ajax中使用过JSON吗,你是如何用的?
【参考】
答:使用过,在$.getJSON() 方法的时候就是。因为 $.getJSON() 就是用于加载JSON文件的
6、 有哪些查询节点的选择器?
【参考】
答:我在公司使用过
:first 查询第一个,
:last 查询最后一个,
:odd查询奇数但是索引从0开始
:even 查询偶数,
:eq(index)查询相等的 ,
:gt(index)查询大于index的 ,
:lt查询小于index
:header 选取所有的标题等
第 187 页 共 188 页
Java高级软件工程师面试题
1、 nextAll() 能 替代$('prev~siblindgs')选择器吗?
【参考】
答:能。 使用nextAll() 和使用$('prev~siblindgs') 是一样的
2、 jQuery中有几种方法可以来设置和获取 样式
答 :addClass() 方法,attr() 方法
3、 $(document).ready()方法和window.onload有什么区别?
【参考】
答: 两个方法有相似的功能,但是在实行时机方面是有区别的。
1) window.onload方法是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行的。
2) $(document).ready() 方法可以在DOM载入就绪时就对其进行操纵,并调用执行绑定的函数。
4、 jQuery是如何处理缓存的?
【参考】
答 :要处理缓存就是禁用缓存.
1) 通过$.post() 方法来获取数据,那么默认就是禁用缓存的。
2) 通过$.get()方法 来获取数据,可以通过设置时间戳来避免缓存。可以在URL后面加上+(+new Date)例 $.get('ajax.xml?'+(+new Date),function () { //内容 });
3) 通过$.ajax 方法来获取数据,只要设置cache:false即可。
5、 $.getScript()方法 和 $.getJson() 方法有什么区别?
【参考】
1) $.getScript() 方法可以直接加载.js文件,并且不需要对javascript文件进行处理 ,javascript文件会自动执行。
2) $.getJson() 是用于加载JSON 文件的 ,用法和$.getScript()
6、 你读过哪些有关于jQuery的书吗?
【参考】
《jquery基础教程》 《jquery实战》 《锋利的jquery》 《巧用jquery》 《jQuery用户界面库学习指南》等
7、 $("#msg").text(); 和 $("#msg").text("new content");有什么区别?
【参考】
1 $("#msg").text() 是 返回id为msg的元素节点的文本内容
2 $("#msg").text("new content"); 是 将“new content” 作为普通文本串写入id为msg的元素节点内容中, 页面显示粗体的new content
8、 radio单选组的第二个元素为当前选中值,该怎么去取?
【参考】
答 : $('input[name=items]').get(1).checked = true;
9、 选择器中 id,class有什么区别?
第 187 页 共 188 页
Java高级软件工程师面试题
【参考】
答:在网页中 每个id名称只能用一次,class可以允许重复使用
1、 你使用过哪些数据格式,它们各有什么特点?
【参考】
答: HTML格式,JSON格式,javascript格式,XML格式
1) HTML片段提供外部数据一般来说是最简单的。
2) 如果数据需要重用,而且其他应用程序也可能一次受到影响,那么在性能和文件大小方面具有优势的JSON通常是不错的选择。
3) 而当远程应用程序未知时,XML则能够为良好的互操作性提供最可靠的保证。
2、 jQuery 能做什么?
【参考】
1) 获取页面的元素
2) 修改页面的外观
3) 改变页面大的内容
4) 响应用户的页面操作
5) 为页面添加动态效果
6) 无需刷新页面,即可以从服务器获取信息
7) 简化常见的javascript任务
3、 在ajax中data主要有几种方式?
【参考】
三种,html拼接的,json数组,form表单经serialize()序列化的。
4、 jQuery中的hover()和toggle()有什么区别?
【参考】
hover()和toggle()都是jQuery中两个合成事件。hover()方法用于模拟光标悬停事件。toggle()方法是连续点击事件。
5、 你知道jQuery中的事件冒泡吗,它是怎么执行的,何如来停止冒泡事件?
【参考】
答 : 知道,事件冒泡是从里面的往外面开始触发。在jQuery中提供了stopPropagation()方法可以停止冒泡。
6、 例如 单击超链接后会自动跳转,单击"提交"按钮后表单会提交等,有时候我想阻止这些默认的行为,该怎么办?
【参考】
可以用 event.preventDefault()或 在事件处理函数中返回false,即 return false;
7、 jquery表单提交前有几种校验方法?分别为??
【参考】
formData:返回一个数组,可以通过循环调用来校验
jaForm:返回一个jQuery对象,所有需要先转换成dom对象
fieldValue:返回一个数组 beforeSend()
8、
第 187 页 共 188 页
Java高级软件工程师面试题
在jquery中你有没有编写过插件,插件有什么好处?你编写过那些插件?它应该注意那些?
【参考】
插件的好处:对已有的一系列方法或函数的封装,以便在其他地方重新利用,方便后期维护和提高开发效率
插件的分类:封装对象方法插件 、封装全局函数插件、选择器插件
注意的地方:
1) 插件的文件名推荐命名为jquery.[插件名].js,以免和其他的javaScript库插件混淆 。
2) 所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身上。
3) 插件应该返回一个jQuery对象,以保证插件的可链式操作。
4) 避免在插件内部使用$作为jQuery对象的别名,而应使用完整的jQuery来表示,这样可以避免冲突或使用闭包来避免。
5) 所有的方法或函数插件,都应当一分好结尾,否则压缩的时候可能出现问题。在插件头部加上分号,这样可以避免他人的不规范代码给插件带来影响。
6) 在插件中通过$.extent({})封装全局函数,选择器插件,扩展已有的object对象
7) 通过$.fn.extend({})封装对象方法插件
1、 怎样给jquery动态附加新的元素?那么怎样给新生成的元素绑定事件呢?
【参考】
jQuery的html()可以给现在元素附加新的元素 直接在元素还未生成前就绑定肯定是无效的,因为所绑定的元素目前根本不存在。所以我们可以通过live和livequery来动态绑定事件
2、 IE与FireFox脚本兼容性问题
(1) window.event:
表示当前的事件对象,IE有这个对象,FF没有,FF通过给事件处理函数传递事件对象
(2) 获取事件源
IE用srcElement获取事件源,而FF用target获取事件源
(3) 添加,去除事件
IE:element.attachEvent(“onclick”, function) element.detachEvent(“onclick”, function)
FF:element.addEventListener(“click”, function, true) element.removeEventListener(“click”, function, true)
(4) 获取标签的自定义属性
IE:div1.value或div1[“value”]
FF:可用div1.getAttribute(“value”)
(5) document.getElementByName()和document.all[name]
IE;document.getElementByName()和document.all[name]均不能获取div元素
FF:可以
(6) input.type的属性
IE:input.type只读
FF:input.type可读写
(7) innerText textContent outerHTML
IE:支持innerText, outerHTML
FF:支持textContent
第 187 页 共 188 页
Java高级软件工程师面试题
(8) 是否可用id代替HTML元素
IE:可以用id来代替HTML元素
FF:不可以
这里只列出了常见的,还有不少
1、 css+div的优势
Div+CSS标准的优点:
1.大大缩减页面代码,提高页面浏览速度,缩减带宽成本;
2.结构清晰,容易被搜索引擎搜索到,天生优化了seo
3.缩短改版时间。只要简单的修改几个CSS文件就可以重新设计一个有成百上千页面的站点。
4.强大的字体控制和排版能力。CSS控制字体的能力比糟糕的FONT标签好多了,有了CSS,我们不再需要用FONT标签或者透明的1 px GIF图片来控制标题,改变字体颜色,字体样式等等。
5.CSS非常容易编写。你可以象写html代码一样轻松地编写CSS。
6.提高易用性。使用CSS可以结构化HTML
7. 可以一次设计,随处发布。
更好的控制页面布局
2、 DIV和Span的区别?
DIV(division)是一个块级元素,可以包含段落、标题、表格,乃至诸如章节、摘要和备注等。而SPAN 是行内元素,SPAN 的前后是不会换行的,它没有结构的意义,纯粹是应用样式,当其他行内元素都不合适时,可以使用SPAN
在 HTML 视图中工作时,可以在
内编辑文本,将某些字包含在 元素内,以强调那些字。与
不同, 和它周围的文本一起移动
3、 css是什么
层叠样式表,用来进行页面样式设计,美化页面显示。
4、 xml有哪些解析技术,有什么区别?
有DOM,SAX,STAX等
DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问
5、 ajax的工作原理?
Ajax 基本上就是把 JavaScript 技术和 XMLHttpRequest 对象放在 Web 表单和服务器之间。当用户填写表单时,数据发送给一些 JavaScript 代码而不是
第 187 页 共 188 页
Java高级软件工程师面试题
直接发送给服务器。相反,JavaScript 代码捕获表单数据并向服务器发送请求。同时用户屏幕上的表单也不会闪烁、消失或延迟。换句话说,JavaScript 代码在幕后发送请求,用户甚至不知道请求的发出。更好的是,请求是异步发送的,就是说 JavaScript 代码(和用户)不用等待服务器的响应。因此用户可以继续输入数据、滚动屏幕和使用应用程序。
然后,服务器将数据返回 JavaScript 代码(仍然在 Web 表单中),后者决定如何处理这些数据。它可以迅速更新表单数据,让人感觉应用程序是立即完成的,表单没有提交或刷新而用户得到了新数据。JavaScript 代码甚至可以对收到的数据执行某种计算,再发送另一个请求,完全不需要用户干预!这就是 XMLHttpRequest 的强大之处。它可以根据需要自行与服务器进行交互,用户甚至可以完全不知道幕后发生的一切。结果就是类似于桌面应用程序的动态、快速响应、高交互性的体验。
1、 HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交?
function chkForm(this)
{
var value = thist.d1.value;
var len = value.length;
for(var i=0;i"9" || value.charAt(i)<"0")
{
alert("含有非数字字符");
return false;
}
}
return true;
}
2、 请写出用于校验HTML文本框中输入的内容全部为数字的javascript代码
function chkNumber(eleText)
{
var value = eleText.value;
var len = value.length;
for(var i=0;i"9" || value.charAt(i)<"0")
{
alert("含有非数字字符");
eleText.focus();
break;
}
}
}
除了写完代码,还应该在网页上写出实验步骤和在代码中加入实现思路,让面试官一看就明白你的意图和检查你的结果。
1、 xml有哪些解析技术?区别是什么? 【北京科瑞明】
答:
有DOM,SAX,STAX等
DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问
STAX:Streaming API for XML (StAX)
讲解这些区别是不需要特别去比较
2、 在javascript中设置定时调用myfun()函数(周期为1秒)的代码是?
setInterval(myfun(),1000)
3、 XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
两种形式 dtd 、schema,
本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的)。
解析的中有:DOM、SAX、JDOM、DOM4J等。
DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问
SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 。
4、 HTTP请求返回的状态码有哪些?分别有什么含义?
3XX:重定向,这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。
第 187 页 共 188 页
Java高级软件工程师面试题
302:请求的资源现在临时从不同的 URI 响应请求
303:对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。
4XX:请求错误,这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。
像,403、404、405错误
5XX:服务器错误,这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。
像,500、501、502等错误
1、 二叉树遍历有几种方法【中恒互联】
有3种方法。先序遍历、中序遍历、后序遍历
2、 用JavaScript写一个小时钟,网页内容如下:
2013年12月23日 12:23:30
每秒钟跳动一次
参考:
3、 JSON和XML的优缺点
【参考答案】
1) 在可读性方面,JSON和XML的数据可读性基本相同。JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
2) 在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
3) 在编码难度方面,XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
4) 在解码难度方面,XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
5) 在流行度方面,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。
6) JSON和XML同样拥有丰富的解析手段。
7) JSON相对于XML来讲,数据的体积小。
8) JSON与JavaScript的交互更加方便。
9) JSON对数据的描述性比XML较差。
第 187 页 共 188 页
Java高级软件工程师面试题
1) JSON的速度要远远快于XML。
(一) Struts、Spring、Hibernate、Mybatis框技术
1. Struts2.0有几种标签库
【参考答案】
UI标签 、控制标签、数据标签、杂项标签
2. struts2 必备包有哪些?
第 187 页 共 188 页
Java高级软件工程师面试题
【参考答案】
commons-fileupload-1.2.1.jar
freemarker-2.3.13.jar
ognl-2.6.11.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar
1. Hiberbate优化方法有那些?
【参考答案】
1) 尽量使用many-to-one,避免使用one-to-many
2) 灵活使用单向one-to-many
3) 不用一对一,使用多对一代替一对一
4) 配置对象缓存,不使用集合缓存
5) 一对多使用Bag 多对一使用Set
6) 继承使用显示多态 HQL:from object polymorphism="exlicit" 避免查处所有对象
7) 消除大表,使用二级缓存
2. 应用服务器与Web Server的区别
【参考答案】
Web服务器(Web Server)
Web服务器可以解析(handles)HTTP协议。当Web服务器接收到一个HTTP请求,会返回一个HTTP响应,例如送回一个HTML页面。为了处理一个请求,Web服务器可以响应一个静态页面或图片, 进行页面跳转,或者把动态响应的产生委托给一些其它的程序例如CGI脚本,JSP脚本,servlets,ASP脚本,服务器端JavaScript,或者一些其它的服务器端技术。无论它们(译者 注:脚本)的目的如何,这些服务器端的程序通常产生一个HTML的响应来让浏览器可以浏览。
应用程序服务器
通过各种协议,可以包括HTTP,把商业逻辑暴露给客户端应用程序。Web服务器主要 是处理向浏览器发送HTML以供浏览,而应用程序服务器提供访问商业逻辑的途径以供客户端应用程序使用。应用程序使用此商业逻辑就象你调用对象的一个方法 (或过程语言中的一个函数)一样。
应用程序服务器的客户端(包含有图形用户界面(GUI)的)可能会运行在一台PC、一个Web服务器或者甚至是其它的应用程序服务器上。在应用 程序服务器与其客户端之间来回穿梭的信息不仅仅局限于简单的显示标记。相反,这种信息就是程序逻辑。 正是由于这种逻辑取得了数据和方法调用的形式而不是静态HTML,所以客户端才可以随心所欲的使用这种被暴露的商业逻辑。
在大多数情形下,应用程序服务器是通过组件的应用程序接口把商业逻辑暴露 (给客户端应用程序)的,例如基于J2EE应用程序服务器的EJB组件模型。此外,应用程序服务器可以管理自己的资源,例如,安全,事务处理,资源池, 和消息。就象Web服务器一样,应用程序服务器配置了多种可扩展和容错技术。
3. 如何设置Hibernate二级缓存
【参考答案】
1、首先要打开二级缓存,在hibernate.cfg.xml中添加如下配置:
true
第 187 页 共 188 页
Java高级软件工程师面试题
2、Hibernate的二级缓存使用第三方的缓存工具来实现,所以我们需要指定Hibernate使用哪个缓存工具。如下配置指定Hibernate使用EhCache缓存工具。
org.hibernate.cache.EhCacheProvider
3、Hibernate在默认情况下并不会对所有实体对象进行缓存,所以,我们需要指定缓存哪些对象,在实体对象的映射文件中(相应的标签内部),添加如下配置:
usage="read-only"是“只读”缓存策略。
1. ApplicationContext和BeanFactory有什么区别?
【参考答案】
BeanFactory实际上是实例化,配置和管理众多bean的容器。 这些bean通常会彼此合作,因而它们之间会产生依赖,而这种依赖只是体现在Bean与Bean之间的依赖 这些依赖关系可以通过配置来反映,而ApplicationContext beans包是BeanFactory的子类,提供了以编程的方式管理和操控bean的基本功能,而context包增加了ApplicationContext,它以一种更加面向框架的方式增强了BeanFactory的功能,简单说他增强了面向Web容器的功能。ApplictionContext完全采用声明式方式来使用容器,甚至不用去手工创建它,Web应用的启动进程中用它启动ApplicationContext。当然用编程的方式创建一个ApplicationContext对象可以有以下几种方式或实现:
1、ClassPathXmlApplicationContext:从类路径中的XML文件载入上下文定义信息,把上下文定义文件当作类路径资源。
2、FileSystemXmlApplicationContext:从文件系统中的XML文件载入上下文定义信息。
3、XmlWebApplicationContext:从Web系统中的XMl文件载入上下文信息。
2. Spring MVC 与Struts2 MVC的不同之处 ?【杭州网阙科技】
【参考答案】
1、请求处理机制:spring mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细。
2、参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
3、设计思想上:struts更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展。
4、intercepter的实现机制:struts有以自己的interceptor机制,spring mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。
3. Spring使用了哪些设计模式,这样用有什么好处?
【参考答案】
最典型的像:工厂模式,Spring的IOC容器就是一个大的Bean实例的工厂,负责Bean的周期管理。单例模式,这个和Spring 的IOC一起的,既然是IOC是一个大工厂,那个Bean对象为减少内存开销就需要提供单例特征。适配器模式,在Spring的AOP编程中随处可见Adapter模式的应用。代理模式,为其它对象提供一种代理访问的机制。观察者模式,当对象发生变化时,其它对象需要得到相应更新,Spring中应用也较为普遍。
第 187 页 共 188 页
Java高级软件工程师面试题
【分析】
就说上面几个了,这种问题无法一追溯,把所有Spring用到的设计模式一一回答出来,重要的是你只需要让面试官觉得你对Spring有较深的理解和应用即可。
1. Hibernate有哪几种查询数据的方法?
【参考答案】
hibernate查询有三种方式:HQL查询、结构化SQL查询、QBC查询
2. 3个框架在项目在项目当中的用,BaseDao是用来做什么的。
【参考答案】
DAO组件主要提供数据库访问操作,针对不同数据源表持久化操作进行了封装,这样可以提供其它层的访问接口,使得组件之间解耦。而BaseDAO是这些所有这些不同的持久化的DAO的公共API进行了封装,进一步抽象提取,使其它各组件DAO从BaseDAO中派生,增强系统的重用性、维护性、扩展性。
3. ThreadLocal在项目中的实际意义?
【参考答案】
ThreadLocal和其它同步机制相比从另一个角度来解决多线程的并发访问,它为每一个线程维护一个和该线程绑定的变量的副本,从而隔离了多个线程的数据,每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。还提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的整个变量封装进ThreadLocal
ThreadLocal可以大量减少参数的传递,可以使代码简洁,但一个线程会绑定多个自己定义的局部对象,ThreadLocal是抽象在线程上的对象创建工厂,目前的Tomcat5使用了线程池,一个线程处理一个request,这样ThreadLocal对象可以抽象的绑定在request生命周期,不会存在线程危机,而且线程池也平衡了这些ThreadLocal
4. Spring对多种ORM 框架提供了很好的支持,结合事务管理描述spring从哪些方面提供了对Hibernate的支持。
【参考答案】
1、 SessionFactory管理。使用Spring整合Hibernate时我们不需要hibernate.cfg.xml文件。首先,在applicationContext.xml中配置数据源(dataSource)bean和session工厂(sessionFactory)bean。
2、 持入层管理。Spring提供了HibernateTemplate,用于持久层访问,无需打开Session及关闭Session。它只要获得SessionFactory的引用,将可以只读地打开Session,并在持久化访问结束后关闭Session,对持久层逻辑,通用的操作(如对数据库中数据的增,删,改,查)有HibernateTemplate完成。
3、 对DAO的支持:通过继承HibernateDaoSupport实现DAO基本操作。
4、 对事务支持:Spring的声明式事务和编程式事务,很好的将持久化的操作纳入事务管理。
5. Hibernate的session.save()与session.saveOrUpdate()的区别?
【参考答案】
1.save()方法,调用save方法时,首先会在session缓存中查找保存对象如果实体对象已经处于Persient状态,直接返回;否则并将保存至数据库,对象变为持久状态。
第 187 页 共 188 页
Java高级软件工程师面试题
2.saveOrUpdate()方法:和save方法一样首先在session缓存中查找,判断对象是否为为保存状态,如果对象处于Persient,不执行操作,处于Transient执行save操作,处于Detached调用saveOrUpdate将对象与session重新关联(简单的说就是该方法会先看该对象是否已经存在,如果已经存在就更新,否则新增保存),如果此时saveOrUpdate的对象与另一个与Session关联的对象持有相同的持久化标识则抛出相同的标识符异常。
1. Hibernate中sedssion.get()与session.load()的区别?
【参考答案】
Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:
1) 如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
2) load支持延迟加载,get不支持
3) load方法可返回实体的代理类实例,而get方法永远直接返回实体类。
4) load方法可以充分利用内部缓存和二级缓存中的现有数据,get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
2. annotation的使用方法和用途主要分为几类?
【参考答案】
1、内建Annotation——Java5.0版在java语法中经常用到的内建Annotation:
2、开发者自定义Annotation:由开发者自定义Annotation类型;
3、使用第三方开发的Annotation类型
3. Struts2 是怎么实现MVC的?
【参考答案】
MVC就是 model view controller,三种组件,Struts2实现Controller主要由一系列的前端过滤器(Filter)实现Controller。Model层主要由Struts2的Action组件实现。View层主要是由Struts2的标签库、Freemarker等组件实现视图层
4. 介绍下hibernate【上海数字政通】
【参考答案】
Hibernate是一个开放源代码Java语言下的对象关系映射解决方案。它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。Hibernate也是目前Java开发中最为流行的数据库持久层框架。将软件开发人员从大量相同的数据持久层相关编程工作中解放出来,Hibernate不仅负责从Java类到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大地缩短的手动处理SQL和JDBC上的开发时间。
5. 在Struts2中,配置文件中通配符是怎么表示和使用的?使用通配符后有什么好处。【上海咯勤】
示例1:调用相同Action中的不同方法
/login.jsp
/error.jsp
第 187 页 共 188 页
Java高级软件工程师面试题
/welcome.jsp
其中表达式{1}的值name属性值中第一个*的值。
如果用户请求的URL为loginAction.action,则调用Jcuckoo.LoginRegistAction中的login方法;
如果用户请求的URL为registerAction.action,则调用Jcuckoo.LoginRegistAction中的register方法
示例2:带转视图
/input.jsp
/{1}.jsp
当处理结果是input时,会转到/input.jsp页面
当处理结果是success时,
如果crud_create.action,则会执行Jcuckoo.CrudAction中的create方法,并且跳转到/create.jsp;
如果crud_delete.action,则会执行Jcuckoo.CrudAction中的delete方法,并且跳转到/delete.jsp;
优点:
使用通配符能规范命名格式,简洁配置文件,加速开发效率,也是Struts倡导的一种开发模式。
1. Hibernate 中的HQL和 criteria的区别?
【参考答案】
1.QBC(Query by Criteria)查询对查询条件进行了面向对象封装,符合编程人员的思维方式;
2.HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。
2. 介绍hibernate延持加载属性
【参考答案】
Hibernate通过lazy来指定加载策略,一般值为true或false,。设为flase表示立即加载 , true表过延迟加载。
3. 列举你接触过的框架,说明特点和原理
【参考答案】
Struts2的特点:自己总结一下。
Hibernate特点:
1. 基于JDBC的主流持久化框架,是一个优秀的ORM实现,对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
3. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
Spring特点:
第 187 页 共 188 页
Java高级软件工程师面试题
Spring框架的主要优势之一低侵入式的架构思想,实现了IOC容器。另外一个AOP的编程也在很多应用场合下地位较重。提供了对各种不同类型框架的支持,如:Web容器、持入层、事务层、其它J2EE组件等。
1. 解释一下IOC,以及spring的举例
【参考答案】
IOC称为控制反转,也叫依赖注入,ioc是Spring的核心组件,它通过配置文件,将需要创建的对象以池的方式管理,将实例注入到需要的对象中区,是对象依赖于注入而不依赖于实现,解决了各个组件的耦合度,使得项目在后期的维护和扩展上非常方便。 如在ssh框架整合中,我们将datasource对象注入给sessionFactory,再将sessionFactory注入给dao组件,再将dao组件注入给struts的Action组件,在将action对象注入给struts的拦截器。
2. 解释一下mvc以及熟悉的mvc框架
【参考答案】
MVC是Model-View-Controller的简写。Model 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), View 是应用的表示层(由JSP、HTML、各种Taglib等组成),Controller 是提供应用程序的中心控制处理。通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现,这些组件可以进行交互和重用,另外有利于维护。
Struts1、Struts2、Spring MVC、WebWork等这些都是属于基于MVC模式实现的框架
3. Spring工作原理
【参考答案】
内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调用对象里的方法的 还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过配置类达到的
Spring目的:
就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明 管理的(Spring根据这些配置 内部通过反射去动态的组装对象)要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能
4. Hibernate中离线查询与在线查询的区别
【参考答案】
Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所以它是由 Hibernate Session 进行创建的;而 DetachedCriteria 是离线的,创建时无需 Session,DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name) 进行DetachedCriteria 实例的创建。
5. Struts2实现拦截器的原理?
【参考答案】
第 187 页 共 188 页
Java高级软件工程师面试题
拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用。而Struts2的Interceptor,其拦截的对象是Action代码,可以定义在Action代码之前或者之后执行拦截器的代码。
1. 整个结构就如同一个堆栈,除了Action以外,堆栈中的其他元素是Interceptor
2. Action位于堆栈的底部。由于堆栈"先进后出"的特性,而这些都是围绕着Action的,当我们请求Action时,必须首先把位于Action上端的Interceptor拿出来执行。
1. Struts2的实现原理。【高达软件】
【参考答案】
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper
2. 简述spring 的事务传播行为和 隔离级别
【参考答案】
spring 的事务传播行为:
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:
PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
Spring 的隔离级别
1、Serializable:最严格的级别,事务串行执行,资源消耗最大;
第 187 页 共 188 页
Java高级软件工程师面试题
2、REPEATABLE READ:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。
3、READ COMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。
4、Read Uncommitted:保证了读取过程中不会读取到非法数据。
1. Ibatis框架和Hibernate框架各有什么特点?
【参考答案】
比较方面
Ibatis框架
Hibernate框架
从设计思路来看
从关系型开始到对象型的思路来解决数据库的操作问题
从对象的角度的思路来解决数据库的操作问题
从方便性上来看
半自动
全自动
从sql语句书写来看
要写sql语句
一般不用写,但是有时候我们还是要用书写hql语句的
从映射角度来看
映射sql语句的输入输出参数
对数据库表结构来进行映射
2. 为什么要用 ORM? 和 JDBC 有何不一样?
【参考答案】
orm是一种思想,就是把object对象转变成数据库中的记录,或者把数据库中的记录转变成object对象,我们可以用jdbc来实现这种思想,orm的思想本质就是建立是JDBC上,对JDBC的一种封装,这种封装可以省去了直接使用jdbc的繁琐细节,提高了开发效率,现在用的较多的ORM工具很多,一般我们公司采用的ORM框架主要有hibernate和MyBatis。当然也听说一些其他orm工具,如toplink,ojb等。
3. 谈谈你对Spring AOP 思想的理解。
【参考答案】
AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能,日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。
第 187 页 共 188 页
Java高级软件工程师面试题
使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
1. 谈谈你对Spring的理解。
【参考答案】
1.Spring实现了工厂模式的工厂类(在这里有必要解释清楚什么是工厂模式),这个类名为BeanFactory(实际上是一个接口),在程序中通常BeanFactory的子类ApplicationContext。Spring相当于一个大的工厂类,在其配置文件中通过元素配置用于创建实例对象的类名和实例对象的属性。
2. Spring提供了对IOC良好支持,IOC是一种编程思想,是一种架构艺术,利用这种思想可以很好地实现模块之间的解耦。IOC也称为DI(Depency Injection)。
3. Spring提供了对AOP技术的良好封装, AOP称为面向切面编程,就是系统中有很多各不相干的类的方法,在这些众多方法中要加入某种系统功能的代码,例如,加入日志,加入权限判断,加入异常处理,这种应用称为AOP。实现AOP功能采用的是代理技术,客户端程序不再调用目标,而调用代理类,代理类与目标类对外具有相同的方法声明,有两种方式可以实现相同的方法声明,一是实现相同的接口,二是作为目标的子类在,JDK中采用Proxy类产生动态代理的方式为某个接口生成实现类,如果要为某个类生成子类,则可以用CGLI B。在生成的代理类的方法中加入系统功能和调用目标类的相应方法,系统功能的代理以Advice对象进行提供,显然要创建出代理对象,至少需要目标类和Advice类。
2. 说说struts1与struts2的区别。【首都信息面试题】
【参考答案】
从以下几个方面来一一总结Struts1与Struts2的区别:
① Servlet依赖性
由于Action在被调用时,HttpServletRequest和HttpServletResponse被传递到execute()方法中,Struts1中的Action对Servlet的API是有依赖性的.但如果在Struts2中,Action就不会对容器有依赖了,因为Action是由简单的POJO组成的.在Struts2中,servlet上下文以简单的Map的形式表现出来,这使得Action可以得到独立的测试.如果需要,Struts2也可以访问原始的请求与响应。不过,其他的框架元素减少或排除直接访问HttpServetRequest或HttpServletResponse的必要。
② Action类
使用抽象类而不是接口设计是Struts1设计上的问题,这已经在Struts2中得到了解决.Struts1中的Action类需要继承框架中依赖的抽象基础类.但在Struts2中,Action类可能会也可能不会实现接口来启用可选的或者自定义的服务.在Struts2中,Action是不会依赖于容器的,因为它是由简单的POJO组成的.Struts2提供了一个基础的ActionSupport类来实现一些常用的接口。尽管这样,Action接口仍然不是必须要继承的,任何含有execute方法的POJO对象都可以当作Action对象来用。
③ 验证
第 187 页 共 188 页
Java高级软件工程师面试题
Struts1与Struts2都支持通过validate方法的手动验证.Struts1使用ActionForm中的validate方法或者通过扩展Commons Validator来进行校验.然而,Struts2支持通过Validate方法与Xwork校验框架的手动验证. Xwork框架支持验证链到子属性----使用为属性类文件和校验上下文定义的验证.
① 线程模型
在Struts1中,Action资源一定是线程安全或者同步的.所以Action是singletons并且线程安全的,一定只有一个Action类的实例处理该Action 的所有请求,singleton策略限制了Struts1的Action所能完成的,并且需要更加谨慎的开发.但是在Struts2中,Action对象对每一个请求都生成实例,所以在Struts2中不存在线程安全的问题。
② 易测性
测试Struts1的程序会有些复杂.测试Struts1 Action的主要它依赖容器。但是在Struts2中,Action可以经由创建Action的实例,设置属性和调用方法来得到测试。Struts2中的测试是很简单的,不依赖于容器。
③ 获取输入
Struts1使用ActionForm来捕获输入,而且所有的ActionForm需要继承一个框架依赖的基类.由于JavaBean不能当作ActionForm来用,开发人员不得不创建冗繁的类来获取输入.不过Struts2使用Action属性(例如输入属性不依赖于底层框架)这避免了需要创建第二个输入对象,从此冗繁减少了.此外在Struts2中,Action的属性可以通过标签在web页面中得到访问,POJO表单对象和POJO Action.甚至富对象类型,包括业务或域对象,都可以被当作输入/输出对象来使用。
④ 表达式语言
Struts1与JSTL整合,所以它使用JSTL表达式语言.Struts1的表达式语言含有遍历图表的基础对象,但是在集合和索引属性的支持上表现不好.Struts2同样支持JSTL,但是它也支持一种更强大且灵活的表达式语言----“对象图标记语言”(OGNL)
⑤ 将绑定值到视图中
在视图层,Struts1使用标准的JSP来绑定对象(在模型层被处理的)到页面上下文来进行访问.然而Struts2使用一种叫做值栈的技术,这使得标签可以访问值而不需将视图与正在呈递的对象类型连接起来.值栈允许重用一些属性名相同但类型不同的视图类型.
⑥ 类型转换
通常Struts1的ActionForm属性都是String型的。Struts1使用Commons-Beanutils进行类型转换,这些针对每一个类的类型转换无法为每一个实例配置。然而Struts2使用OGNL来进行类型转换.框架包含了针对基础类型,常见对象类型与原始类型的转换器。
⑦ Action的生存周期
Struts1支持对每一个模块的请求处理器的分离(生命周期),但是同一模块下的所有Action必须共享相同的生命周期。Struts2支持通过拦截器栈为每一个Action创建不同的生命周期.自定义栈可以视需要对不同的Action使用.
第 187 页 共 188 页
Java高级软件工程师面试题
1. 简述 Hibernate 和 JDBC 的优缺点? 如何书写一个 one to many 配置文件
【参考答案】
1、封装了jdbc,简化了很多重复性代码。
2、简化了DAO层编码工作,使开发更对象化了。
3、移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了,不用改变hibernate代码。
4、支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。
说明:
One to many配置见下题
2. 写Hibernate的一对多和多对一双向关联的orm配置?
【参考答案】
配置 一对多
多对一
3. hibernate的inverse属性的作用?
【参考答案】
在Hibernate中,术语inverse是反转的意思,在关联关系中,inverse="false"为主控方,由主控方负责维护对象的关联关系,如果设为主控方对象,主控对象更新,则负责更新另一方对象更新。
4. Spring 的依赖注入是什么意思? 给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写?
【参考答案】
依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某一个Java类,需要另一个Java类的协助时,在传统的程序设计过程中,通常由当前类(调用者)来创建被调用者的实例,然后使用被调用者的方法。但在Spring里,创建被调用者的工作不再由调用者来完成,而是由其它类(往往是工厂类)或容器(Spring IOC容器)完成,当前调用者从其它类或容器中来获取被调用者的实例,这种方式称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入,这是Spring的一种编程思想的体现。
依赖注入在设计模式也体现得非常多,比如说工厂模式和构建模式,
第 187 页 共 188 页
Java高级软件工程师面试题
这种就是一个依赖注入的实现
1. JDO是什么?
【参考答案】
JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。
2. Spring 与EJB的区别?
【参考答案】
① 提供商无关性
EJB 3.0是一个被设计为对提供商没有依赖性的开放的标准。EJB 3.0规范由企业JAVA社区的主流开源组织和厂商共同编写和支持的。EJB 3.0框架使开发者的应用程序实现可以独立于应用服务器。而Spring一直是一个非标准的技术,尽管你在任何应用服务器都上可以使用Spring框架,但基于Spring的应用仍然被限制于Spring本身和在你的应用中使用到的Spring提供的各种特别服务。
② 服务整合
Spring框架是建立在应用服务器和服务库之上,它的服务整合代码(如数据访问模板和Helper类)是基于框架的,并暴露给应用开发者。相反,EJB 3.0框架是紧密整合到应用服务器中的,它的服务整合代码是封装在一个标准的接口下的。
③ 服务聚合的灵活性
由于Spring中的服务整合代码是作为编程接口暴露给应用开发者的,因此开发人员可以根据需要来聚合多个服务。这个特性使你可以集成一个你自己的“轻量”级应用服务器。通常,EJB 3.0应用服务器不提供给开发者这种按照你的需要来选择服务的灵活性。大多数情况,你会得到一系列已经预先打包好的特性,其中有些你可能是不需要的。
④ 声明式服务
EJB 3.0和Spring都将运行时服务(如事务管理、安全、日志、消息、和信息服务)连接给应用程序。由于这些服务同应用程序的业务逻辑并不是直接相关的,因此,它们不被应用程序本身来管理。相反,这些服务被服务容器(如EJB 3.0和Spring)以不可见的方式在运行时提供给应用程序。开发人员(或系统管理员)通过配置来告诉容器什么时候,以怎样的方式来应用这些服务。
⑤ 注射依赖
Spring 和 EJB 3.0都提供了大量的DI模式支持。但是,它们之间也有着根本的不同。Spring支持了通常意义上的但是复杂的基于XML配置文件的注射依赖 API;EJB 3.0支持的注射大多数通用服务对象(如,EJB和容器对象)和JNDI对象,它通过简单的JAVA注解来完成。
第 187 页 共 188 页
Java高级软件工程师面试题
1. SSH框架的优缺点。【北京科瑞明面试题】
【参考答案】
先说说Struts:
1. struts第一个优点应该是实现了MVC。
对Servlet依赖减少,低侵入式的设计
2. Action线程安全的设计
3. 功能强大的OGNL表达式使用。
4. 支持多种复合视图,表现层的使用也多样化,像JSPfreeMarkerVelocity。
5. 拦截器的应用,实现了AOP的思想,方便重用与扩展
6. 自动类型转换功能。
7. 相对低粗度的数据验证功能
Struts缺点:
Struts2中Action中取得从jsp中传过来的参数时,如果页面过于复杂,会造成对象臃肿。
Spring 优点:
1、 非常优秀的轻量级,低侵入式的框架。
2、 IOC的容器周期式的管理,降低组件的偶合。
3、 对其它容器有非常好的支持 ,像对持久层的Hibernate、Ibaits、TOP Link
等。
Spring缺点:
1. Web层的MVC框架单过于单薄,对页面框架的支持,跟其它框架还有很大的差距。
2. 不是一站式解决方案。
3. 使用了反射来管理其容器中的bean,在程序中增大了内存和运行计算的时间。
4. 部分组件功能还有待完善
Hibernate的优点:
1、非常好的ORM的框架,在MVC的切分和JDBC的封装上做的很好。
缺点:
1、 对复杂查询,多变的查询,完成起来有难度。
2、 自动化程序高,改写灵活性不够。
2、缓存不是太高效,所以有些企业单独会选择缓存框架或者弃用Hibernate的原因之一。
2. Spring有哪几种注入方式?
【参考答案】
3种方法。构造属入、属性注入、接口注入
3. Hibernate原理
【参考答案】
1. 读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory
第 187 页 共 188 页
Java高级软件工程师面试题
1. Spring MVC工作机制及为什么要用?【杭州网阙科技】
【参考答案】
1、客户端所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
3.DispatcherServlet请请求提交到目标Controller
4.Controller进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6.视图对象负责渲染返回给客户端。
2. spring中常用的几种advice
【参考答案】
BeforeAdvice (前织入)、AfterAdvice (后织入)、ArroundAdvice (前后织入)ThrowAdvice (异常织入)
3. Spring中bean的配置scope表示什么含义?可以有哪几种取值。
【参考答案】
scope表示Bean的生命周期或者叫Bean的作用域。scope的值有两个:
1、 singleton,为单例属性,即Spring IoC容器只会创建该bean的唯一一个实例,这也是默认的。
2、 prototype为原型属性,即每一次请求都会产生一个新的bean实例。
4. Hibernate对象有几种状态?如何转换
【参考答案】
共3种状态,分别是:Transient状态(瞬时)、Persient状态(持久)、Detached(脱管状态)状态。
5. spring中OpenSessionInViewFilter作用什么的,解决了什么问题
【参考答案】
解决Hibernate的Session的关闭与开启问题。
SSH整合问题:Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。而Spring为我们提供的OpenSessionInViewFilter过滤器为我们很好的解决了这个问题。OpenSessionInViewFilter的主要功能是用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定,允许在事务提交之后延迟加载显示所需要的对象。实现"Open Session in View"的模式 。
【补充说明】
配置如下:
Spring O
第 187 页 共 188 页
Java高级软件工程师面试题
penSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
sessionFactoryBean
sessionFactory
Spring OpenSessionInViewFilter
/*
一般在项目中SSH整合时,我们会加入上面的配置,解决延迟加载时的异常。
1. hibernate有哪五个核心接口。
【参考答案】
Configuration接口,SessionFactory接口,Session接口,Transaction接口,Query和Criteria接口
2. Hibernate中有几种关系映射【嘉瑞互动】
【参考答案】
主要有单向一对一、单向一对多、单向多对一、单向多对多、双向一对一、双向一对多、双向多对多。
3. 介绍一下Hibernate的一级缓存与二级缓存。
缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。Hibernate的Session就是一种缓存,我们通常将之称为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,Session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。由于Session代表一次会话过程,一个Session与一个数据库连接相关连,所以Session最好不要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应关闭。并且Session是线程不安全的,被多个线程共享时容易出现问题。通常只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,因此,Hibernate的Session这一级缓存的缓存作用并不明显,应用价值不大。
Hibernate的二级缓存就是要为Hibernate配置一种全局缓存,让多个线程和多个事务都可以共享这个缓存。一般我们叫它sessionFactory缓存,也叫进程级的缓存,使用第3方插件实现的,也值缓存实体,生命周期和sessionFactory一致,可以进行管理。
二级缓存具体实现:
首先配置第3放插件,我们用的是EHCache,在hibernate.cfg.xml文件中加入
true
在映射中也要显示的调用,
二级缓存之查询缓存:对普通属性进行缓存。如果关联的表发生了修改,那么查询缓存的生命周期也结束了。
在程序中必须手动启用查询缓存:query.setCacheable(true);
第 187 页 共 188 页
Java高级软件工程师面试题
1. 如何在WEB里面配置SPRING【首都信息面试题】
【参考答案】
主要配置Spring Web监听器
2. Hibernate中的Cascade属性有什么作用?
cascade属性的作用是描述关联对象进行操作时的级联特性。可以有以下几种取值:
all : 所有情况下均进行关联操作。
save-update:(级联保存) 表明保存或更新当前对象时会级联保存或更新他所关联的对象。
none:所有情况下均不进行关联操作。这是默认值。
delete :(级联删除) 级联删除所关联的对象。
all-delete-orphan:自动删除不再和 父对象关联的子对象。并且,在出现上面两种情况时执行上面两种的功能,可以说是一个全自动的属性值。
3. Struts1优缺点
【参考答案】
优点:
1) 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现.
2) 有丰富的tag可以用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率
3) 页面导航
4) 使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
5) 提供Exception处理机制。
6) 数据库链接池管理。
7) 支持I18N (国际化)
缺点
1) 转到展示层时,需要配置forward,如果有十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每
2) Struts 的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。
3) 测试不方便. Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现
4) 类型的转换. Struts的FormBean把所有的数据都作为String类型,它可以使用工具Commons-Beanutils进行类型转化。但它的转化都是在Class级别,而且转化的类型是不可配置的。
5) 对Servlet的依赖性过强. Struts处理Action时必需要依赖ServletRequest 和ServletResponse,所有它摆脱不了Servlet容器。
6) 前端表达式语言方面集成了JSTL,所以它主要使用JSTL的表达式语言来获取数据。可是JSTL的表达式语言在Collection和索引属性方面处理显得很弱。
7) 对Action执行的控制困难. Struts创建一个Action,如果想控制它的执行顺序将会非常困难。
8) 对Action 执行前和后的处理.
第 187 页 共 188 页
Java高级软件工程师面试题
Struts处理Action的时候是基于class的hierarchies,很难在action处理前和后进行操作。
1) 对事件支持不够. 在struts中,实际是一个表单Form对应一个Action类(或DispatchAction),换一句话说:在Struts中实际是一个表单只能 对应一个事件。
1. 整合spring 与struts1的方法,那种最好,为什么?
【参考答案】
答:1.第一种方法:
Struts的Action继承Spring的ActionSupport类,并在Action中获取Spring的ApplicationContext。这是最简单的一种整合方式,但有三个缺点:第一,Struts与Spring紧密耦合,不能改换到其他IoC容器;第二,难以使用Spring AOP特性;第三,对于需要使用DispatchAction的Struts应用无能为力。
2.第二种方法:
在Struts的配置文件中,以Spring的DelegatingRequestProcessor类代替Struts的RequestProcessor类,并在Spring的配置文件中定义与Struts配置文件中对应的bean,从而将Struts的Action与Spring分开,并把Struts的动作置于Spring的控制之下。这种整合方式的优点是将不再依赖Spring这个特定的IoC容器,但必须依赖Struts的RequestProcessor类。
3.第三种方法:
通过Spring的DelegatingActionProxy类代理Struts的动作,即在Struts配置文件中,定义的type属性全部改为DelegatingActionProxy,而不是具体的类名,并在Spring配置文件中定义与Struts动作映射对应的bean,从而将Struts的Action与Spring分开,并把Struts的动作置于Spring的控制之下。无疑,这是最灵活的一种整合方式。
【分析】
注意一般说几种整合方式所指的就是Struts1
2. Struts1.2的工作原理
【参考答案】
1.ActionServlet核心控制器会拦截所有*.do的请求
2.从struts-config.xml中找到用户请求的Action
3.通过struts-config.xml中的配置再去找这个Action对应的ActionForm,并实例化
4.把用户填写的数据自动填充到ActionForm中(调用ActionForm中的setXX()方法填充)
5.同时把ActionForm放入到指定的范围中(request,session)
6.然后把请求转发给Action
7.Action获取ActionForm中的值然后调用业务逻辑层实现功能
8.在通过ActionMapping查找Actionforward实现转发;
3. 谈谈Struts1中的ActionServlet。
【参考答案】
中心控制器,负责所以请求处理,并根据配置文件,将请求转到指定Action执行,并根据Action 的ActionForward返回,转到指定视图。
4. Struts1.X 中ActionServlet、 ActionForm 、Action、 ActionMapping各起什么作用?
第 187 页 共 188 页
Java高级软件工程师面试题
【参考答案】
a. Actionservlet为控制器,接受用户请求并派发给相应的Action组件处理;
b. ActionForm主要用于封装请求中的数据和简单验证
c. Action组件具体对用户的请求进行处理
d. ActionMapping封装当前用户请求Action相关的配置信息
1. Struts 1的Action类与Struts 2的Action类区别?
【参考答案】
Struts 1要求Action类要扩展自一个抽象基类。Struts 1的一个共有的问题是面向抽象类编程而不是面向接口编程。
Struts 2的Action类实现了一个Action接口,连同其他接口一起实现可选择和自定义的服务。
Struts 1 Action类是单例类,因只有一个示例控制所有的请求。
Struts 2 Action对象每一个请求都实例化对象,所以没有程安全的问题。
2. 谈谈你对Struts1的理解。
【参考答案】
1. struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。我们可以在web.xml文件中将符合某种特征的所有请求交给这个Servlet处理,这个Servlet再参照一个配置文件(通常为/WEB-INF/struts-config.xml)将各个请求分别分配给不同的action去处理。
2. ActionServlet把请求交给action去处理之前,会将请求参数封装成一个formbean对象(就是一个java类,这个类中的每个属性对应一个请求参数)
3.要说明的是, ActionServlet把formbean对象传递给action的execute方法之前,可能会调用formbean的validate方法进行校验,只有校验通过后才将这个formbean对象传递给action的execute方法,否则,它将返回一个错误页面,这个错误页面由input属性指定,(看配置文件)作者为什么将这里命名为input属性,而不是error属性,我们后面结合实际的运行效果进行分析。
4.action执行完后要返回显示的结果视图,这个结果视图是用一个ActionForward对象来表示的,actionforward对象通过struts-config.xml配置文件中的配置关联到某个jsp页面,因为程序中使用的是在struts-config.xml配置文件为jsp页面设置的逻辑名,这样可以实现action程序代码与返回的jsp页面名称的解耦。
3. Struts1中的action是安全线程么?为什么
【参考答案】
Servlet是在多线程环境下的。即可能有多个请求发给一个servelt实例,每个请求是一个线程。
struts下的action也类似,同样在多线程环境下。
为多线程环境编写代码。我们的controller servlet指挥创建你的Action 类的一个实例,用此实例来服务所有的请求。因此,你必须编写线程安全的Action类。遵循与写线程安全的servlet同样的方针。
4. 在Struts1中actionform属于哪一层
【参考答案】
属于视图层组件,负责封装页面表单数据。
第 187 页 共 188 页
Java高级软件工程师面试题
1. struts控制器组件的主要包括?
【参考答案】
ActionServlet组件:充当struts框架的中央控制器。
RequestProcessor组件,充当每个子应用模块的请求处理器
Action组件,负责处理一项具体的业务。
2. 常见的缓存技术举例【大唐动力面试题】
【参考答案】
操作系统磁盘缓存->减少磁盘机械操作
数据库缓存->减少文件系统I/O
应用程序缓存->减少对数据库的查询
Web服务器缓存->减少应用服务器请求
客户端浏览器缓存->减少对网站的访问
3. 以Spring为基础的J2EE项目中,一般如何分层?每个层的作用是什么?事务控制放在哪一层?
一般分为持久层(DAO层)、业务层(Service层)、控制层、视图层;
事务一般放在业务层,以一个业务作为一个事务分割的最小单位。
(一) EJB与WebServices部分
1. EBJ是基于哪些技术实现的和JavaBean的区别?
EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现 EJB是一个关于用JAVA语言开发的可部署的服务器端组件的组件体系结构。它是一个技术协议,能使组件运行于任何应用服务器,专门用来解决商务问题JAVABEANS是JAVA类,是由属性、事件和方法组成的JAVA组件,它们可以用来组成JAVA应用程序
Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean
第 187 页 共 188 页
Java高级软件工程师面试题
相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理,客户通过容器来访问真正的EJB组件。
1. Webservice 有什么好处?
跨平台的可互操作性 跨防火墙的通信 应用程序集成 软件和数据重用。
2. 什么是事物处理,J2EE提供哪两种事物处理方式
事务(Transaction)是数据库管理系统提供的基本功能之一,可以把完成用户一个特定工作的一组操作看作是一个不可拆分的工作单元,所以事务也就是作业或任务。
JDBC:支持单一数据库连接事务
JTA:支持分布式事务
3. WEB SERVICE 的理解【大唐动力面试题】
Web Service主要是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。 Web Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL等,所以Web Service可以在任何支持这些标准的环境(Windows,Linux)中使用。注:SOAP协议(Simple Object Access Protocal,简单对象访问协议),它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议。在此协议下,软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性,这有助于大量异构程序和平台之间的互操作性,从而使存在的应用程序能够被广泛的用户访问。
4. J2EE系统访问速度慢.从哪些方面可以优化
J2EE性能的优化包括很多方面的,要达到一个性能优良的系统,除了关注代码之外,还应该根据系统实际的运行情况,从服务器软硬件环境、集群技术、系统构架设计、系统部署环境、数据结构、算法设计等方面综合考虑来优化。一般程序级别的优化首先考虑做数据缓存,数据库方面全做表的切割、数据分区、索引等这些方面来加快对数据的访问。
5. 说说你所知道的应用服务器?
BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,jBoss
6. 什么是J2EE?J2EE是技术还是平台还是框架? 什么是J2EE
答:
Je22是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。
J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。
J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。
第 187 页 共 188 页
Java高级软件工程师面试题
1. 请对以下在J2EE中常用的名词进行解释(或简单描述)
web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。
EJB容器:Enterprise java 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:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。
2. 如何给weblogic指定大小的内存?
在启动Weblogic的脚本中(位于所在Domian对应服务器目录下的startServerName),增加set MEM_ARGS=-Xms32m -Xmx200m,可以调整最小内存为32M,最大200M
3. 如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置?
缺省安装中使用DemoIdentity.jks和DemoTrust.jks KeyStore实现SSL,需要配置服务器使用Enable SSL,配置其端口,在产品模式下需要从CA获取私有密钥和数字证书,创建identity和trust keystore,装载获得的密钥和数字证书。可以配置此SSL连接是单向还是双向的。
4. EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别?
EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。
对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。
第 187 页 共 188 页
Java高级软件工程师面试题
对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。
Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。
1. EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
SessionBean:Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机。当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例。
EntityBean:Entity Beans能存活相对较长的时间,并且状态是持续的。只要数据库中的数据存在,Entity beans就一直存活。而不是按照应用程序或者服务进程来说的。即使EJB容器崩溃了,Entity beans也是存活的。Entity Beans生命周期能够被容器或者 Beans自己管理。
EJB通过以下技术管理实务:对象管理组织(OMG)的对象实务服务(OTS),Sun Microsystems的Transaction Service(JTS)、Java Transaction API(JTA),开发组(X/Open)的XA接口。
2. EJB的几种类型
【参考答案】
会话(Session Bean)Bean ,实体(Entity Bean )Bean 消息驱动的(Message Driven Bean) Bean
会话Bean又可分为有状态(Stateful)和无状态(Stateless)两种。
实体Bean可分为Bean管理的持续性(BMP)和容器管理的持续性(CMP)两种 。
3. Tomcat和WebLogic的区别?【杭州网阙科技】
【参考答案】
1) WLS全面支持J2EE的标准规范和其他标准规范(Web Service, SSL, xml等),同时BEA为众多规范组织的制定者之一,积极参与规范的制定; Tomcat只支持部分J2EE标准,应用局限性强,不能够安全稳定的支持大并发
2) WLS:集群机制,支持分布式的应用;Tomcat:不支持
3) WLS:开发模式下,不用重起部署新Web, EJB应用;Tomcat:不支持
4) WLS收费的应用服务器,支持EJB容器。Tomat开源,但只实现了Web容器,不支持企业级应用。
第 187 页 共 188 页
Java高级软件工程师面试题
(一) 项目管理与设计模式
1. OO设计原则?
单一责任原则、依赖倒置原则、开放封闭原则OCP。
2. 什么情况下,不能用单例模式。
单例模式简单易用,但是也是所有设计模式中最容易滥用的模式。当你的类想得到很好的扩展时,不能使用单例模式。
3. 软件开发的流程是怎样的?【云巢动脉】
需求分析、概要设计、详细设计、编码、测试、交付、验收、维护
4. 描述工厂模式和单例优缺点 举例在什么情况下用。
单例模式优点:
单例 保证一个类只有单一的实例,也就是说你无法通过New来创建这个类的一个新实例 好处:当一个对象在程序内部只能有一个实例的时候,它可以保证我们不会重复创建,而是始终指向同一个对象。 缺点就是 它就是在内存上共享,都可以去访问它,而且多个用户访问的都是同一个实例,会造成线程不安全。
工厂模式优点:
第一,方便系统统一管理与维护,降低组件间耦合。
第二,它让具体的创建实例与客户端分离,客户端是通过它们的抽象接口操纵实例,使得实例名不会出现在客户端代码中。
5. 写适配器模式,观察者模式?【云巢动脉】
适配器模式:
Target:定义Client使用的与特定领域相关的接口
public interface Target
{
void request();
}
Adaptee:现在需要适配的已经存在的接口
public class Adaptee
{
public void specificRequest(){}
}
Adapter:对Adaptee 的接口与Target接口进行适配
public class Adapter implements Target
{
public Adapter(Adaptee adaptee)
{
super();
第 187 页 共 188 页
Java高级软件工程师面试题
this.adaptee = adaptee;
}
public void request()
{
adaptee.specificRequest();
}
private Adaptee adaptee;
}
观察者模式:
Subject:
1. Subject可以加将Observer对象的引用保存在一个聚集中,每个Subject可以有任意个Observer。
2. 提供注册和删除Observer对象的接口。
public interface Subject
{
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
Observer:
1. 为那些在Subject发生改变时需获得通知的对象定义一个更新接口。
public interface Observer
{
public void update();
}
Concrete Subject:
1. 将有关状态存入各 ConcreteObserver对象,当它的状态发生改变时,向它的各个观察者发出通知。
public class ConcreteSubject implements Subject
{
private ArrayList observers;
public ConcreteSubject()
{
observers = new ArrayList();
}
public void registerObserver(Observer o)
{
observers.add(o);
}
public void removeObserver(Observer o)
{
int i = observers.indexOf(o);
if (i >= 0)
{
observers.remove(i);
第 187 页 共 188 页
Java高级软件工程师面试题
}
}
public void notifyObservers()
{
for (int i = 0; i < observers.size(); i++)
{
observer = observers.get(i);
observer.update();
}
}
public void stateChanged()
{
notifyObservers();
}
public void setState()
{
stateChanged();
}}
Concrete Observer:
1. 维护一个指向ConcreteSubject对象的引用。
2. 存储有关状态,这些状态应与Subject的状态保持一致。
3. 实现Observer的更新接口以使自身状态与Subject的状态保持一致。
public class ConcreteObserver implements Observer
{
private Subject subject;
public ConcreteObserver(Subject subject)
{
this.subject = subject;
subject.registerObserver(this);
}
public void update()
{
// your code
}}
1. 适配器模式解释【】
把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类 能够一起工作。适配类可以根据参数返还一个合适的实例给客户端
2. 说说UML
标准建模语言UML。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图。
3. UML中的几种关系?
第 187 页 共 188 页
Java高级软件工程师面试题
依赖,关联,泛化,实现
1. UML几种图及用途?
1) 用例图—描述系统的参与者与用例之间的关系
2) 类图—描述系统中的概念及它们之间的关系
3) 对象图—描述系统中实例及它们之间关系
4) 状态图—描述系统中对象所具备的状态,及触发状态改变的事件
5) 时序图—描述对象之间发送消息的时间顺序
6) 协作图—描述对象之间协作关系
7) 活动图—描述执行过程中涉及的活动及状态变化
8) 组件图—描述系统组件之间的关系
9) 配置图—描述系统的硬件及软件的物理结构
2. 常用的设计模式?说明工厂模式。
Java中的23种设计模式:
Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式),
Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),
Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),
Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),
Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),
Observer(观察者模式), State(状态模式), Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)
工厂模式:
工厂模式是一种经常被使用到的模式,所指的是简单工厂模式,还有另一种工厂方法模式、单例模式,也用到一些工厂模式的思想。工厂模式可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例,这就是工厂模式的实现。
【说明】
设计模式分为三大类:创建型,结构型,行为型。
分别是:
创建型(工厂、工厂方法、抽象工厂、单例)
结构型(包装、适配器,组合,代理)
行为(观察者,模版,策略)
说6、7种即可。
3. DAO设计模式与DELEGATE模式
DAO(Data Access Object)模式实际上是两个模式的组合,即Data Accessor 模式和 Active Domain Object 模式,其中 Data Accessor 模式实现了数据访问和业务逻辑的分离,而Active Domain Object 模式实现了业务数据的对象化封装,一般我们将这两个模式组合使用。
DAO
第 187 页 共 188 页
Java高级软件工程师面试题
模式通过对底层数据的封装,为业务层提供一个面向对象的接口,使得业务逻辑开发员可以面向业务中的实体进行编码。通过引入DAO模式,业务逻辑更加清晰,且富于形象性和描述性,这将为日后的维护带来极大的便利。试想,在业务曾通过Customer.getName方法获得客户姓名,相对于直接通过SQL语句访问数据库表并从ResultSet中获得某个字符型字段而言,哪种方式更加易于业务逻辑的形象化和简洁化?
Business Delegate起到客户端业务抽象化的作用。它抽象化,进而隐藏业务服务的实现。使用Business Delegate,可以降低表示层客户端和系统的业务服务之间的耦合程度。根据实现策略不同,Business Delegate可以在业务服务API的实现中,保护客户端不受可能的变动性影响。这样,在业务服务API或其底层实现变化时,可以潜在地减少必须修改表示层客户端代码的次数。
1. 适配器模式与桥梁模式的区别
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。又称为转换器模式、变压器模式、包装模式(把已有的一些类包装起来,使之能有满足需要的接口)。适配器模式的用意是将接口不同而功能相同或者相近的两个接口加以转换,包括适配器角色补充一些源角色没有但目标接口需要的方法。就像生活中电器插头是三相的,而电源插座是两相的,这时需要一个三相变两相的转换器来满足。
比如,在Java I/O库中使用了适配器模式,象FileInputStream是一个适配器类,其继承了InputStrem类型,同时持有一个对FileDiscriptor的引用。这是将一个FileDiscriptor对象适配成InputStrem类型的对象形式的适配器模式。StringReader是一个适配器类,其继承了Reader类型,持有一个对String对象的引用。它将String的接口适配成Reader类型的接口。等等。
桥梁模式的用意是要把实现和它的接口分开,以便它们可以独立地变化。桥梁模式并不是用来把一个已有的对象接到不相匹配的接口上的。当一个客户端只知道一个特定的接口,但是又必须与具有不同接口的类打交道时,就应该使用桥梁模式。
比如,JDBC驱动器就是一个桥梁模式的应用,使用驱动程序的应用系统就是抽象化角色,而驱动器本身扮演实现化角色。应用系统和JDBC驱动器是相对独立的。应用系统动态地选择一个合适的驱动器,然后通过驱动器向数据库引擎发出指令就可以访问数据库中的数据。
2. 开发中都用到了那些设计模式?用在什么场合?
简单工厂模式、单例模式、观察者模式、适配器模式等。
一、 程序题
1、 请用Java写一个冒泡排序方法
【参考答案】
public static void Bubble(int a[]){
for(int i=0;ii;j--){
if(a[j]=0) { //如果输入的数为正数,位数可能不足32位,要补0;负数肯定是32位
if(str.length()<32) { //二进制不足32位,就在前面补0
int n0 = 32-str.length(); //看差几个0
String temp = "";
for(int i=0;i