华为面试笔试题.pdf

上传人:无*** 文档编号:90864741 上传时间:2023-05-18 格式:PDF 页数:188 大小:14.06MB
返回 下载 相关 举报
华为面试笔试题.pdf_第1页
第1页 / 共188页
华为面试笔试题.pdf_第2页
第2页 / 共188页
点击查看更多>>
资源描述

《华为面试笔试题.pdf》由会员分享,可在线阅读,更多相关《华为面试笔试题.pdf(188页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1.面向对象的特征有哪些方面?1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面0抽象并不打算了解全部问题,而只是选择其中的部分,暂时不用部分细节。抽象包括两个方面,是过程抽象,二是数据抽象。2)继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了 种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派 生 类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。3)封装:封装是把过程和数据

2、包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。4)多态性:多态性是指允许不同类的对象对同消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。2.作用域public,private,protected,以及不写时的区别?区别如下:作用域 当 前 类 同 包 子 孙 类 其 他public V V V Vprotected V V V Xdefault V V X Xprivate V X X X

3、不写时默认为defaulto3.String是最基本的数据类型吗?不是。4.f l o a t 型 f l o a t f=3.4 是否正确?不正确;精度不准确,应该用强制类型转换,如下所示:f l o a t f=(f l o a t)3.4 。5.语 句f l o a t f=1.3;编译能否通过?不能;应该用强制类型转换,如下所示:f l o a t f=(f l o a t)1.3。6.s h o r t s 1 =1;s 1 =s 1 +1;有什么错?s h o r t s 1 =1;s 1 +=1;有什么错?s h o r t s i =1;s i =s i +l;s l +l运算

4、结果是i n t型,需要强制转换类型;s h o r t s i =1;s i +=1;可以正确编译,自动类型提升。7.J a v a 有没有 g o t o?g o t o是j a v a中的保留字,现在没有在j a v a中使用。8.i nt和Int e g e r有什么区别?Ja v a提供两种不同的类型:引用类型和原始类型(或内置类型);i nt是j a v a的原始数据类型,Int e g e r是j a v a为in t提供的封装类。J a v a为每个原始类型提供了封装类:原始类型:b o o l e a n,c h a r,b y t e,s h o r t,i nt,l o

5、ng,f l o a t,d o u b l e封装类型:Bo o l e a n,Ch a r a c t e r*By t e S h o r t,Int e g e r,Lo ng,Fl o a t Do u b l e引用类型和原始类型的行为完全不同,并旦它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为nu l l,而原始类型实例变量的缺省值与它们的类型有关。9.&和&的区别?&是位运算符,表示按位与运算,&是逻辑运算符,表示逻辑与

6、(a nd)。1 0.简述逻辑操作(&,)与条件操作(&)的区别?区别主要有两点:a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型b.逻辑操作不会产生短路。11.heap和stack有什么区别?栈是一种线形集合,其添加和删除元素的操作应在同一段完成,栈按照后进先出的方式进行处理;堆是栈的一个组成元素。12.Math.round(11.5)等于多少?Math.round(-11.5)等于多少?Math.round(11 5)=12 Math.round(-11.5)=-11 round 方法返回与参数最接近的长整数,参 数 加1/2后 求 其flooro13.sw

7、tich是否能作用在b y te 二,是否能作用在long上,是否能作用在String上?switch(exprl)中,exprl 是一个整数表达式。因此传 递 给switch 和case语句的参数应该是in t、short、char 或者byte。long,string 都不能作用于swticho14.编程题:用最有效率的方法算出2乘以8等於几?2 315.数组有没有length。这个方法?Strin有没有length。这个方法?数组没有le n g th ()这个方法,有l e n g t h的属性。S t r i n g有1e n g th ()这个方法。16.在JAVA中,如何跳出当前

8、的多重嵌套循环?在最外层循环前加工a b e l标识,然后用b re a k l a b e l方法即可跳出多重循环。17.构造器 Constructor 是否可被 override?构造擀C onstructor不能被继承,因此不能重写O verriding,但可以被重载Overloading。18.两个对象值相同(x.equals(y)=true),但却可有不同的hash code,这句话对不对?不对,有相同的has h code。19.是否可以继承String类?S t r in g类是f i n a l 类,故不可以继承。20.以下二条语句返回值为tru e 的有:A:bei jin

9、g II=_ bei jin g II;B:bei jin g II.equ als I gn or eC as e(n ew S t r in g(bei jin g II);A 和 B21.我 们 在 w e b 应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?pu blic S t r in g t r an s lat e(S t r in g s t r)S t r in g t em pS t r =n;t r y t em pS t r =n ew S t r in g(s t r.get B y t es(nI S O-8859-

10、lH),nG B KH);t em pS t r =t em pS t r.t r im();cat ch(E x cept ion e)S y s t em.er r.pr in t in(e.get M es s age();)r et u r n t em pS t r;)22.String 和 StringBuffer 的区别?J A V A 平台提供了两个类:S t r in g和 S t r in gB u ffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这 个 Stri ng 类提供了数值不可改变的字符串。而这个S t r i n g B u f f e r 类提供

11、的字符串进行修改。当你知道字符数据要改变的时候你就可以使用S t r in gB u ffer。典型地,你可以 使 用 S t r i n g B u f f e r s 来动态构造字符数据。23.String,StringBuffer StringBuilder 的区别。S t r i n g 的长度是不可变的;StringBuffer的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer 的 toString()方法;线程安全;StringBuilder 是 从 JDK 5 开始,

12、为 StringBuffer 该类补充了一个单个线程使用的等价类;通常应该优先使用StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。24.O verload和 Override的区别。Overloaded的方法是否可以改变返I可值的类型?方法的重写Overriding和重载Overloading是 J a v a 多态性的不同表现。重 写 Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)o 子类的对象使用

13、这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被一屏蔽II 了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)Overloaded 的方法是可以改变返回值的类型。2 5.定义类A 和类B 如下:class A int a=l;double d=2.0;void show()Sy stem,out.print In(Class A:a=,+a+Htd=n+d);)class B extends Afloat a=3.Of;String d=HJava program.;void show()super.show

14、();System.out.printIn(Class B:a=,+a+,td=,+d);)(1)若在应用程序的m a i n 方法中有以下语句:A a=new A();a.show();则输出的结果如何?(2)若在应用程序的m a i n 方法中定义类B 的 对象b:A b=new B();b.show();则输出的结果如何?输出结果为:1)Class A:a=l d=2.0;2)Class A:a=l d=2.0Class B:a=3.0 d=Java program。2 6.描述一下JV M 加裁class文件的原理机制?JVM 中类的装载是由ClassLoader 和它的子类来实现的,

15、Java ClassLoader是一个重要的J a v a 运行时系统组件。它负责在运行时查找和装入类文件的类。27.c h a r 型变量中能不能存贮一个中文汉字?为什么?能够定义成为一个中文的,因 为 j a v a 中 以 unicode编码,一 个 c h a r 占 16个字节,所以放一个中文是没问题的。28.abstract class 和 interface 有什么区别?声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract类的实例。然而可以创建一个

16、变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽象类的变体。新型多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,所有成员变量都是public static f i n a l的。一个类可以实现多个接口,当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为

17、引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口。29.Static Nested Class W Inner Class 的不同?Static Nested Class 是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。30.ja v a 中会存在内存泄漏吗,请简单描述。会:存在无用但可达的对象,这些对象不能被G C 回收,导致耗费内存资源。31.abstract的 method 是 否 可 同 时 是 static,是 否 可 同

18、 时 是 native,是否可同时是synchronized?都不能。32.静态变量和实例变量的区别?静态变量也称为类变量,归全类共有,它不依赖于某个对象,可通过类名直接访问:而实例变量必须依存于某实例,只能通过对象才能访问到它。3 3.是否可以从一个static方法内部发出对非static方法的调用?不可以,如果其中包含对象的method(),不能保证对象初始化。34.写 clone()方法时,通常都有一行代码,是什么?C l o n e有缺省行为:s u p e r.c l o n e O,他负责产生正确大小的空间,并逐位复制。35.GC 是什么?为什么要有GC?GC是垃圾收集的意思(G

19、a b a g e C o l l e c t i o n),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的G C功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,J a v a语言没有提供释放已分配内存的显示操作方法。J a v a程序员不用担心内存管理,因为垃圾收集器会自动进行管理。耍请求垃圾收集,可以调用下面的方法之一:Sy s t e m,g c ()或 Ru n t i m e.g e t Ru n t i m e ().g c ()。36.垃圾回收的优点和原理。并考 虑 2 种回收机制。J a v a语言中一

20、个显著的特点就是引入了垃圾回收机制,使C+程序员最头疼的内存管理的问题迎刃而解,它 使 得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有一作用域I I的概念,只有对象的引用才有一作用域II.垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾网收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。37.垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内

21、存吗?有什么办法主动通知虚拟机进行垃圾回收?对 于G C来说,当程序员创建对象时,G C就开始监控这个对象的地址、大小以及使用情况。通常,G C采用有向图的方式记录和管理堆(h e a p)中的所有对象。通过这种方式确定哪些对象是“可达的”,哪些对象是“不可达的L当GC确定一些对象为“不可达”时,G C就有责任回收这些内存空间。可以。程序员可以手动执行Sy s t e m.g c(),通 知G C运行,但是J a v a语言规范并不保证G C一定会执行。38.String s=new String(xyz II);创建了几个 String Object?两个对象,一个是“x y x”,一个是指

22、向“x y x”的引用对象s。3 9.接 口 是 否 可 继 承 接 口?抽 象 类 是 否 可 实 现(implements)接 口?抽 象 类 是 否 可 继 承 实 体类(concrete class)?接 口 可 以继承接口。抽 象 类 可 以 实 现(i m p l e m e n t s)接 口,抽象类可继承实体类,但前提是实体类必须有明确的构造函数。40.J a v a的 接 口 和C+的虚类的相同和不同处。由 于Java不 支 持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方 法 或 属 性,现有的单继承机制 就 不 能 满 足 要 求。与 继 承 相 比,接口有

23、 更 高 的 灵 活 性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里 面 所 有 的 方 法 和 属 性,并且接口里面的属性在默认状态下面都 是p ub l i c sta ti c,所 有 方 法 默 认 情 况 下 是p ub l i c.一个类可以实现多个接口。41.一 个 一.java II源 文 件 中 是 否 可 以 包 含 多 个 类(不 是 内 部 类)?有 什 么 限 制?可以:必须只有一个类名与文件名相同。4 2.说出一些常用的类,包,接 口,请 各 举5个。常用的类:B uf f e r e d Re a d e r B uf f e r e d

24、 Wr i te r F i l e Re a d e r F i l e Wi r te r Str i n gI n te g e r:常用的包:j a va.l a n g j a va .a wt j a va .i o j a va .uti l j a va.sq l ;常用的接口:Re m o te Li st Ma p D o c um e n t No d e Li st43.Anonymous Inner Class(匿 名 内 部 类)是 否 可 以extends(继 承)其 它 类?是否可以implements(实现)interface(接 口)?可以继承其他类或实现其

25、他接口,在s w i n g编 程 中 常 用 此 方 式。4 4.内部类可以引用他包含类的成员吗?有没有什 么 限 制?个内部类对象可以访问创建它的外部类时象的内容。45.java中实现多态的机制是什么?方法的覆盖O v errid in g 和重载O verloading是 j a v a 多态性的不同表现;覆盖O v e r r i d in g 是父类与子类之间多态性的一,种表现,重载O v erlo a d in g 是一个类中多态性的一种表现。46.在 ja v a 中一个类被声明为final类型,表示了什么意思?表示该类不能被继承,是顶级类。47.下面哪些类可以被继承?1)jav

26、a.lang.Thread(T)2 )ja v a.lang.N um ber(T)3)ja v a.la n g.Double(F)4)jav a.lan g.M ath (F)5)ja v a.lan g.V o id (F)6 )ja v a.la n g.C la s s (F)7)ja v a.la n g.C lassL oader(T)1、2、7可以被继承。48.指出下面程序的运行结果:【基础】class As t a t i c S y s te m.o u t.p rin t(n1);)p u b lic A()S y ste m.o u t.p rin t(n2);)c l

27、a s s B ex tends As t a t i c Syste m.o ut.p r i n t(a );)p ub l i c B()Syste m,o ut.p r i n t(*b*);)p ub l i c c l a ss H e l l o p ub l i c sta ti c vo i d m a i n(Str i n g a r s)A a b =n e w B ();/执行到此处,结果:l a 2 ba b =n e w B();/执行至l j止 匕 处,结果:l a 2 b 2 b)输出结果为l a 2 b 2 b:类 的sta ti c代码段,可以看作是类首次

28、加载(虚拟机加载)执行的代码,而对于类加载,首先要执行其基类的构造,再执行其本身的构造。4 9.继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?父类:p a c k a g e te st;p ub l i c c l a ss F a th e r c l a ss p ub l i c F a th e r C l a ss()Syste m.o ut.p r i n tI n (F a th e r C l a ss C r e a te *);)子类:p a c k a g e te st;i m p o r t te st.F a th e r C l a ss;p u

29、b l i c c l a ss C h i l d C l a ss e xte n d s F a th e r C l a ss p ub l i c C h i l d C l a ss()Syste m.o ut.p r i n t i n (C h i l d C l a ss C r e a te*);)public static void main(String args)FatherClass fc=new Fatherclass();ChildClass cc=new ChildClass();)输出结果为:FatherClass CreateFatherClass Cre

30、ateChildClass Create5 0.内部类的实现方式?示例代码如下:package test;public class OuterClass private class InterClass public InterClass()System.out.printin(nInterClass Create);)public OuterClass()InterClass ic=new InterClass();System.out.printin(*OuterClass Create11);public static void main(String args)OuterClass o

31、c=new OuterClass();)输出结果为:InterClass CreateOute r C l a ss C r e a te5 1.关于内部类:public class OuterClass private double d1=1.0;/insert code here)You need to insert an inner class declaration at line 3,Which two inner class declarationsare valid?(Choose two.)A.class lnnerOnepublic static double methoda

32、()return d1;)B.public class lnnerOne?static double methoda()return d1;)C.private class lnnerOnedouble methoda()return d1;)D.static class lnnerOneprotected double methoda()return d1;)E.abstract class lnnerOnepublic abstract double methoda();答案为C、E:说明如下:1)静态内部类可以有静态成员,而非静态内部类则不能有静态成员;故 4、B错;2)静态内部类的非静

33、态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;故D错;3)非静态内部类的非静态成员可以访问外部类的非静态变量;故C正确。5 2.数据类型之间的转换:1)如何将数值型字符转换为数字?2)如何将数字转换为字符?3)如何取小数点前两位并四舍五入?1)调用数值类型相应包装类中的方法parse*(String)或 valueOf(String)即可返回相应基本类型或包装类型数值;2)将数字与空字符串相加即可获得其所对应的字符串;另外对于基木类型数字还可调用 String 类中的valueOf(,)方法返回相应字符串,而对于包装类型数字则可调用其toString()方法获得相应字符串;3)

34、可.用该数字构造一 java.math.BigDecimal对象,再利用其round。方法进行四舍五入到保留小数点后两位,再将其转换为字符串截取最后两位。53.字符串操作:如何实现字符串的反转及替换?可用字符串构造一 StringBuffer 对象,然后调用StringBuffer 中 的 reverse方法即可实现字符串的反转,调 用 replace方法即可实现字符串的替换。54.编码转换:怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?示例代码如下:String si=你好”;String s2=new String(si.getBytes(GB2312),ISO-8

35、859-1);55.写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。函数代码如下:public String split(String str,int chars)int n=(str.length()+chars-1)/chars;String ret =new Stringn;for(int i=0;in;i+)if(i n-1)reti=str.substring(i*chars,(i+1)*chars);elser e t i=s t r.s u b s trin g(i*c h a rs);)re tu rn r e t;)5 6.写一个函数,2个参数,1 个字符串

36、,1 个字节数,返回裁取的字符串,要求字符串中的中文不能出现乱码:如(一 我 ABO II,4)应该截为一我ABII,输入(一我A B C 汉 DEF II,6)应该输出为一我 ABC II而不是一我ABC+汉的半个II opublic String substring(S trin g s t r,in t subB ytes)in t b y te s=0;/用来存储字符中的总字节数fo r(in t i=0;i s t r.le n g th ();i+)i f (b y tes=subB ytes)re tu rn s t r.s u b s trin g(0,i);)char c=s

37、 t r.c h a rA t(i);i f (c 0);/t h r o ws a n A sse r t i o n e r r o r i f a 那么如同上例这题也是错的。但这里修改的是。的 member vairable(成员变量),而。的reference并没有改变。81.class Something int i;public void doSomethingQ System.out.printlnfi=+i);有什么错呢?看不出来啊正确输出的是i=0。int i 属 於 instant variable(实例变量,或叫成员变量)0 instantvariable 有 defau

38、lt value。int 的 default value 是 0。82.class Something final inti;public void doSomethingQ System.out.println(i=+i);和上面一题只有一个地方不同,就是多了一个fin a L 这难道就错了吗?错。final int i 是 个 final的 instant variable(实例变量,或叫成员变量)。final的instant variable 没有 default value.必须在 constructor(构造器)结束之前被赋予一个明确的值。可以修改为“final int i=0;。8

39、3.public class Something public static void main(String args)Something s=new Something();System.out.println(ns.doSomething()returns +doSomethingQ);publicString doSomethingQ return Dosomething 看上去很完美。错。看上去在main里 call doSomething没有什么问题,毕竟两个methods都在同一个class 里。但仔细看,main 是 static 的。static method不能直接 cal

40、l non-static methodSo 可改成System,out.println(s.doSomething()returns +s.doSomething();*同理,static method 不能访问 non-static instant variable。8 4.此处,Something 类的文件名叫 OtherThing.javaclass Something private static voidmain(String something_to_do)System.out.println(Do something.,);这个好像很明显。正确c 从来没有人说过Java的 Cla

41、ss名字必须和其文件名相同。但 public class的名字必须和文件名相同。85.interface A int x=0;class B int x=1;class C extendsB implements A public voidpX()System.out.println(x);public static void main(String args)new C().pX();错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x 调用,两 个 x都匹配(就象在同时import java.util和 java.sql两个包时直接声明Date 一 样)。对于父类

42、的变量,可以用super.x来明确,而接口的属性默认隐含为public static final.所以可以通过A.x来明确。带格式的:项目符号和编号3 L Hibernate 部分86.在数据库中条件查询速度很慢的时候,如何优化?1.建索引2.减少表之间的关联3.优 化 sql,尽 量让sql很快定位数据,不 要 让 sql做全表查询,应该走索弓I,把数据量大的表排在前面4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返I 可少量数据87.在 hibernate中进行多表查询,每个表中各取几个字段,也就是说杳询出来的结果集并没有一个实体类与之对应,如何解决这个问题?解决方案一,按

43、照 Object 口数据取出数据,然后自己组bean解决方案二,对每个表的bean写构造函数,比如表一要查出fieldl,field2两个字段,那么有一个构造函数就是 Bean(typel f iledl,type2field2),然后在h q l 里面就可以直接生成这个bean 了。具体怎么用请看相关文档,我说的不是很清楚。88.session.Ioad()fll session.get()的区别Session,load/get方法均可以根据指定的实体类和i d 从数据库读取记录,并返回与之对应的实体对象。其区别在于:如果未能发现符合条件的记录,get 方法返回null而 load 方法会抛

44、出一个ObjectNotFoundExceptionLoad方法可返回实体的代理类实例,而 get方法永远直接返回实体类。load方法可以充分利用内部缓存和二级缓存中的现有数据,而 get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。Session在加载实体对象时,将经过的过程:首先,Hibernate中维持了两级缓存。第一级缓存由 Session实例维护,其中保持了 Session当前所有关联实体的数据,也称为内部缓存。向第二级缓存则存在于S e s s i o n F a c t o r y层次,由当前所有由本S e s s i o n

45、 F a c t o r y构造的S e s s i o n实例共享。出于性能考虑,避免无谓的数据库访问,S e s s i o n在调用数据库查询功能之前 工 会先在缓存中进行查询。首先在第级缓存中,通过实体类型和i d进行查找,如果笫一级缓存查找命中,且数据状态合法,则宜接返回。之后,S e s s i o n会在当前一N o n E x i s t s I I记 录 中 进 行 找,如果一N o n E x i s t s I I记录中存在同样的查询条件,则返回n u l l o -N o n E x i s t s I I记录了当 前S e s s i o n实例在之前所有查询操作中,

46、未能查询到有效数据的查询条件(相当于,个查询黑名单列表)。如此一来,如 果S e s s i o n中个无效的查询条件重复出现,即可迅速作出判断,从而获得最佳的性能表现。对 于l o a d方法而言,如果内部缓存中未发现有效数据,则查询第二级缓存,如果第二级缓存命中,则返回。如在缓存中未发现有效数据,则发起数据库查询操作(S e l e c t S Q L),如经过查询未发现对应记录,则将此次查i旬的信息在一N o n E x i s t s II中加以记录,并返回n u l l o根据映射配置和S e l e c t S Q L得到的R e s u l t s e t,创建对应的数据对象。将

47、其数据对象纳入当前S e s s i o n实体管理容器(一级缓存)。执行 I n t e r c e p t o r.o n L o a d 方 法(如果有对应的 I n t e r c e p t o r)。将数据对象纳入二级缓存。如果数据对象实现了 L i f e C y c l e接口,则调用数据对象的o n L o a d方法。89.Hibernate的主键生成机制1)a s s i g n e d主键由外部程序负责生成,无 需H i be r n a t e参与。2)h i l o通 过h i/l o算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。3)s e q h

48、 i l o与hilo类似,通 过h i/l o算法实现的主键生成机制,只是主键历史状态保存在S e q u e n c e中,适用于支持S e q u e n c e的数据库,如O r a c l e。4)increment主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1 作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。5)identity采用数据库提供

49、的主键生成机制。如 DB2、SQL Server,MySQL中的主键生成机制。6)sequence采用数据库提供的sequence机制生成主键。如 O ralce中 的 Sequence67)native由 Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。8)uuid.hex由 Hibernate基于1 2 8 位唯一值产生算法生成1 6 进制数值(编码后以长度3 2 的字符串表示)作为主键。9)uuid.string与 uuid.hex类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQ

50、L)。10)foreign使用外部表的字段作为主键。般而言,利 用 uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。这 1 0 中生成0ID标识符的方法,increment 比较常用,把标识符生成的权力交给Hibernate处理.但是当同时多个Hibernate应用操作同个数据库,甚至同一张表的时候.就推荐使用identity依赖底层数据库实现,但是数据库必须支持自动增长,当然针对不同的数据库选择不同的方法.如果你不能确定你使用的数据库具体支持什么的情况卜,可以选择用native让Hibernate 来帮选择 identity,sequence,hilo.另外由于常用的数据库,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁