java程序员面试常见问题

上传人:灯火****19 文档编号:110011457 上传时间:2022-06-17 格式:DOCX 页数:14 大小:56.31KB
收藏 版权申诉 举报 下载
java程序员面试常见问题_第1页
第1页 / 共14页
java程序员面试常见问题_第2页
第2页 / 共14页
java程序员面试常见问题_第3页
第3页 / 共14页
资源描述:

《java程序员面试常见问题》由会员分享,可在线阅读,更多相关《java程序员面试常见问题(14页珍藏版)》请在装配图网上搜索。

1、1. 你对面向对象的理解?我的思路是:回答时从面向对象的三大特征回答。包括三个特征:继承、封装、多态。类的继承性是指从已有的一个类来 extends子类,子类具有了父类的所有特征,同时,子类也可以 有新的特性。比如:人是一个类,男人具有了人类的所有的特性,比如思考,比如劳动。同时,男 人也有新的特性,比如男人会长胡子。类的封装是指类把所有的操作都封闭起来,仅仅提供接口出来让其他人使用,使用的人没有必要懂 得类里面的操作,只需要懂得操作接口就可以了。比如开汽车,我们只需要懂得方向盘、刹车、油门等等的使用就可以了,没有必要知道刹车是如何构成的封闭好的操作。同时,封装也提高了程序 的可替换性。比如两

2、个汽车公司实现刹车的方式不一样,但是,只要我们学会了使用刹车,那么,开两个汽车公司的车就都没有问题了,我们不需要考虑他们怎样实现刹车这门技术的。类的多态性是一个对象的某项功能可以处理不同类型的问题,或者一个子类可以将父类的某个功能 替换成新的功能,具体到编程的方面来说实现类的多态有override和overload ,也就是重写和重载同时面向对象还有一个很重要的概念:抽象。抽象就是一个事物的本质。当然对于本质,不同的角度却会有不同的理解。男人,在和女人一起的时候,它的本质是人。在和所有的生物一起的时候, 它的本质是动物。(虽然哲学家都说事物的本质只有一个,但是,我仍然坚持我的观点)2. jav

3、a中String 类为什么要设计成final呢??不允许其他类继承。这个应该不是最终原因,但这里权且也当成是一个原因。? String类中的成员属性也几乎 都设计成了 private final的,这样String就被设计成一个不变类, 这样有助于共享,提高性能。可以将字符串对象保存在字符串常量池中以供与字面值相同字符串对象共享。如果String对象是可变的,那就不能这样共享,因为一旦对某一个String类型变量引用的对象值改变,将同时改变一起共享字符串对象的其他String类型变量所引用的对象的值。? String被设计为不变类,其中的 offset , value口都被设计成private

4、 final的,这样在多线程时, 对String对象的访问是可以保证安全的。java程序语言的许多特性依赖于不可变的String对象3. 说说Hashpmap勺原理?HashMap既述HashMa前基于哈希表的 Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用 null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。?HashMapB勺数据结构在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMa独不例外。HashMa像际上是一个“链表散列的数据结构,即数组和链表的结合体

5、。HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMa由勺时候,就会初始化一个数组。4. 什么是AOP1 .概念介绍:所谓 AOP即Aspect orientiedprogram,就是面向方面的编程,2 .什么是方面:所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调 用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未 来的可操作性和可维护性。3 .Aop的原理:面向切面编程,将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。4 .实现AOP的技术,主要分为两大

6、类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行; 二是采用静态织入的方式,引入特定的语法创建方面”,从而使得编译器可以在编译期间织人有关方面”的代码5. IOC控制反转也叫依赖注入。利用了工厂模式将对象交给容器管理,你只需要在spring配置文件中配置相应的bean,以及设置相关的属性,让 spring容器来生成类的实例对象以及管理对象。6. 数据库触发器的优缺点以及用法触发器本质上讲就是事件监控器,可以定义在数据库系统进行某一个操作的前后。当数据库系统在进行特定的操作时,发现有触发器定义,就去执行触发器定义的功能,从而满足某些特定的需要。(触发器就是

7、你在做某个操作的时候触发另外一个操作)例如,在更新某些数据后,再去更新特定的数据。这就可以定义一个触发器完成这样的需要。触发器的优点:以事件方式来处理.当数据发生变化的时候,自动作处理。缺点:当数据库之间 导出导入的时候,可能会引起不必要的触发逻辑。7. oracle,mysql,SqlServer三种数据库的分页查询的实例MySql:MySQ擞据库实现分页比较简单,提供了LIMIT函数。一般只需要直接写到 sql语句后面就行了。LIMIT子句可以用来限制由SELEC印句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定返回的第一行在所有数据中的位置,从 0开始(注意不

8、是1),第二个参数指定最多返 回行数。例如:select* fromtableWHERE-LIMIT10; #返回前10行select* fromtableWHERE-LIMIT0,10; #返回前10行select* fromtableWHERE-LIMIT10,20; 腿回第10-20行数据Oracle :考虑mySql中的实现分页,select * from表名limit开始记录数,显示多少条;就可以实现我们的分页效果。但是在oracle中没有limit 关键字,但是有 rownum字段rownum是一个伪列,是oracle系统自动为查询返回结果的每行分配的编号,第一行为1,第二行为2,

9、以此类推。第一种:代码如下:SELECT* FROM(SELECTA.*, ROWNURNFROM(SELECT* FROMTABLE_NAMEAWHEREOWNUM= 40)WHEREN = 21其中最内层的查询SELECT* FROMTABLE_NAME示不进行翻页的原始查询语句。ROWNU=21控制分页查询的每页的范围。上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHEREOWNUM= 40这句上。选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNU

10、M= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERROWNU祚40语句,在查询的最外层控制分页的最小值和最大值。第二种:代码如下:select * from (select e.*,rownum r from (select * from emp order by saldesc) e) e1 where e1.r21 and e1.r(SELECTMAX(id)FROM(SELECTTOP20 idFROMTestTableORDERBYid) AST)ORDERBYIDSELECTTOP 页大小 *FROMTestTableWHERE(ID(SELEC

11、TMAX(id)FROM(SELECTTOP 页大小* 页数 idFROM 表ORDERBYid) AST)ORDERBYID分页方案三:(利用SQL的游标存储过程分页) 代码如下:create procedure XiaoZhengGe sqlstr nvarchar(4000),-查询字符串currentpage int, 一第 N 页 pagesize int 一每页行数 as set nocount ondeclare P1 int, -P1 是游标的 idrowcount intexec sp_cursoropen P1 output,sqlstr,scro110Pt=1,ccopt

12、=1,rowcount=rowcountoutputselect ceiling(1.0*rowcount/pagesize) as 总页数-,rowcount as 总行数,currentpage as 当 前页set currentpage=(currentpage -1)*pagesize+1exec sp_cursorfetch P1,16,currentpage,pagesizeexec sp_cursorclose P1 set nocount off其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。建议优化的时候,加上主键和索引,查询效率会提高。通过SQL查

13、询分析器,显示比较:结论是:分页方案二:(利用ID大于多少和SELECTTO吩页)效率最高,需要拼接 SQL语句分页方案一:(利用Not In和SELECTTO吩页)效率次之,需要拼接 SQL语句分页方案三:(利用SQL的游标存储过程分页)效率最差,但是最为通用 在实际情况中,要具体分析。8. 静态变量和实例变量的区别?在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配 空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码

14、,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总 之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。9. abstract class 和 interface 有什么区别?含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有 abstract方法的类必 须定义为abstract class, abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类

15、中 的所有抽象方法,那么子类也必须定义为abstract类型。接口(infas)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法 定义默认为public abstract类型,接口中的成员变量类型默认为public static final 下面比较一下两者的语法区别:1 .抽象类可以有构造方法,接口中不能有构造方法。2 .抽象类中可以有普通成员变量,接口中没有普通成员变量3 .抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方 法。4 .抽象类中的抽象方法的访I可类型可以是public, protected 但接口中的抽象方法只能是

16、public类型的,并且默认即为 public abstract类型。5 .抽象类中可以包含静态方法,接口中不能包含静态方法6 .抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。7 . 一个类可以实现多个接口,但只能继承一个抽象类。下面接着再说说两者在应用上的区别:接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实 现方面发挥作用,可以实现代码的重用。10. abstract的method是否可同时是s

17、tatic, 是否可同时是native ,是否可同时是 synchronized?都不是。理由如下:abstract的method不可以是static的,因为抽象的方法是要被子类实现的,而 static与子类扯不上关native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以, 它也不能是抽象的,不能与 abstract混用。11. synchronized应该是作用在一个具体的方法上才有意义。而且,方法上的synchr0mzed同步所使用的同步锁对象是this ,而抽象方法上无法确定this是什么。12. Java中的异常处理机制的简单原理和应用。异常是指j

18、ava程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有 异常的信息。Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为 java.lang.Throwable, Throwable下面又派生了两个子类:Error和Exception, Error表不应用程序本身无法Exception克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线

19、程死锁等系统问题。表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的 问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题 下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界( ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastExceptio;普通异常是运行环境的变化或 异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序 不应该死掉java为系统异常和普通异常提

20、供了不同的解决方案,编译器强制普通异常必须try.catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try.catch处理或用throws声明,所以系统异常也称为 unchecked异常。13. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?分几种情况:1 .其他方法前是否加了 synchronized关键子,如果没加,则能。2 .如果这个方法内部调用了wait,则可以进入其他synchronized方法。3 .如果其他个方法都加了 ”.。论可关

21、键字,并且内部没有调用wait,则不能。4 .如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态 的方法用的是this。14. List 和 Map 区别?List是存储单列数据的集合,Map是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。15. List、Map Set三个接口,存取元素时,各有什么特点?首先,List与Set具有相似性,它们都是单列元素的集合,所以,它们有一个功共同的父接口,叫 Collection Set里面不允许有重复的元素,所

22、谓重复,即不能有两个相等(注意,不是仅仅是相同)的对 象。Set取元素时,没法说取第几个,只能以 Iterat0r接口取得所有的元素,再逐一遍历各个元素。List表示有先后顺序的集合,注意,不是那种按年龄、按大小、按价格之类的排序。当我们多次调用add(Obje)方法时,每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。有时候, 也可以插队,即调用add(int index,Obje)方法,就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进List中,每调用一次add方法,这个对象就被插入进集合中一次,其实,并不是把这个对象 本身存储进了集合中,而是在集合中用一个索

23、引变量指向这个对象,当这个对象被add多次时,即相当于集合中有多个索引指向了这个对象,如图x所示。List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get0ndex0来明确说明取第几个。Map与List和Set不同,它是双列的集合,其中有put方法,定义如下:put(obj key,obj value),每次 存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按 equals比较相等。取则可以 根据key获得相应的value,即get(Object key浮回彳置为key所对应的value0另外,也可以获得所有的key 的结合,

24、还可以获得所有的value的结合,还可以获得key和value组合成的Map.Entry对象的集合。List以特定次序来持有元素,可有重复元素。Set无法拥有重复元素,内部排序。Map保存key-value值,value可多值。16. 说出一些常用的类,包,接口,请各举5个要让人家感觉你对javaee开发很熟,所以,不能仅仅只列corejava中的那些东西,要多列你在做 $金项目中涉及的那些东西。就写你最近写的那些程序中涉及的那些类。常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integerjava.util.

25、Date,System,Class List,HashMap常用的包:java.lang java.io java.util java.sql ,javax.servlet,org.apache.strtuts.action,org.hibernate常用的接口: Remote List Map Document NodeList ,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、 Session(Hibernate),HttpSession17. JS可口 Servlet有哪些相同点和不同点,他们之间

26、的联系是什么?JSP是Servlet技术的扩展,本质上是 Servlet的简易方式,更强调应用的外表表达。JSP编译后是“类servlet Servlet和JsPR主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表小层中 的HTML里分离开来。而JSP的情况是1村2和HTML可以组合成一个扩展名为.jsp的文件。jsP则重于视图, Servlet主要用于控制逻辑。18. 你们的项目总金额多少,多少人开发,总共花了多少个月?像巴巴运动网这种规模的项目,可以说是4、5个人、开发了 4、5个月,费用则是4、50万。按每人每月两万收入去计算,就差不多了。19. 你们公司使用的代

27、码配置管理工具是什么?除了说以前使用cvs,现在新项目使用svn 了,还简要说一下使用的过程,如果有可能,还说说仓库 的概念和如何使用锁之类的细节。20. Struts2的工作流程1、客户端浏览器发出 http请求。2、根据 web.xml配置,该请求被 FilterDispatcher接收。3、根据struts.xml配置,找到需要调用的 Action类和方法, 并通过10c方式,将值注入给 Aciton4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。6、返回http

28、响应到客户端浏览器。SpringMVCW Struts2 的比较:机制:spring mvc的入口是servlet ,而struts2 是filter ,这样就导致了二者的机制不同,这里就牵涉 到servlet 和filter 的区别了。性能:spring 会稍微比struts快。spring mvc是基于方法的设计,而 sturts是基于类,每次发一次请求 都会实例一个action ,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把 request数据注入进去

29、,在 spring3 mvc中,一个方法对应一个 request上下文。而struts2 框架是类级 别的拦截,每次来了请求就创建一个Action ,然后调用setter getter方法把request中的数据注入;struts2 实际上是通过 setter getter 方法与request打交道的;struts2 中,一个 Action 对象对应一个 request 上下文。参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。设计思想上:struts更加符合oop的编程思想,spring就比较谨慎,在servlet上扩展。intercepter

30、 的实现机制:有 以自己的interceptor 机制,spring mvc用的是独立的 AOP式。这样导致struts的配置文件 量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC!实比struts2高。spring mvc是方法级别的拦截,一个方法对应一个 request上下文,而方法同时又跟一个url对应,所以说从架构本身上 spring3 mvc就容易实现restfulurl。struts2 是类级别的拦截,一个类对应一个request上下文;实现restful url要费劲,因为stru

31、ts2 action的一个方法可以对应一个 url ;而其类属性却被所有方法共享,这也就无法用注解或其他 方式标识其所属方法了。spring3mvc的方法之间 基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而 struts2 搞的就比较乱, 虽然方法之间 也是独立的,但其所有 Action变量是共享的,这不会影响程序运行,却给我们编码,读程 序时带来麻烦。总结:Strutl目前已经很少再用,个人感觉 springMVC在易用性上要优于 struts2.struts2 和springMVC 在性能方面是不分

32、伯仲,每个阵营都有自己的测试数据,很难说哪一个更优秀。以上资料部分摘自网络, 尊重原作者版权,分享给更多的读者。Hibernate 与 MyBatis 的比较第一章 Hibernate 与 MyBatisHibernate是当前最流行的 O/R mapping框架,它出身于 ,现在已经成为 Jboss的一部分。 Mybatis是另外一种优秀的 O/R mapping框架。目前属于 apache的一个子项目。1.1 Hibernate 简介Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了 POJ的数据库表之间的映射,以及 SQL的自动生成和执行

33、。程序员往往只需定义好了POJC数据库表的映射关系,即可通过Hibernate提供的方法完成持久层操作。程序员甚至不需要对SQL的熟练掌握,Hibernate/OJB会根据制定的存储逻辑,自动生成对应的SQL并调用JDB%口加以执行。1.2 MyBatis 简介iBATIS的着力点,则在于POJO1 $、之间的映射关系。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO相对Hibernate “O/R而言,旧ATIS是一种“ Sql Mapping”的OR睢现。第二章开发对比开发速度Hibernate的真正掌握要比 Mybatis来得难些。Mybatis框架相对简单

34、很容易上手,但也相对简陋些。 个人觉得要用好 Mybatis还是首先要先理解好 Hibernate。开发社区Hibernate与Mybatis都是流行的持久层开发框架,但 Hibernate开发社区相对多热闹些,支持的工 具也多,更新也快,当前最高版本 4.1.8 o而Mybatis相对平静,工具较少,当前最高版本3.2。开发工作量Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。针对高级查询,Mybatis需要手动编写SQ曲句,以及 ResultMap。而Hibernate有良好的映射机制, 开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。

35、第三章系统调优对比Hibernate的调优方案1. 制定合理的缓存策略;2. 尽量使用延迟加载特性;3. 采用合理的Session管理机制;4. 使用批量抓取,设定合理的批处理参数( batch_size );5. 进行合理的O/R映射设计Mybatis调优方案MyBatis在Session方面和Hibernate的Session生命周期是一致的,同样需要合理的Session管理机制。MyBatis同样具有二级缓存机制。MyBatis可以进行详细的SQ优化设计。SQK化方面Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询

36、的字段,但这样就破坏了Hibernate开发的简洁性。而 Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。Hibernate HQL语句的调优需要将SQL打印出来,而Hibernate的SQL被很多人嫌弃因为太丑了。MyBatis的SQL是自己手动写的所以调整方便。但 Hibernate具有自己的日志统计。Mybatis本身不带日志统计,使用Log4j进行日志记录。扩展性方面Hibernate与具体数据库的关联只需在 XMLt件中配置即可,所有的HQ曲句与具体使用的数据库无关,移植性很好。MyBatis项目中所有的SQL语句都是依赖所用的数据库的,所以不同数据库类型的支持 不

37、好。第四章对象管理与抓取策略对象管理Hibernate是完整的对象/关系映射解决方案,它提供了对象状态管理( state management的功能, 使开发者不再需要理会底层数据库系统的细节。也就是说,相对于常见的JDBC/SQL持久层方案中需要管理SQL语句,Hibernate采用了更自然的面向对象的视角来持久化Java应用中的数据。换句话说,使用 Hibernate的开发者应该总是关注对象的状态(state ),不必考虑SQL语句的执 行。这部分细节已经由Hibernate掌管妥当,只有开发者在进行系统性能调优的时候才需要进行了解。而MyBatis在这一块没有文档说明,用户需要对对象自己

38、进行详细的管理抓取策略Hibernate对实体关联对象的抓取有着良好的机制。对于每一个关联关系都可以详细地设置是否延迟加载,并且提供关联抓取、查询抓取、子查询抓取、批量抓取四种模式。它是详细配置和处理的。而Mybatis的延迟加载是全局配置的。第五章缓存机制对比Hibernate 缓存Hibernate 一级缓存是Session缓存,利用好一级缓存就需要对Session的生命周期进行管理好。建议在一个Action操作中使用一个Session。一级缓存需要对 Session进行严格管理。Hibernate二级缓存是SessionFactory 级的缓存。SessionFactory 的缓存分为内

39、置缓存和外置缓存。内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据及预定SQL语句等),对于应用程序来说,它是只读的。外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备。二级缓存称为进程级缓存或SessionFactory 级缓存,它可以被所有 session共享,它的生命周期伴随着SessionFactory的生命周期存在和消亡。MyBatis 缓存MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。MyBatis 3中的缓存实现的很多改进都已经实现了,使得它更加

40、强大而且易于配置。默认情况下是没有开启缓存的,除了局部的session缓存,可以增强变现而且处理循环依赖也是必须的。要开启二级缓存,你需要在你的SQLM射文件中添加一行:字面上看就是这样。这个简单语句的效果如下:1. 映射语句文件中的所有select语句将会被缓存。2. 映射语句文件中的所有insert,update 和delete语句会刷新缓存。3. 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。4. 根据时间表(比如no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序来刷新。5. 缓存会存储列表集合或对象(无论查询方法返回什么

41、)的1024个引用。6. 缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。所有的这些属性都可以通过缓存元素的属性来修改。比如:这个更高级的配置创建了一个 FIFO缓存,并每隔60秒刷新,存数结果对象或列表的 512个引用,而且返 回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会导致冲突。可用的收回策略有,默认的是LRU:1. LRU最近最少使用的:移除最长时间不被使用的对象。2. FIFO先进先出:按对象进入缓存的顺序来移除它们。3. SOFT 软引用:移除基于垃圾回收器状态和

42、软引用规则的对象。4. WEAK 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。readOnly(只读)属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安

43、全,因此默认是false 。相同点Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或 为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。不同点Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且 Mybatis可以在命名空间中共享相同的缓存配置和实例,通过 Cache-ref来实 现。两者比较因为Hibernate对查询对象有着良好的管理机制

44、,用户无需关心 SQL所以在使用二级缓存时如果出 现脏数据,系统会报出错误并提示。而MyBatis在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围, 避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。第六章Hibernate与Mybatis对比总结两者相同点? Hibernate 与 MyBatis 都可以是通过 SessionFactoryBuider 由 XML配置文件生成 SessionFactory , 然后由SessionFactory 生成Session ,最后由Session来开启执行事务和 SQL语句。其中 Sessio

45、nFactoryBuider , SessionFactory , Session 的生命周期都是差不多的。? Hibernate 和 MyBatis 都支持 JDBC JTA事务处理。Mybatis 优势? MyBatis可以进行更为细致的 SQL优化,可以减少查询字段。? MyBatis容易掌握,而Hibernate 门槛较高。 Hibernate 优势Hibernate的DAO1开发比MyBatis简单,Mybatis需要维护SQL和结果映射。Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。Hibernate数据库移植性很好,MyBatis的数据库

46、移植性不好,不同的数据库需要写不同SQLHibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。他人总结Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对 Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发 速度很快,非常爽。Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好 Hibernate方面需要你的经验和能力都很强才行。iBATIS入门简单,即学即用,提供了数据库查

47、询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。iBATIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数 据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。21. Servlet一,什么是 Servlet ?Servlet是一个Java编写的程序,此程序是基于Http协议的,在服务器端运行的(如tomcat),是按照Servlet规范编写的一个Java类。二,Servlet有什么作用?主要是处理客户端的请求并将其结果发送到客户端。三,Servlet的生命周期?Servlet的生

48、命周期是由Servlet的容器来控制的,它可以分加载、实例化、初始化、处理客户请求和卸载 五个阶段。四,Servlet怎么处理一个请求?当用户发送一个请求到某个 Servlet的时候,Servlet容器会创建一个ServletRequst和ServletResponse对象。 在ServletRequst对象中封装了用户的请求信息,然后 Servlet容器把ServletRequst和ServletResponse对象 传给用户所请求的Servlet,Servlet把处理好的结果写在ServletResponse中,然后Servlet容器把响应结果 传给用户。五,Servlet与JSP有什么区

49、别?1,jsp经编译后就是servlet,也可以说jsp等于servlet。2, jsp更擅长页面(显示)。servlet更擅长逻辑编辑。(最核心的区别)。3,在实际应用中采用 Servlet来控制业务流程,而采用js诽生成动态网页.在stzts框架中,JSP于MVC 设计模式的视图层,而Servlet位于控制层。六,Servlet里的cookie技术?80kies是一种 WEB服务器通过浏览器在访问者的硬盘上存储信息的手段,是由 Netscape公司开发出来的。cookie技术的好处:1, Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站 点

50、。2, Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径。22. cookie 和 session 的区别具体来说cookie机制采用的是在客户端保持状态的方案,而 session机制采用的是在服务器端保持状态 的方案。? cookie数据存放在客户的浏览器上,session数据放在服务器上。? cookie不是很安全,别人可以分析存放在本地的COOKlEHt行COOKI欺骗考虑到安全应当使用session 。? session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务 器性能方面,应当使用 COOKIE? 单个cookie保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存20个cookie。?所以个人建议:将登陆信息等重要信息存放为SESSION其他信息如果需要保留,可以放在COOKIE

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!