Java常见面试题集及答案13876.docx
Java常见面试题集及答案找工作要面面试,有面面试就有对对付面试的的办法。以以下一些题题目来自业业内朋友痛痛苦的面试试经历,提提这些问题题的公司包包括IBMM, E*Tradde, SSiebeel, MMotorrola, SUNN,以及其其它大小公公司。面试是是没什么道道理可讲的的,它的题题目有的不不合情理、脱脱离实际。有有在纸上写写的,有当当面考你的的,也有在在电话里问问的,给你你IDE的的估计很少少(否则你你赶快去买买彩票,说说不定中)。所以如如果你看完完此文后,请请不要抱怨怨说这些问问题都能用用IDE来来解决。你你必须在任任何情况下下准确回答答这些问题题,在面试试中如果出出现一两题题回答不准准确很有可可能你就被被拒之门外外了。当然这这些都是JJava的的基本题,那那些面试的的人大多数数不会问你你Hibeernatte有多先先进,Ecclipsse的三个个组成部分分,或coommannd deesignn pattternn,他们都都是老一辈辈了,最喜喜欢问的就就是基础知知识。别小小看了这些些基础,我我朋友水平平一流,结结果就栽在在一到基础础知识的问问题下,和和高薪无缘缘。好了废废话少说,开开始正题。问:第一,谈谈谈finnal, finaally, finnalizze的区别别。最常被被问到。第二,AAnonyymouss Innner CClasss (匿名名内部类)是否可以以exteends(继承)其其它类,是是否可以iimpleementts(实现现)intterfaace(接接口)?第第三,Sttaticc Nessted Classs和Innner Classs的不同同,说得越越多越好(面试题有有的很笼统统)。第四,&&和&&的的区别。这个问问得很少。第五,HHashMMap和HHashttablee的区别。常问。第六,CColleectioon和Coollecctionns的区别别。你千万万别说一个个是单数一一个是复数数。第七,什什么时候用用asseert。APII级的技术术人员有可可能会问这这个。第八,GGC是什么么?为什么么要有GCC? 基础础。 第第九,Sttringg s = neww Strring("xyzz");创创建了几个个Striing OObjecct? 第第十,Maath.rroundd(11.5)等於於多少? Mathh.rouund(-11.55)等於多多少? 第第十一,sshortt s1 = 1; s1 = s11 + 11;有什么么错? sshortt s1 = 1; s1 += 11;有什么么错?面试试题都是很很变态的,要要做好受虐虐的准备。第十二二,sleeep()和waiit()有有什么区别别?搞线程程的最爱。第十三三,Javva有没有有gotoo?很十三三的问题,如如果哪个面面试的问到到这个问题题,我劝你你还是别进进这家公司司。第十四四,数组有有没有leengthh()这个个方法? Striing有没没有lenngth()这个方方法? 第十十五,Ovverlooad和OOverrride的的区别。OOverlloadeed的方法法是否可以以改变返回回值的类型型?常问。第十六六,Sett里的元素素是不能重重复的,那那么用什么么方法来区区分重复与与否呢?是是用=还还是equuals()?它们们有何区别别? 第十十七,给我我一个你最最常见到的的runttime exceeptioon。如果你你这个答不不出来,面面试的人会会认为你没没有实际编编程经验。第十八八,errror和eexcepptionn有什么区区别? 第十十九,Liist, Set, Mapp是否继承承自Colllecttion接接口? 第二二十,abbstraact cclasss和intterfaace有什什么区别?常问。第二十十一,abbstraact的mmethood是否可可同时是sstatiic,是否否可同时是是natiive,是是否可同时时是synnchroonizeed? 第二二十二,接接口是否可可继承接口口?抽象类类是否可实实现(immplemmentss)接口?抽象类是是否可继承承实体类(conccretee claass)? 第二二十三,启启动一个线线程是用rrun()还是sttart()?第二二十四,构构造器Coonstrructoor是否可可被oveerridde? 第二二十五,是是否可以继继承Strring类类? 第二二十六,当当一个线程程进入一个个对象的一一个synnchroonizeed方法后后,其它线线程是否可可进入此对对象的其它它方法? 第二二十七,ttry 里有一一个retturn语语句,那么么紧跟在这这个tryy后的fiinallly 里的coode会不不会被执行行,什么时时候被执行行,在reeturnn前还是后后? 第二十十八,编程程题:用最最有效率的的方法算出出2乘以88等於几?有C背景景的程序员员特别喜欢欢问这种问问题。第二十十九,两个个对象值相相同(x.equaals(yy) = truue),但但却可有不不同的haash ccode,这这句话对不不对? 第三十十,当一个个对象被当当作参数传传递到一个个方法后,此此方法可改改变这个对对象的属性性,并可返返回变化后后的结果,那那么这里到到底是值传传递还是引引用传递? 第三十十一,swwtichh是否能作作用在byyte上,是是否能作用用在lonng上,是是否能作用用在Strring上上? 第三十十二,编程程题:写一一个Sinngletton出来来。 好先先说这么一一些。答:第第一,谈谈谈finaal, ffinallly, finaalizee的区别。finnal修饰符(关关键字)如如果一个类类被声明为为finaal,意味味着它不能能再派生出出新的子类类,不能作作为父类被被继承。因因此一个类类不能既被被声明为aabstrract的的,又被声声明为fiinal的的。将变量量或方法声声明为fiinal,可可以保证它它们在使用用中不被改改变。被声声明为fiinal的的变量必须须在声明时时给定初值值,而在以以后的引用用中只能读读取,不可可修改。被被声明为ffinall的方法也也同样只能能使用,不不能重载。finallly再异常处处理时提供供finaally块块来执行任任何清除操操作。如果果抛出一个个异常,那那么相匹配配的cattch子句句就会执行行,然后控控制就会进进入finnallyy块(如果果有的话)。finnalizze方法名。JJava技技术允许使使用finnalizze()方方法在垃圾圾收集器将将对象从内内存中清除除出去之前前做必要的的清理工作作。这个方方法是由垃垃圾收集器器在确定这这个对象没没有被引用用时对这个个对象调用用的。它是是在Objject类类中定义的的,因此所所有的类都都继承了它它。子类覆覆盖finnalizze()方方法以整理理系统资源源或者执行行其他清理理工作。ffinallize()方法是是在垃圾收收集器删除除对象之前前对这个对对象调用的的。第二,AAnonyymouss Innner CClasss (匿名名内部类)是否可以以exteends(继承)其其它类,是是否可以iimpleementts(实现现)intterfaace(接接口)? 匿名的的内部类是是没有名字字的内部类类。不能eextennds(继继承)其它它类,但一一个内部类类可以作为为一个接口口,由另一一个内部类类实现。第三,SStatiic Neestedd Claass和IInnerr Claass的不不同,说得得越多越好好(面试题题有的很笼笼统)。Nessted Classs(一般般是C+的说法),IInnerr Claass (一般是JJAVA的的说法)。JJava内内部类与CC+嵌套套类最大的的不同就在在于是否有有指向外部部的引用上上。具体可可见htttp: / 注:静静态内部类类(Innner CClasss)意味着着1创建一一个staatic内内部类的对对象,不需需要一个外外部类对象象,2不能能从一个sstatiic内部类类的一个对对象访问一一个外部类类对象第四四,&和&&&的区别别。&是位位运算符。&&&是布尔尔逻辑运算算符。第五,HHashMMap和HHashttablee的区别。都属于于Map接接口的类,实实现了将惟惟一键映射射到特定的的值上。HasshMapp类没有分分类或者排排序。它允允许一个nnull键键和多个nnull值值。Hasshtabble类似似于HasshMapp,但是不不允许nuull键和和nulll值。它也也比HasshMapp慢,因为为它是同步步的。第六,CColleectioon和Coollecctionns的区别别。Colllecttionss是个jaava.uutil下下的类,它它包含有各各种有关集集合操作的的静态方法法。Colllecttion是是个javva.uttil下的的接口,它它是各种集集合结构的的父接口。第七,什什么时候用用asseert。断言是一个个包含布尔尔表达式的的语句,在在执行这个个语句时假假定该表达达式为trrue。如如果表达式式计算为ffalsee,那么系系统会报告告一个Assserttioneerrorr。它用于于调试目的的:asssert(a > 0); / tthrowws ann Asssertiionerrror if aa <= 0 断言言可以有两两种形式:asssert Exprressiion1 ; asssertt Exppresssion11 : EExpreessioon2 ; Exppresssion11应该总是是产生一个个布尔值。Exppresssion22可以是得得出一个值值的任意表表达式。这这个值用于于生成显示示更多调试试信息的SStrinng消息。断言在在默认情况况下是禁用用的。要在在编译时启启用断言,需需要使用ssourcce 1.4标记:javvac -sourrce 11.4 TTest.javaa 要在运运行时启用用断言,可可使用-eenablleasssertiions或或者-eaa标记。要在运运行时选择择禁用断言言,可使用用-da或或者-diisablleasssertiions标标记。要系统统类中启用用断言,可可使用-eesa或者者-dsaa标记。还还可以在包包的基础上上启用或者者禁用断言言。可以在在预计正常常情况下不不会到达的的任何位置置上放置断断言。断言言可以用于于验证传递递给私有方方法的参数数。不过,断断言不应该该用于验证证传递给公公有方法的的参数,因因为不管是是否启用了了断言,公公有方法都都必须检查查其参数。不不过,既可可以在公有有方法中,也也可以在非非公有方法法中利用断断言测试后后置条件。另另外,断言言不应该以以任何方式式改变程序序的状态。第八,GGC是什么么?为什么么要有GCC? (基基础)。GC是是垃圾收集集器。Jaava程序序员不用担担心内存管管理,因为为垃圾收集集器会自动动进行管理理。要请求求垃圾收集集,可以调调用下面的的方法之一一:Sysstem.gc() Runntimee.gettRunttime().gcc() 第九,SStrinng s = neew Sttringg("xyyz");创建了几几个Strring Objeect? 两个对对象,一个个是"xyyx",一一个是指向向"xyxx"的引用用对象s。 第十,Maath.rroundd(11.5)等於於多少? Mathh.rouund(-11.55)等於多多少? Matth.roound(11.55)返回(llong)112,Maath.rroundd(-111.5)返返回(loong)-11; 第十一,sshortt s1 = 1; s1 = s11 + 11;有什么么错? sshortt s1 = 1; s1 += 11;有什么么错? shortt s1 = 1; s1 = s11 + 11;有错,ss1是shhort型型,s1+1是innt型,不不能显式转转化为shhort型型。可修改改为s1 =(shhort)(s1 + 1) 。shhort s1 = 1; s1 += 1正正确。 第十二,ssleepp() 和和 waiit() 有什么区区别? 搞搞线程的最最爱sleeep()方法是使使线程停止止一段时间间的方法。在在sleeep 时间间间隔期满满后,线程程不一定立立即恢复执执行。这是是因为在那那个时刻,其其它线程可可能正在运运行而且没没有被调度度为放弃执执行,除非非(a)""醒来"的的线程具有有更高的优优先级 (b)正在在运行的线线程因为其其它原因而而阻塞。waiit()是是线程交互互时,如果果线程对一一个同步对对象x 发发出一个wwait()调用,该该线程会暂暂停执行,被被调对象进进入等待状状态,直到到被唤醒或或等待时间间到。 第十三,JJava有有没有gooto? Gottojavaa中的保留留字,现在在没有在jjava中中使用。 第十四,数数组有没有有lenggth()这个方法法? Sttringg有没有llengtth()这这个方法?数组没没有lenngth()这个方方法,有llengtth的属性性。Strring有有有lenngth()这个方方法。 第十五,OOverlload和和Overrridee的区别。OOverlloadeed的方法法是否可以以改变返回回值的类型型? 方法的的重写Ovverriidingg和重载OOverlloadiing是JJava多多态性的不不同表现。重重写Oveerridding是是父类与子子类之间多多态性的一一种表现,重重载Oveerloaadingg是一个类类中多态性性的一种表表现。如果果在子类中中定义某方方法与其父父类有相同同的名称和和参数,我我们说该方方法被重写写 (Ovverriidingg)。子类类的对象使使用这个方方法时,将将调用子类类中的定义义,对它而而言,父类类中的定义义如同被""屏蔽"了了。如果在在一个类中中定义了多多个同名的的方法,它它们或有不不同的参数数个数或有有不同的参参数类型,则则称为方法法的重载(Overrloadding)。Oveerloaaded的的方法是可可以改变返返回值的类类型。 第十六,SSet里的的元素是不不能重复的的,那么用用什么方法法来区分重重复与否呢呢? 是用用=还是是equaals()? 它们们有何区别别? Sett里的元素素是不能重重复的,那那么用itterattor()方法来区区分重复与与否。eqqualss()是判判读两个SSet是否否相等。equuals()和=方法决定定引用值是是否指向同同一对象eequalls()在在类中被覆覆盖,为的的是当两个个分离的对对象的内容容和类型相相配的话,返返回真值。 第十七,给给我一个你你最常见到到的runntimee excceptiion。 CODE: CCopy to cclipbboardd _ArithhmetiicExcceptiion, ArraayStooreExxcepttion, BuffferOOverfflowEExcepptionn, BuufferrUndeerfloowExcceptiion, CannnotReedoExxcepttion, CannnotUUndoEExcepptionn, CllassCCastEExcepptionn, CMMMExcceptiion, ConccurreentMoodifiicatiionExxcepttion, DOMMExceeptioon, EEmptyyStacckExcceptiion, IlleegalAArgummentEExcepptionn, IlllegaalMonnitorrStatteExcceptiion, IlleegalPPathSStateeExceeptioon, IIlleggalSttateEExcepptionn, ImagiingOppExceeptioon, IIndexxOutOOfBouundsEExcepptionn, MiissinngRessourcceExcceptiion, NegaativeeArraaySizzeExcceptiion, NoSuuchEllemenntExcceptiion, NulllPoinnterEExcepptionn, PrrofilleDattaExcceptiion, ProvviderrExceeptioon, RRasteerFORRMatEExcepptionn, SeecuriityExxcepttion, SysstemEExcepptionn, UnndecllareddThroowablleExcceptiion, UnmoodifiiableeSetEExcepptionn, UnnsuppporteedOpeeratiionExxcepttion 第十八,eerrorr和excceptiion有什什么区别? errror 表表示恢复不不是不可能能但很困难难的情况下下的一种严严重问题。比比如说内存存溢出。不不可能指望望程序能处处理这样的的情况。excceptiion 表表示一种设设计或实现现问题。也也就是说,它它表示如果果程序运行行正常,从从不会发生生的情况。 第十九,LList, Sett, Maap是否继继承自Coollecctionn接口? List,SSet是 Map不是是 第二十,aabstrract classs和innterfface有有什么区别别? 声明方方法的存在在而不去实实现它的类类被叫做抽抽象类(aabstrract classs),它它用于要创创建一个体体现某些基基本行为的的类,并为为该类声明明方法,但但不能在该该类中实现现该类的情情况。不能能创建abbstraact 类类的实例。然然而可以创创建一个变变量,其类类型是一个个抽象类,并并让它指向向具体子类类的一个实实例。不能能有抽象构构造函数或或抽象静态态方法。AAbstrract 类的子类类为它们父父类中的所所有抽象方方法提供实实现,否则则它们也是是抽象类为为。取而代代之,在子子类中实现现该方法。知知道其行为为的其它类类可以在类类中实现这这些方法。接口(iinterrfacee)是抽象象类的变体体。在接口口中,所有有方法都是是抽象的。多多继承性可可通过实现现这样的接接口而获得得。接口中中的所有方方法都是抽抽象的,没没有一个有有程序体。接接口只可以以定义sttaticc finnal成员员变量。接接口的实现现与子类相相似,除了了该实现类类不能从接接口定义中中继承行为为。当类实实现特殊接接口时,它它定义(即即将程序体体给予)所所有这种接接口的方法法。然后,它它可以在实实现了该接接口的类的的任何对象象上调用接接口的方法法。由于有有抽象类,它它允许使用用接口名作作为引用变变量的类型型。通常的的动态联编编将生效。引引用可以转转换到接口口类型或从从接口类型型转换,iinstaanceoof 运算算符可以用用来决定某某对象的类类是否实现现了接口。 第二十十一,abbstraact的mmethood是否可可同时是sstatiic,是否否可同时是是natiive,是是否可同时时是synnchroonizeed? 都不能 第二十二,接接口是否可可继承接口口? 抽象象类是否可可实现(iimpleementts)接口口? 抽象象类是否可可继承实体体类(cooncreete cclasss)? 接口可可以继承接接口。抽象象类可以实实现(immplemmentss)接口,抽抽象类是否否可继承实实体类,但但前提是实实体类必须须有明确的的构造函数数。 第二十三,启启动一个线线程是用rrun()还是sttart()? 启动一一个线程是是调用sttart()方法,使使线程所代代表的虚拟拟处理机处处于可运行行状态,这这意味着它它可以由JJVM调度度并执行。这这并不意味味着线程就就会立即运运行。ruun()方方法可以产产生必须退退出的标志志来停止一一个线程。 第二十四,构构造器Coonstrructoor是否可可被oveerridde? 构造器器Consstrucctor不不能被继承承,因此不不能重写OOverrridinng,但可可以被重载载Overrloadding。 第二十五,是是否可以继继承Strring类类? Strring类类是finnal类故故不可以继继承。 第二十六,当当一个线程程进入一个个对象的一一个synnchroonizeed方法后后,其它线线程是否可可进入此对对象的其它它方法? 不能,一一个对象的的一个syynchrronizzed方法法只能由一一个线程访访问。 第二十七,ttry 里有一一个retturn语语句,那么么紧跟在这这个tryy后的fiinallly 里的coode会不不会被执行行,什么时时候被执行行,在reeturnn前还是后后? 会执行行,在reeturnn前执行。 第二十八,编编程题: 用最有效效率的方法法算出2乘乘以8等於於几? 有C背背景的程序序员特别喜喜欢问这种种问题。 2 <<< 3 第二十九,两两个对象值值相同(xx.equuals(y) = trrue),但但却可有不不同的haash ccode,这这句话对不不对? 不对,有有相同的hhash codee。 第三十,当当一个对象象被当作参参数传递到到一个方法法后,此方方法可改变变这个对象象的属性,并并可返回变变化后的结结果,那么么这里到底底是值传递递还是引用用传递? 是值传递。JJava 编程语言言只由值传传递参数。当当一个对象象实例作为为一个参数数被传递到到方法中时时,参数的的值就是对对该对象的的引用。对对象的内容容可以在被被调用的方方法中改变变,但对象象的引用是是永远不会会改变的。 第三十一,sswticch是否能能作用在bbyte上上,是否能能作用在llong上上,是否能能作用在SStrinng上?swiitch(eexpr11)中,eexpr11是一个整整数表达式式。因此传传递给 sswitcch 和 casee 语句的的参数应该该是 innt、 sshortt、 chhar 或或者 byyte。llong,striing 都都不能作用用于swttich。 第三十二,编编程题: 写一个SSinglletonn出来。Sinngletton模式式主要作用用是保证在在Javaa应用程序序中,一个个类Claass只有有一个实例例存在。一般SSinglletonn模式通常常有几种种种形式:第一种种形式:定定义一个类类,它的构构造函数为为privvate的的,它有一一个staatic的的privvate的的该类变量量,在类初初始化时实实例话,通通过一个ppubliic的geetInsstancce方法获获取对它的的引用,继继而调用其其中的方法法。 CODE: CCopy to cclipbboardd _publiic cllass Singgletoon priivatee Sinngletton() /在在自己内部部定义自己己一个实例例,是不是是很奇怪? /注注意这是pprivaate 只只供内部调调用 priivatee staatic Singgletoon innstannce = neww Sinngletton(); /这这里提供了了一个供外外部访问本本classs的静态态方法,可可以直接访访问 pubblic stattic SSinglletonn gettInsttancee() rreturrn innstannce; 第二种种形式: CODE: CCopy to cclipbboardd _publiic cllass Singgletoon priivatee staatic Singgletoon innstannce = nulll; pubblic stattic ssynchhroniized Singgletoon geetInsstancce() /这这个方法比比上面有所所改进,不不用每次都都进行生成成对象,只只是第一次次 /使使用时生成成实例,提提高了效率率! if (insstancce=nnull) iinstaancenew Singgletoon(); returrn innstannce; 其他形式:定义一个类类,它的构构造函数为为privvate的的,所有方方法为sttaticc的。一般认认为第一种种形式要更更加安全些些 Hasshtabble和HHashMMap Hasshtabble继承承自Dicctionnary类类,而HaashMaap是Jaava1.2引进的的Map inteerfacce的一个个实现 HasshMapp允许将nnull作作为一个eentryy的keyy或者vaalue,而而Hashhtablle不允许许 还有就就是,HaashMaap把Haashtaable的的conttainss方法去掉掉了,改成成conttainssvaluue和coontaiinsKeey。因为为conttainss方法容易易让人引起起误解。 最大的的不同是,HHashttablee的方法是是Syncchronnize的的,而HaashMaap不是,在在 多个线程访访问Hasshtabble时,不不需要自己己为它的方方法实现同同步,而HHashMMap 就必须为之之提供外同同步。dddddddddddddddddddddddddddddddddddd