还剩12页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
面试随着时间的改变而改变在过去的日子里,当你知道和的Java StringStringBuilder区别就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入在我初入职场的时候,类似于与的区别、Vector Array与的区别是最流行的问题,只需要记住它们,就能在面试中获得HashMap Hashtable更好的机会,但这种情形已经不复存在如今,你将会被问到许多程序员都没有看Java过的领域,如设计模式,成熟的单元测试,或者那些很难掌握的知识,如并发、算法、数NIO,据结构及编码该列表包含了入门级程序员和多年经验的高级开辟者的问题无论你是、、、、Java
1234、、、、还是年经验的开辟者,你都能在其中找到一些有趣的问题这5678910里包含了一些超级容易回答的问题,同时包含经验丰富的程序员也会棘手的问题固Java然你们也是非常幸运的,当今有许多好的书来匡助你准备面试,其中有一本我觉Java得特殊实用和有趣的是的程序面试揭秘Markham Java Java Programming这本书会告诉你一些和面试中最重要的主题,即Interview ExposedJava JEE使你不是准备面试,也值得一读Java该问题列表特殊长,我们有各个地方的问题,所以,答案必须要短小、简洁、干脆,不拖泥带水因此,除了这一个段落,你只会听到问题与答案,再无其他内容,没有反馈,也没有评价为此,我已经写好了一些博文,在这些文章中你可以找到我对某些问题的观点,如我为什么喜欢这个问题,这个问题的挑战是什么?期望从面试者那获取到什么样的答案?这个列表有三点不同,我鼓励你采用类似的方式去分享问题和答案,这样容易温习我希翼这个列表对面试官和候选人都有很好的用处,面试官可以对这些问题上做一些改变以获取新奇和令人惊奇的元素,这对一次好的面试来说非常重要而候选者,可以扩展和测试Java程序语言和平台关键领域的知识年,会更多的关注并发概念,内部,位2022JVM32和的区别,单元测试及整洁的代码我确信,如果你读过这个庞大的面JVM64JVM Java试问题列表,无论是电话面试还是面对面的面试,你都能有很好的表现在位和位的虚拟机中,类型的长度是相同的)3264Java int32与之间的不同之处(答案)Serial ParallelGC与在执行的时候都会引起它们之间主要不同采集Serial ParallelGC stop-the-world serial器是默认的复制采集器,执行的时候惟独一个线程,而采集器GC parallel使用多个线程来执行GC)位和位的类型变量的长度是多数?(答案)333264JVM,int位和位的中,类型变量的长度是相同的,都是位或者个3264JVM int324字下士卡卜)中与的区别?(答案)34Java WeakReference SoftReference虽然与都有利于提高和内存的效率,但是WeakReferenceSoftReferenceGC,一旦失去最后一个强引用,就会被回收,而软引用虽然不能阻挠WeakReference GC被回收,但是可以延迟到内存不足的时候JVM)是怎么工作的?(答案)35WeakHashMap的工作与正常的类似,但是使用弱引用作为意思就WeakHashMap HashMapkey,是当对象没有任何引用时,将会被回收key key/value)选项有什么作用?为什么要使用?(答案)36JVM-XX:+UseCompressedOops当你将你的应用从位的迁移到位的时,由于对象的指针从位增32JVM64JVM32加到了位,因此堆内存会蓦地增加,差不多要翻倍这也会对缓存(容量比内64CPU存小不少)的数据产生不利的影响因为,迁移到位的主要动机在于64JVM可以指定最大堆大小,通过压缩可以节省一定的内存通过OOP选项,会使用位的而不是位的-XX:+UseCompressedOops JVM32OOP,64)怎样通过程序来判断是位还是位?(答案)OOP o37Java JVM3264你可以检查某些系统属性如或者来获取该信息os.arch38位和位的最大堆内存分别是多数?答案32JVM64JVM理论上说上位的堆内存可以到达八即,但实际上会比这个小很32JVM232,4GB多不同操作系统之间不同,如系统大约大约Windows
1.5GB,Solaris3GB位允许指定最大的堆内存,理论上可以达到八这是一个非常大的数字,64JVM264,实际上你可以指定堆内存大小到甚至有的如堆内存到都是可能的1GB oJVM,Azul,1G、、及之间有什么不同?答案39JRE JDKJVM JIT代表运行时是运行引用所必须的代JRE Java Java run-time,Java JDK表开辟工具是程序的开辟工具,如编译器,它也Java Javadevelopment kit,JavaJava包含代表虚拟机它的责任是运行应用JRE oJVM JavaJava virtualmachine,Java代表即时编译当代码执行的次数超过一定的阈值时,会将JIT JustIn Timecompilation,字节码转换为本地代码,如,主要的热点代码会被准JavaJr/aSource换为本地代码,这样有利大幅度提高应用的性能Java年工作经验的面试题】13Java)解释堆空间及(答案)40Java GC当通过命令启动进程的时候,会为它分配内存内存的一部份用于创建堆空间,当程JavaJava序中创建对象的时候,就从对空间中分配内存是内部的一个进程,GC JVM»vcJMCompHr回收无效对象的内存用于将来的分配底层面试题及答案】[JVM)你能保证执行吗?(答案)41GC不能,虽然你可以调用或者,但是没有办法保证的执System.gc Runtime.gc GC行)怎么获取程序使用的内存?堆使用的百分比?42Java可以通过类中与内存相关方法来获取剩余的内存,总内存及最大堆内存通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间方法返回剩余空间的字节数,方法Runtime.freeMemoryO Runtime.totalMemoryO总内存的字节数,返回最大内存的字节数Runtime.maxMemoryO)中堆和栈有什么区别?(答案)43Java中堆和栈属于不同的内存区域,使用目的也不同栈常用于保存方法帧和局部变量,JVM而对象总是在堆上分配栈通常都比堆小,也不会在多个线程之间共享,而堆被整个的所有JVM线程共享【关于内存的的面试问题和答案】基本概念面试题Java和%有什么区别?答案44“a=b”equalsb如果和都是对象,则是比较两个对象的引用,惟独当和指向的是堆中a b a==b ab的同一个对象才会返回而是进行逻辑比较,所以通常需要重写true,a.equalsb该方法来提供逻辑一致性的比较例如,类重写方法,所以可以用于两String equals个不同对象,但是包含的字母相同的比较有什么用?与有什么关系?答案45a.hashCode a.equalsb方法是相应对象整型的值它常用于基于的集合类,如hashCode hashhash、、等等它与方法关系特殊密切根Hashtable HashMapLinkedHashMap equals据规范,两个使用方法来判断相等的对象,必须具有相同的Java equalhash code46final finalize和的不同之处?答案finally是一个修饰符,可以修饰变量、方法和类如果修饰变量,意味着该变量的final final值在初始化后不能被改变方法是在对象被回收之前调用的方法,给对象自己最后finalize一个复活的机会,但是什么时候调用没有保证是一个关键字,与和一Gnalize Enallytry catch起用于异常的处理块一定会被执行,无论在块中是否有发生异常finally try中的编译期常量是什么?使用它又什么风险?47Java公共静态不可变变量也就是我们所说的编译期常量,这里的public staticfinal public可选的实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变这种方式存在的一个问题是你使用了一个内部的或者第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,至你已经部署了一个新的为了避免这种情况,当你在更新依赖文件时,确保jar JAR重新编译你的程序集合框架的面试题Java这部份也包含数据结构、算法及数组的面试问题和之间的区别答案48List SetMap Queue是一个有序集合,允许元素重复它的某些实现可以提供基于下标值的常量访问时间,List但是这不是接口保证的是一个无序集合List Set方法和方法的区别49poll remove和都是从队列中取出一个元素,但是在获取元素失败的时候会poll removepoll返回空,但是失败的时候会抛出异常remove中和的区别是什么?答案50Java LinkedHashMap PriorityQueue保证最高或者者最低优先级的的元素总是在队列头部,但是PriorityQueue维持的顺序是元素插入的顺序当遍历一个时,没有LinkedHashMapPriorityQueue任何顺序保证,但是课保证遍历顺序是元素插入的顺序LinkedHashMap与的不区别答案51AirayList LinkedList最明显的区别是底层的数据结构是数组,支持随机访问,而的底层ArrrayList LinkedList数据结构书链表,不支持随机访问使用下标访问一个元素,的时间复杂ArrayList度是而是更多细节的讨论参见答案01,LinkedList0n用哪两种方式来实现集合的排序?答案52你可以使用有序集合,如或者叩,你也可以使用有顺序的的集合,如然后通TreeSet TreeMlis,t过来排序Collections.sort)中怎么打印数组?(答案)53Java answer你可以使用和()方法来打印数组由于数组没有Arrays.toString Arrays.deepToString实现方法,所以如果将数组传递给方法,将toStringO无法打印出数组的内容,但是可以打印每一个元素Arrays.toStringO)中的是单向链表还是双向链表?(答案)54Java LinkedList是双向链表,你可以检查的源码在你可以使用快捷键直接在编辑器中打JDK Eclipse,Ctrl+T,开该类)中的叩是采用什么树实现的?(答案)55Java TreeM相关的面试题】[Java EE为了做的朋友,这里列出了一些开辟的特定问题,你们可以用来准备Java EEweb部份的面试JEE大框架面试题及答案(参见)10Spring个非常好的面试问题(程序员)(参见)10XML Java个非常好的设计模式面试问题(参见)20个最流行的面试题(开辟者)(参见)10Struts Java个及的面试题(更多)20Tibco RendezvousEMS个最频繁被问到的面试问题及答案(参见)10Servlet个面试问题(开辟者)(列表)20jQuery JavaWeb个非常好的面试问题(开辟者)(参见)10Oracle Java大来自面试中的问题(更多)10J2EE JSP个很好的面试问题(参见)大面试问题及答案(参见)12RESTful WebServices10EJB大及系列面试题及答案(列表)10JMS MQ个非常好面试问题(开辟者)(参见)10Hibernate JavaEE()个非常好的面试题(开辟者)(参见)1JDBC Java个和网络面试题及答案(参见)15JavaNIO大面试题及答案(更多)10XSLT个来自面试的数据结构和算法问题(参见)15Java大面试难题及答案(参见)10Java个核心挪移开辟面试题及答案(列表)40Java推荐给面试者的书籍Java如果你正为面试寻觅好的准备,你可以看一下下面的书籍,这些书籍包含了理论及Java编码的相关问题的编程面试揭秘(参见)Markham Java破解编码面试个编程问题及解答(参见)程序面试揭秘寻觅下一份工作的秘密(参见)15面试中的重要话题】[Java除了你看到的惊人的问题数量,我也尽量保证质量我不止一次分享各个重要主题中的问题,也确保包含所谓的高级话题,这些话题不少程序员不喜欢准备或者直接抛却,因为他们的工作不会涉及到这些和底层就是最好的例子你也可以将设计模式划分Java NIOJVM到这一类中,但是越来越多有经验的程序员了解设计模式并应用这些模式我也尽GOF量在这个列表中包含年最新的面试问题,这些问题可能是来年关注的核心为了2022给你一个大致的了解,下面列出这份面试问题列表包含的主题Java多线程,并发及线程基础数据类型转换的基本原则垃圾回收()GC集合框架Java数组字符串设计模式GOF(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)设计原则SOLID抽象类与接口基础,如和Java equalshashcode泛型与枚举与Java10NI0常用网络协议中的数据结构和算法Java正则表达式底层JVM最佳实践JavaJDBC与Date,Time Calendar处理Java XMLJUnit编程大面试题及答案】L120Java现在是时候给你展示我近年从各种面试中采集来的个问题了我确定你在自己的面试中见5120过不少这些问题,不少问题你也能正确回答【多线程、并发及线程的基础问题】中能创建数组吗?1Java Volatile能,中可以创建类型数组,无非只是一个指向数组的引用,而不是整个数组Java volatile我的意思是,如果改变引用指向的数组,将会受到的保护,但是如果多个线volatile程同时改变数组的元素,标示符就不能起到之前的保护作用了volatile2能使得一个非原子操作变成原子操作吗?volatile一个典型的例子是在类中有一个类型的成员变量如果你知道该成员变量会被多个long线程访问,如计数器、价格等,你最好是将其设置为为什么?因为中读volatile Java取类型变量不是原子的,需要分成两步,如果一个线程正在修改该变量的值,另一个long long线程可能只能看到该值的一半前位但是对一个型的或者变量的读写32volatile long double是原子修饰符的有过什么实践?3volatile一种实践是用修饰和变量,使其能按原子类型来读写和都是volatile longdouble double long64位宽,因此对这两种类型的读是分为两部份的,第一次读取第一个位,然后再读剩下的3232位,这个过程不是原子的,但中型的或者Java volatilelong变量的读写是原子的修复符的另一个作用是提供内存屏障double volatilememory barrier,例如在分布式框架中的应用简单的说,就是当你写一个变量之前,内存volatile Java模型会插入一个写屏障读一个变量之前,会插write barrier,volatile入一个读屏障意思就是说,在你写一个域时,能保证任何线read barriervolatile程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为内存屏障会将其他所有写的值更新到缓存类型变量提供什么保证?答案4volatile变量提供顺序和可见性保证,例如,或者为了获得更好的性能会对语volatile JVMJIT句重排序,但是类型变量即使在没有同步块的情况下赋值也不会与其他语句重排序volatile提供的保证,确保一个线程的修改能对其他线程是可见的某些情况volatile happens-before卜,还能提供原子性,如读位数据类型,像和volatile64longdouble都不是原子的,但类型的和就是原子的volatile double long个线程和个线程的同步代码,哪个更容易写?5102从写代码的角度来说”者的复杂度是相同典3为同步代码与线程数量是相互独立的但戛同步策略的选择依赖于线程的数量—为越多的线程意味着更大的竞争二所以你需要利时同步技术,如锁分离,这要求更复杂的代码和专业知识J你是如何调用方法的?使用块还是循环?为什么?答案6wait if方法应该在循环调用,因为当线程获取到开始执行的时候,其他条件可能wait CPU还没有满足,所以在处理前,循环检测条件是否满足会更好下面是一段标准的使用wait和方法的代码notify//The standardidiom forusing thewait methodsynchronizedobj{while conditiondoes notholdobj.wait;//Releases lock,and reacquireson wakeup...//Perform actionappropriate tocondition参见第条,获取更多关于为什么应该在循环中来调用方法Effective Java69wait的内容)什么是多线程环境下的伪共享()7false sharing伪共享是多线程系统(每一个处理器有自己的局部缓存)中一个众所周知的性能问题伪共享发生在不同处理器的上的线程对变量的修改依赖于相同的缓存行,如下图所示【有经验程序员的面试题】Java伪共享问题很难被发现,因为线程可能访问彻底不同的全局变量,内存中却碰巧在很相近的位置上如其他诸多的并发问题,避免伪共享的最基本方式是子细审查代码,根据缓存行来调整你的数据结构)什么是我们为什么要使用它?8Busy spin是一种在不释放的基础上等待事件的技术它时常用于避免丢失Busy spinCPU CPU缓存中的数据(如果线程先暂停,之后在其他上运行就会丢失)所以,如果你的工作要CPU求低延迟,并且你的线程目前没有任何顺序,这样你就可以通过循环检测队列中的新消息来代替调用或者方法它惟一的好处就是你只需等待很短的时间,如几sleep wait微秒或者几纳秒分布式框架是一个高性能线程间通信的库,该库有一个LMAX类就是基于这个概念实现的,使用循环Busy SpinWaitStrategy busyspin等待屏障EventProcessors)中怎么获取一份线程文件?9Java dump在下,你可以通过命令(进程的进程)来获取应Linux kill-3PID JavaTD Java用的文件在下,你可以按下来获取这样就dump WindowsCtrl+Break JVM会将线程的文件打印到标准输出或者错误文件中,它可能打印在控制台或者日志dump文件中,具体位置依赖应用的配置如果你使用Tomcat)是线程安全的?(答案)10Swing不是,不是线程安全的你不能通过任何线程来更新组件,如、Swing SwingJTable JList或者事实上,它们只能通过或者线程来更新这就是为什么JPanel,GUI AWT提供()和()方法来获取其他线程的更新Swing invokeAndWaitinvokeLater GUI请求这些方法将更新请求放入的线程队列中,可以向来等待,也可以通过异步更新直接AWT返回结果你也可以在参考答案中查看和学习到更详细的内容)什么是线程局部变量?(答案)11线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享提Java供类来支持线程局部变量,是一种实现线程安全的方式但是在管理环境ThreadLocal下(如服务器)使用线程局部变量的时候要特殊小心,在这种情况下,工作线程的生命周web期比任何应用变量的生命周期都要长任何线程局部变量一旦在工作完成后没有释放,应用Java就存在内存泄露的风险)用写一段代码来解决生产者-消费者问题?(答案)12wait-notify请参考答案中的示例代码只要记住在同步块中调用和方法,如果阻塞,wait notify通过循环来测试等待条件)用写一个线程安全的单例模式()(答案)13Java Singleton请参考答案中的示例代码,这里面一步一步教你创建一个线程安全的单例类当我Java们说线程安全时,意思是即使初始化是在多线程环境中,仍然能保证单个实例中,Java使用枚举作为单例类是最简单的方式来创建线程安全单例模式的方式)中方法和方法的区别(答案)14Java sleepwait虽然两者都是用来暂停当前运行的线程,但是实际上只是短暂停顿,因为它不会sleep释放锁,而意味着条件等待,这就是为什么该方法要释放锁,因为惟独这样,其wait他等待的线程才干在满足条件时获取到该锁)什么是不可变对象()中怎么创建一个不可变对象?(答15immutable objectJava案)不可变对象指对象一旦被创建,状态就不能再改变任何修改都会创建一个新的对象,如、及其它包装类详情参见答案,一步一步指导你在中创建一个不String IntegerJava可变的类)我们能创建一个包含可变对象的不可变对象吗?16是的,我们是可以创建二个包含可变对象的不可变对象的,你只需要谨慎二点,不要共享可变对象的引用就可以了,如果需耍变化时,就返回原对象的一个拷贝最常见的例子就是对象中包含一个日期对象的引用数据类型和基础面试问题Java)中应该使用什么数据类型来代表价格?(答案)17Java如果不是特殊关心内存和性能的话,使用否则使用预定义精度的类BigDecimal,double型)怎么将转换为(答案)18byte String可以使用接收参数的构造器来进行转换,需要注意的点是要使用的正确的String byte[]编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也可能不同)中怎样将转换为类型19Java byteslong这个问题你来回答)我们能将强制转换为类型的变量吗?如果该值大于类型的范围,20int byte byte将会浮现什么现象?是的,我们可以做强制转换,但是中是位的,而是位的,Java int32byte8所以,如果强制转化是,类型的高位将会被丢弃,类型的范围是从int24byte.128到128o)存在两个类,继承继承我们能将转换为么?如();21B A,C B,B CC=C B(答案)answer)哪个类包含方法?是还是(答案)22clone CloneableObject是一个标示性接口,不包含任何方法,方法在类中clone object定义并且需要知道方法是一个本地方法,这意味着它是由或者或者其他本地语clone cC++言实现的)中++操作符是线程安全的吗?(答案)23Java)不是线程安全的操作它涉及到多个指令,如读取变量值,增加,然后存储回内存,23这个过程可能会浮现多个线程交差)与的区别(答案)24a=a+b a+=b+二隐式的将加操作的结果类型强制转换为持有结果的类型如果两这个整型相加,如、或者首先会将它们提升到类型,然后在执行加法操作如果加byte shortint,int法操作的结果比的最大值要大,则会浮现编译错误,但是没问题,如下a a+b a+=bbyte a=127;byteb=127;〃b=a+b;error:cannot convertfrom intto byte二b+a;//ok(译者注这个地方应该表述的有误,其实无论的值为多少,编译器都会报错,因为a+b操作会将、提升为类型,所以将类型赋值给就会编译出错))我能a+bab intint byte25在不进行强制转换的情况下将一个值赋值给类型的变量吗?(答double long案)不行,你不能在没有强制类型转换的前提下将一个值赋值给类型的变量,doublelong因为类型的范围比类型更广,所以必须要进行强制转换doublelong)()将会返回什么?还是(答案)263*
0.1==.3true false因为有些浮点数不能彻底精确的表示出来false,)和哪个会占用更多的内存?(答案)27int Integer对象会占用更多的内存是一个对象,需要存储对象的元数据但是Integer Integerint是一个原始类型的数据,所以占用的空间更少)为什么中的是不可变的()(答案)28Java StringImmutable answer中的不可变是因为的设计者认为字符串使用非常频繁,将字符串设Java StringJava置为不可变可以允许多个客户端之间共享相同的字符串更详细的内容参见答案)我们能在中使用吗?(答案)29Switch Stringanswer从开始,我们可以在中使用字符串,但这仅仅是一个语法糖内Java7switch case部实现在中使用字符串的switch hashcode)中的构造器链是什么?(答案)30Java answer当你从一个构造器中调用另一个构造器,就是中的构造器链这种情况只在重载了Java类的构造器的时候才会浮现°底层与()的面试问题JVM GCGarbage Collection)位中,的长度是多数?3164JVM int中,类型变量的长度是一个固定值,与平台无关,都是位意思就是说,Java int32。
个人认证
优秀文档
获得点赞 0