2023年java面试题大全(整理版).docx

上传人:夺命阿水 文档编号:546282 上传时间:2023-08-21 格式:DOCX 页数:22 大小:64.96KB
返回 下载 相关 举报
2023年java面试题大全(整理版).docx_第1页
第1页 / 共22页
2023年java面试题大全(整理版).docx_第2页
第2页 / 共22页
2023年java面试题大全(整理版).docx_第3页
第3页 / 共22页
2023年java面试题大全(整理版).docx_第4页
第4页 / 共22页
2023年java面试题大全(整理版).docx_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《2023年java面试题大全(整理版).docx》由会员分享,可在线阅读,更多相关《2023年java面试题大全(整理版).docx(22页珍藏版)》请在课桌文档上搜索。

1、2023年java面试题大全(整理版)1、面对对象的特征有哪些方面?-抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细微环节是什么。-继承:继承是从已有类得到继承信息创建新类的过程。供应继承的类叫父类(超类、基类)、得到继承的类叫子类(派生类)。-封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。可以说,封装就是隐藏一切可隐藏的东西,只向外界供应最简洁的编程接口(可以想想一般洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简洁;我们现在运用的智能手机也是

2、封装得足够好的,因为几个按键就搞定了全部的事情)。-多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简洁的说就是用同样的对象引用调用同样的方法但是做了不同的事情。实现多态须要做两件事:1).方法重写(子类继承父类并重写父类中的方法);2).对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会依据子类对象的不同而表现出不同的行为)2、访问修饰符PUbIiePriVagPrOteCted,以及不写(默认)时的区分?修饰符当前类同包子类其他包publicprotecteddefaultprivateX修饰符当前类同包 子类其他包3、String是最基本的数据类型吗?

3、答:不是。JaVa中的基本数据类型只有8个:byte、shortxintsIongxfloatsdouble,charxboolean;除了基本类型(primitivetype)和枚举类型(enumerationtype),剩下的都是引用类型(referencetype)o4、floatf=3.4;是否正确?答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化汾造成精度损失因此须要强制类型转换floatf=(float)3.4;或者写成foatf=3.4F5、shortsi=1;si=si+1;有错吗?Shortsi

4、=1;si+=1;有错吗?答:对于shortsi=1;si=si+1;由于1是int类型,因此sl+1运算结果也是int型,须要强制转换类型才能赋值给ShOrt型。而ShOrtSl=1;si+=1;可以正确编译因为si+=L相当于Sl=(short)(sl+1);其中有隐含的强制类型转换。6、int和Integer有什么区分?答:Java是一个近乎纯净的面对对象编程语言,但是为了编程的便利还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(Wr叩Perclass),int的包装类就是Integer,从Java5起先引入了自动装

5、箱/拆箱机制,使得二者可以相互转换。class AutoUnboxingTest public static void main(String Integer a = new Integer(3);Integer b = 3;int c = 3;System.out.println(a = b);System.out.println(a = c);比较)args) 将3自动装箱成工nteger类型/ false两个引用没有引用同一对象/ true a自动拆箱成int类型再和C最近还遇到一个面试题,也是和自动装箱和拆箱有点关系的,代码如下所示:publicclassTest03publicsta

6、ticvoidmain(Stringargs)Integerfl=100,f2=100,f3=150,f4=150;System.out.printin(fl=f2);System.out.printin(f3=f4);)假如不明就里很简洁认为两个输出要么都是true要么都是falseo首先须要留意的是flJ2xf3、f4四个变量都是Integer对象引用,所以下面的二二运算比较的不是值而是引用。装箱的本质是什么呢?当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valuefpublicstaticIntegervaluef(inti)if(i=Intege

7、rCache.low&i=IntegerCache.high)returnIntegerCache.cachei+(-IntegerCache.low);returnnewInteger(i);简洁的说,假如整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是干脆引用常量池中的Integer对象,所以上面的面试题中fl=f2的结果是true,而f3=f4的结果是false。7、&和&的区分?虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true&之所以称为短路运算是因为,假如&左边的表达式的值是false,右边的表达式会被干脆短路掉,不会进行运算

8、。许多时候我们可能都须要用&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:USername!=null&!USemame.equals(),二者的依次不能交换,更不能用&运算符,因为第一个条件假如不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异样。留意:逻辑或运算符和短路或运算符(II)的差别也是如此。8、说明内存中的栈(StaCk)、堆(heap)和静态区(StatiCarea)的用法。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间Stringstr=newString(hello);上面的语句中

9、变量Str放在栈上,用new创建出来的字符串对象放在堆上,而hello这个字面量放在静态区。9、Math.round(11.5)等于多少?Math.round(11.5)等于多少?答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。10、switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?expr可以是byte、short、Char、int、enumxString类型,但是Iong类型不能11,用最有效率的方法计算2乘以8?答:23(左移3位相当于乘以2的3次

10、方,右移3位相当于除以2的3次方)。12、数组有没有Iength()方法?String有没有Iength()方法?答:数组没有Iength()方法,有length的属性。String有IengthO方法。JavaScript中f获得字符串的长度是通过length属性得到的,这一点简洁和Java混淆。13、构造器(constructor)是否可被重写(override)?答:构造器不能被继承,因此不能被重写,但可以被重载。14、两个对象值相同(xequals(y)=true),但却可有不同的hashcode这句话对不对?答:不对,假如两个对象X和y满意.equals(y)=true,它们的哈希码

11、(hashcode)应当相同。Java对于eqauls方法和HashCode方法是这样规定的:假如两个对象相同(equals方法返回true),那么它们的KashCode值肯定要相同;假如两个对象的hashCOde相同,它们并不肯定相同15、是否可以继承String类?答:String类是final类,不行以被继承。16、当一个对象被当作参数传递到一个方法后,此方法可变更这个对象的属性,并可返回变更后的结果,那么这里究竟是值传递还是引用传递?答:是值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程

12、中被变更,但对对象引用的变更是不会影响到调用者的17、Stringf11StringBuiIder.StringBlIffer的区分?答:Java平台供应了两种类型的字符串:String和StringBufferZStringBuiIder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被变更的。而StringBufferZStringBuiIder类表示的字符串对象可以干脆进行修改。StringBUilder是JaVa5中引入的,它和StringBUffer的方法完全相同,区分在于它是在单线程环境下运用的,因为它的全部方面都没有被sync

13、hronized修饰,因此它的效率也比StringBUffer要高。18、重载(OVeHoad)和重写(Override)的区分。重载的方法能否依据返回类型进行区分?答:方法的重载和重写都是实现多态的方式,区分在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法假如有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异样(里氏代换原则)。重载对返回类型没有特别的要求。19.描述一下JVM加载clas

14、s文件的原理机制?答:JVM中类的装载是由类加载器(CIassLoader)和它的子类来实现的,Java中的类加载器是一个重要的JaVa运行时系统组件,它负责在运行时查找和装入类文件中的类。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件20、抽象类(abstractclass)和接口(interface)有什么异同?答:抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类假如继承了某个抽象类或者实现了某个接口都须要对其中的抽象方法全部进行实现,否则该类仍旧须要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可

15、以有抽象方法和详细方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是PriVate、默认、protected.PUbIiC的,而接口中的成员全都是PUbliC的。抽象类中可以定义成员变量,而接口中定义的成员变量事实上都是常量。有抽象方法的类必需被声明为抽象类,而抽象类未必要有抽象方法。21、Java中会存在内存泄漏吗,请简洁描述。答:理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛运用于服务器端编程的一个重要缘由);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。例如hiberna

16、te的Session(-级缓存)中的对象属于长久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,假如不刚好关闭(close)或清空(flush)一级缓存就可能导致内存泄22、GC是什么?为什么要有GC?答:GC是垃圾收集的意思,垃圾回收可以有效的防止内存泄露,有效的运用可以运用的内存23、StringS=newString(xyz);创建了几个字符串对象?答:两个对象,一个是静态区的xyz,一个是用new创建在堆上的对象。24、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承详细类(concreteclass)?答:

17、接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承详细类也可以继承抽象类。25、Java中的final关健字有哪些用法?答:(1)修饰类:表示该类不能被继承;(2)修饰方法:表示方法不能被重写;(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。26、指出下面程序的运行结果。lassAstaticSystem.out.print(l);)publicA()System.out.print(2);)lassBextendsAstaticSystem.out.print(a);publicB()System.out.print(b);)ublic

18、classHellopublicstaticvoidmain(Stringargs)Aab=newB();ab=newB();)答:执行结果:Ia2b2b创建对象时构造器的调用依次是:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最终调用自身构造器。27、数据类型之间的转换:- 如何将字符串转换为基本数据类型?- 如何将基本数据类型转换为字符串?答:- 调用基本数据类型对应的包装类中的方法ParSeXXX(String)或VaIUeC)f(String)即可返回相应基本类型;- 一种方法是将基本数据类型与空字符串()连接(+)即可获得其所对应的字符串;另一种方法是调用String类

19、中的ValUeOf()方法返回相应字符串28、如何实现字符串的反转及替换?答:方法许多,可以自己写实现也可以运用String或StringBuffer/StringBuilder中的方法。有一道很常见的面试题是用递归实现字符串反转,代码如下所示:publicstaticStringreverse(StringoriginStr)if(originStr=nulloriginStr.length()=1)returnoriginStr;returnreverse(originStr.substring(l)+originStr.charAt();)29、怎样将GB2312编码的字符串转换为ISO

20、-88591编码的字符串?答:代码如下所示:StringSl=你好;Strings2=newString(sl.getBytes(GB2312),IS0-8859-l);30、利用java.text.DataFormat的子类(如SimpIeDateFormat类)中的format(Date)方法可将日期格式化classDateFormatTestpublicstaticvoidmain(Stringargs)SimpleDateFormatOldFormatter=newSimpleDateFormat(yyyy/MM/dd);Datedatel=newDate();System.out.p

21、rintin(oldFormatter.format(datel);)31、比较一下Java和JavaSciprtoja%f是静态语言,js是动态语言-基于对象和面对对象:JaVa是一种真正的面对对象的语言,即使是开发简洁的程序,必需设计对象;JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的困难软件。它是一种基于对象(ObjeCt-BaSed)和事务驱动(Event-Driven)的编程语言,因而它本身供应了特别丰富的内部对象供设计人员运用。-说明和编译:Java的源代码在执行之前,必需经过编译。JavaScript是一种说明性编程语言,其源代码不需经过编译,由阅

22、读器说明执行。(目前的阅读器几乎都运用了JIT(即时编译)技术来提升JavaScript的运行效率)-强类型变量?口类型弱变量:JaVa采纳强类型变量检查,即全部变量在编译之前必需作声明;JaVaSCriPt中变量是弱类型的,甚至在运用变量前可以不作声明,JavaScript的说明器在运行时检查推断其数据类型。- 代码格式不一样。32、try里有一个return语句,那么紧跟在这个try后的finally。里的代码会不会被执行,什么时候被执行,在return前还是后?答:会执行,在方法返回调用者前执行。在fi八al中变更返回值的做法是不好的,因为假如存在fi八a/e代码块,Wg中的七仇语句不会

23、立马返回调用者,而是记录下返回值待fi八a/也代码块执行完毕之后再向调用者返回其值,然后假如在RkH也中修改了返回值,就会返回修改后的值33、列出一些你常见的运行时异样?答:- ArithmeticException(算术异样)- ClassCastException(类转换异样)- IllegaIArgumentException(非法参数异样)- IndexoutofBoundsException(下标越界异样)- NullPointerException(空指针异样)-SecurityException(平安异样)34、类ExampIeA继承Exception,类ExampIeB继承Ex

24、ampIeAo有如下代码片断:trythrownewExampleB(,b)catch(EXamPIeAe)System.out.println(ExampleA);catch(Exceptione)System.out.printin(Exception,);)请问执行此段代码的输出是什么?答:输出:ExampIeA0(依据里氏代换原则能运用父类型的地方肯定能运用子类型,抓取ExampIeA类型异样的catch块能够抓住try块中抛出的ExampIeB类型的异样)面试题-说出下面代码的运行结果。(此题的出处是Uava编程思想一书)classAnnoyanceextendsExceptionc

25、lassSneezeextendsAnnoyanceclassHumanpublicstaticvoidmain(Stringargs)throwsExceptiontrytrythrownewSneeze();catch(Annoyancea)System.out.printin(CaughtAnnoyance);throwa;catch(Sneezes)System.out.println(,CaughtSneeze);return;)finallySystem.out.printin(HelloWorld!);)输出:CaugktA八八Og八CCCaughtSneezeHelloWorl

26、d!javaviewplaincopy1.try(2. thrownewAnnoyance();3. catch(Sneezes)4. System.out.println(CaughtSneeze);5. return;6. finally7. System.out.println(HelloWorld!);8. 输出:(父类班SW出来的异样,子类并没有捕获到)HelloVJorld!Exceptionmthread,mam0cok.xq.excqW。八STVmogMceatco3.xq.excep力。八川认(EXCePti。八TestJ:工4)Uavaviewplaincopy1.try2

27、. thrownewAnnoyance();3. catch(Sneezes)4. System.out.println(CaughtSneeze);5. return;6. catch(Exceptione)7. System.out.println(CaughtException);8. return;9. finally10. System.out.println(HelloWorld!);11. )输出:(既然子类捕获不了,那就运用EXCePtEO,可以看到结果如下:CaughtExceptionHeHOVJorld!35、List、Set、Map是否继承自Collection接口?答

28、:List、Set是,M叩不是。M叩是键值对映射容器,与List和Set有明显的区分,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。36、Collection和Collections的区分?答:Collection是一个接口,它是Set,List等容器的父接口;Collections是个一个工具类,供应了一系列的静态方法来协助容器操作,这些方法包括对容器的搜寻、排序、线程平安化等等。37、List、Map、Set=介接口存取元素时,各有什么特点?答:LiSt以特定索引来存取元素,可以有重复元素。Set不能存放重复元

29、素用对象的equals。方法来区分元素是否重复)。MaP保存键值对(key-valuepair)映射,映射关系可以是一对一或多对一38、Thread类的sleep()方法和对象的Waito方法都可以让线程暂停执行,它们有什么区分?答:SIeePo方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依旧保持,因此休眠时间结束后会自动复原。wait()是ObjeCt类的方法,调用对象的Wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(waitpool),只有调用对象的notify()方法(

30、或notifyAII()方法)时才能唤醒等待池中的线程进入等锁池(lockpool),假如线程重新获得对象的锁就可以进入就绪状态。39、线程的SIeeP()方法和yield。方法有什么区分?答:SIeePo方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yied()方法只会给相同优先级或更高优先级的线程以运行的机会;线程执行SIeeP()方法后转入堵塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;SIeePo方法声明抛出IntemJPtedEXCePtion,而yield()方法没有声明任何异样;SIeePo方法比yield。方法

31、(跟操作系统CPU调度相关)具有更好的可移植性。40、当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?答:不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁假如已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(留意不是等待池哦)中等待对象的锁。41、请说出与线程同步以及线程调度相关的方法。答:- wait():使一个线程处于等待(堵塞)状态,并且释放所持有的对象的锁;- sleep():使一个正在运行的线程处于睡

32、眠状态,是一个静态方法,调用此方法要处理InterruptedException异样;- notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能准确的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关;- notityAII():唤醒全部处于等待状态的线程,该方法并不是将对象的锁给全部线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;42、编写多线程程序有几种实现方式?答:一种是继承Thread类;另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,举荐运用后者,因为Java中的继承是单继承,一个类有一个父类,

33、假如继承了Thread类就无法再继承其他类了,明显运用Runnable接口更为敏捷。43、synchronized关犍字的用法?答:synchronized关键字可以将对象或者方法标记为同步,以实现对对象和方法的互斥访问可以用SynChroniZed(对象)定义同步代码块或者在声明方法时将SynChrOniZed作为方法的修饰符。44、举例说明同步和异步。答:假如系统中存在临界资源(资源数量少于竞争资源的线程数量的资源),例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就必需进行同步存取(数据库操作中的排他锁就是最好的例子)。当应用程序在对象上

34、调用了一个须要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应当运用异步编程,在许多状况下采纳异步途径往往更有效率。事实上,所谓的同步就是指堵塞式操作,而异步就是非堵塞式操作。45、简述SynChrOniZedf11java.util.concurrent.locks.Lock?答:Lock是Java5以后引入的新的API,和关键字synchronized相比主要相同点:Lock能完成synchronized所实现的全部功能;主要不同点:Lock有比synchronized更精确的线程语义和更好的性能,而且不强制性的要求肯定要获得锁。synchronized会自动释放锁,而Lo

35、ck肯定要求程序员手工释放,并且最好在finally块中释放(这是释放外部资源的最好的地方)46、事务的ACID是指什么?答:-原子性(AtomiC):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;- 一样性(COnSiStent):事务结束后系统状态是一样的;- 隔离性(Is。Iated):并发执行的事务彼此无法看到对方的中间状态;- 长久性(DUrabie):事务完成后所做的改动都会被长久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。47、获得一个类的类对象有哪些方式?答:- 方法1:类型.class,例如:Stringxlass-

36、方法2:对象.getClass(),例如:hello.getClass()- 方法3:Class.forName(),例如:ClaSS.forName(java.IangString)48、简述一下面对对象的“六原则一法则”。答:-单一职责原则:一个类只做它该做的事情。(单一职责原则想表达的就是高内聚,写代码最终极的原则只有六个字”高内聚、低耦合,就犹如葵花宝典或辟邪剑谱的中心思想就八个字欲练此功必先自宫”,所谓的高内聚就是一个代码模块只完成一项功能,在面对对象中,假如只让一个类完成它该做的事,而不涉及与它无关的领域就是践行了高内聚的原则,这个类就只有单一职责。我们都知道一句话叫因为专注,所以

37、专业,一个对象假如担当太多的职责,那么注定它什么都做不好。这个世界上任何好的东西都有两个特征,一个是功能单一,好的相机肯定不是电视购物里面卖的那种一个机器有一百多种功能的,它基本上只能照相;另一个是模块化,好的自行车是组装车,从减震叉、刹车到变速器,全部的部件都是可以拆卸和重新组装的,好的乒乓球拍也不是成品拍,肯定是底板和胶皮可以拆分和自行组装的,一个好的软件系统,它里面的每个功能模块也应当是可以轻易的拿到其他系统中运用的,这样才旨实现软件复用的目标。)- 开闭原则:软件实体应当对扩绽开放,对修改关闭。(在志向的状态下,当我们须要为一个软件系统增加新功能时,只须要从原来的系统派生出一些新类就可

38、以,不须要修改原来的任何一行代码。要做到开闭有两个要点:抽象是关键,一个系统中假如没有抽象类或接口系统就没有扩展点;封装可变性,将系统中的各种可变因素封装到一个继承结构中,假如多个可变因素混杂在一起,系统将变得困难-依靠倒转原则:面对接口编程。-里氏替换原则:任何时候都可以用子类型替换掉父类型。(关于里氏替换原则的描述,BarbaraLiskov女士的描述比这个要困难得多,但简洁的说就是能用父类型的地方就肯定能运用子类型。里氏替换原则可以检查继承关系是否合理,假如一个继承关系违反了里氏替换原则,那么这个继承关系肯定是错误的,须要对代码进行重构。例如让猫继承狗,或者狗继承猫,又或者让正方形继承长

39、方形都是错误的继承关系,因为你很简洁找到违反里氏替换原则的场景。须要留意的是:子类肯定是增加父类的实力而不是削减父类的实力,因为子类比父类的实力更多,把实力多的对象当成实力少的对象来用当然没有任何问题。)-接口隔离原则:接口要小而专,绝不能大而全。(臃肿的接口是对接口的污染,既然接口表示实力,那么一个接口只应当描述一种实力,接口也应当是高度内聚的。例如,琴棋书画就应当分别设计为四个接口,而不应设计成一个接口中的四个方法,因为假如设计成一个接口中的四个方法,那么这个接口很难用,终归琴棋书画四样都精通的人还是少数,而假如设计成四个接口,会几项就实现几个接口,这样的话每个接口被复用的可能性是很高的。

40、JaVa中的接口代表实力、代表约定、代表角色,能否正确的运用接口肯定是编程水平凹凸的重要标识。)-合成聚合复用原则:优先运用聚合或合成关系复用代码。-迪米特法则迪米特法则又叫最少学问原则,一个对象应当对其他对象有尽可能少的了解。(迪米特法则简洁的说就是如何做到低耦合,门面模式和调停者模式就是对迪米特法则的践行。对于门面模式可以举一个简洁的例子,你去一家公司洽谈业务,你不须要了解这个公司内部是如何运作的,你甚至可以对这个公司一窍不通,去的时候只须要找到公司入口处的前台美女,告知她们你要做什么,她们会找到合适的人跟你接洽,前台的美女就是公司这个系统的门面。再困难的系统都可以为用户供应一个简洁的门面

41、,JavaWeb开发中作为前端限制器的SerVIet或FiIter不就是一个门面吗,阅读器对服务器的运作方式一窍不通,但是通过前端限制器就能够依据你的恳求得到相应的服务。调停者模式也可以举一个简洁的例子来说明,例如一台计算机,CPU、内存、硬盘、显卡、声卡各种设备须要相互协作才能很好的工作,但是假如这些东西都干脆连接到一起,计算机的布线将异样困难,在这种状况下,主板作为一个调停者的身份出现,它将各个设备连接在一起而不须要每个设备之间干脆交换数据,这样就减小了系统的耦合度和困难度,如下图所示。迪米特法则用通俗的话来将就是不要和生疏人打交道,假如真的须要,找一个自己的挚友,让他替你?口生疏人打交道

42、。)49、简述一下你了解的设计模式。答:所谓设计模式,就是一套被反复运用的代码设计阅历的总结(情境中一个问题经过证明的一个解决方案)。运用设计模式是为了可重用代码、让代码更简洁被他人理解、保证代码牢靠性几个常用的设计模式:-工厂模式:工厂类可以依据条件生成不同的子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作(多态方法)。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑究竟返回的是哪一个子类的实例。代理模式:给Y对象供应R理对象,并由代理对象限制原对象的引用。-适配器模式:把一个类的接口变换成客户端所期盼的另一种接口,从而使原本因

43、接口不匹配而无法在一起运用的类能够一起工作。-单例模式:一个类只有一个实例,即一个类只有一个对象实例。懒汉式单例模式,线程担心全,致命的是在多线程不能正常工作publicclassSingletonprivatestaticSingletoninstance=null;privateSingleton()publicstaticsynchronizedSingletongetlnstance()if(instance=null)instance=newSingleton();returninstance;)饿汉式单例模式,避开了多线程的同步问题publicclassSingletonpriva

44、teSingleton()privatestaticSingletoninstance=newSingleton();publicstaticSingletongetlnstance()returninstance;)50、用JaVa写一分冒泡排序。for(inti=0;iarr.IengthT;i+)/外层循环限制排序趟数for(intj=0;jarrj+l)inttemp=arrj;arrj=arrj+l;arrj+1=temp;51、用JaVa写一个二分查找。非递归实现:publicstaticintbiSearch(intarray,inta)intlo=0;inthi=array.l

45、ength-1;intmid;while(lo=hi)mid=(lo+hi)/2;if(arraymid=a)returnmid+1;elseif(arraymida)lo=midl;elsehi=mid-l;return-1;)递归实现:publicstaticintsort(intarray,inta,intlo,inthi)if(loarraymid)returnsort(array,a,mid+1zhi);elsereturnsort(array,a,lozmid-l);return-1;)52、Servlet的运行过程?Web容器加载Serv(况并将其实例化后,Scrv(况生命周期起

46、先,容器运行其证队)方法进行Servfet的初始化;恳求到达时调用Seirvlet的SCrViCeO方法,SCrVi()方法会依据须要调用与恳求对应的4。Get或doPost等方法;当服务器关闭或项目被卸载时服务器会将ScWIct实例销毁,此时会调用SCM况的deog0方法。S3、转发(forward)和重定向(redirect)的区分?答:forward是容器中限制权的转向,是服务器恳求资源,服务器干脆访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给阅读器,阅读器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。redirect就是服务器端依据逻辑,发送一个状态码,告知阅读器重新去恳求那个地址,因此从阅读器的地址栏中可以看到跳转后的链接地址,很明显direct无法访问到服务器爱护起来资源,但是可以从一个网站redirect到其他网站。forw4d更加高效,所以在满意须要时尽量运用forward(通过调用R

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号