程序员的面试模板及技巧资料.docx

上传人:太** 文档编号:96868041 上传时间:2024-03-27 格式:DOCX 页数:14 大小:87.21KB
返回 下载 相关 举报
程序员的面试模板及技巧资料.docx_第1页
第1页 / 共14页
程序员的面试模板及技巧资料.docx_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《程序员的面试模板及技巧资料.docx》由会员分享,可在线阅读,更多相关《程序员的面试模板及技巧资料.docx(14页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、Java面试随着时间的改变而改变。在过去的日子里,当你知道String和StringBuilder的区别就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入。在我初入职场的时候,类似于Vector与Array的区别、HashMap与Hashtable的区别是最流行的问题,只需要记住它们,就能在面试中获得更好的机会,但这种情形已经不复存在。如今,你将会被问到许多Java程序员都没有看过的领域,如NIO,设计模式,成熟的单元测试,或者那些很难掌握的知识,如并发、算 法、数据结构及编码。该列表包含了入门级Java程序员和多年经验的高级开辟者的问题。无论你是1、2、3、4、5

2、、6、7、8、9还是10年经验的开辟者,你都能在其中找到一些有趣的问题。这里包含了一些超级容易回答的问题,同时包含经验丰富的Java程序员也会棘手的问题。固然你们也是非常幸运的,当今有许多好的书来匡助你准备Java面试,其中有一本我觉得特殊实用和有趣的是Markham 的Java程序面试揭秘(Java ProgrammingInterview Exposed )。这本书会告诉你一些Java和JEE面试中最重要的主题,即使你不是准备Java面试,也值得一读。该问题列表特殊长,我们有各个地方的问题,所以,答案必须要短小、简洁、干脆,不拖泥 带水。因此,除了这一个段落,你只会听到问题与答案,再无其他

3、内容,没有反馈,也没有 评价。为此,我已经写好了一些博文,在这些文章中你可以找到我对某些问题的观点,如我 为什么喜欢这个问题,这个问题的挑战是什么?期望从面试者那获取到什么样的答案? 这个列表有三点不同,我鼓励你采用类似的方式去分享问题和答案,这样容易温习。我希翼 这个列表对面试官和候选人都有很好的用处,面试官可以对这些问题上做一些改变以获取新奇和令人惊奇的元素,这对一次好的面试来说非常重要。而候选者,可以扩展和测试Java程序语言和平台关键领域的知识。2022年,会更多的关注并发概念,JVM内部,32位JVM和64JVM的区别,单元测试及整洁的代码。我确信,如果你读过这个庞大的Java面试问

4、题列表,无论是电话面试还是面对面的面试,你都能有很好的表现。在32位和64位的Java虚拟机中,int类型的长度是相同的。32)Serial与Parallel GC之间的不同之处?(答案)Serial与Parallel在GC执行的时候都会引起stop-the-world。它们之间主要不同serial采集器是默认的复制采集器,执行GC的时候惟独一个线程,而parallel采集器使用多个GC线程来执行。33 ) 32位和64位的JVM , int类型变量的长度是多数?(答案)32位和64位的JVM中,int类型变量的长度是相同的,都是32位或者4个士卡卜 字下。34 ) Java 中 WeakRe

5、ference 与 SoftReference 的区别?(答案)虽然WeakReference与SoftReference都有利于提高GC和 内存的效率,但是WeakReference , 一旦失去最后一个强引用,就会被GC回收,而软引用虽然不能阻挠被回收,但是可以延迟到JVM内存不足的时候。35 ) WeakHashMap 是怎么工作的?(答案)WeakHashMap的工作与正常的HashMap类似,但是使用弱引用作为key ,意思就是当key对象没有任何引用时,key/value将会被回收。36 ) JVM选项-XX:+UseCompressedOops 有什么作用?为什么要使用?(答案)

6、当你将你的应用从32位的JVM迁移到64位的JVM 时,由于对象的指针从32位增加到了 64位,因此堆内存会蓦地增加,差不多要翻倍。这也会对CPU缓存(容量比内存小不少)的数据产生不利的影响。因为,迁移到64位的JVM 主要动机在于可以指定最大堆大小,通过压缩OOP可以节省一定的内存。通过-XX:+UseCompressedOops选项,JVM 会使用32位的OOP ,而不是64位的OOP o 37)怎样通过Java程序来判断JVM是32位还是64位?(答案)你可以检查某些系统属性如或者os.arch来获取该信息。38 )32位JVM和64位JVM的最大堆内存分别是多数?(答案)理论上说上32

7、位的JVM堆内存可以到达2八32 ,即4GB,但实际上会比这个小很多。不同操作系统之间不同,如Windows系统大约1.5 GB , Solaris大约3GB。64位JVM允许指定最大的堆内存,理论上可以达到2八64,这是一个非常大的数字,实际上你可以指定堆内存大小到1()()GB o甚至有的JVM,如Azul,堆内存到1()()()G 都是可能的。39)JRE、JDK、JVM及JIT之间有什么不同?(答案)JRE代表Java运行时(Java run-time ),是运行Java引用所必须的。JDK代表Java开辟工具(Java development kit ),是Java程序的开辟工具,如

8、Java编译器,它也包含JRE o JVM 代表Java虚拟机(Java virtual machine ),它的责任 是运行Java应用。JIT代表即时编译(Just In Time compilation ),当代码执行的次数超过一定的阈值时,会将Java字节码转换为本地代码,如,主要的热点代码会被准换为本地代码,这样有利大幅度提高Java应用的性能。Jr/a Source)vc JM CompHrCom加Run13年工作经验的Java面试题】40 )解释Java堆空间及GC ?(答案)当通过Java命令启动Java进程的时候,会为它分配内存。内存的一部份用于创建堆 空间,当程序中创建对象

9、的时候,就从对空间中分配内存。GC是JVM内部的一个进程,回收无效对象的内存用于将来的分配。JVM底层面试题及答案】41 )你能保证GC执行吗?(答案)不能,虽然你可以调用System.gc。或者Runtime.gc。,但是没有办法保证GC的执行。42)怎么获取Java程序使用的内存?堆使用的百分比?可以通过类中与内存相关方法来获取剩余的内存,总内存及最大堆内 存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemoryO 方法返回剩余空间的字节数,Runtime.totalMemoryO 方法总内存的字节数,Runtime.maxMemoryO 返回最

10、大内存的字节数。43 )Java中堆和栈有什么区别?(答案)JVM中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个JVM 的所有线程共享。【关于内存的的面试问题和答案】Java基本概念面试题44)“a=b”和%equals(b)有什么区别?(答案)如果a和b都是对象,则a=b是比较两个对象的引用,惟独当a和b指向的是堆中的同一个对象才会返回true,而a.equals(b)是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String类重写equals。方法,所以可以用于两个不

11、同对象,但是包含的字母相同的比较。45 ) a.hashCode()有什么用?与a.equals(b)有什么关系?(答案)hashCode()方法是相应对象整型的hash值。它常用于基于hash的集合类,如Hashtable、HashMap、LinkedHashMap 等等。它与 equals()方法关系特殊密切。根据Java规范,两个使用equal。方法来判断相等的对象,必须具有相同的hash code。46) final finalize和finally的不同之处?(答案)final是一个修饰符,可以修饰变量、方法和类。如果final修饰变量,意味着该变量的值在初始化后不能被改变。fina

12、lize方法是在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用Gnalize没有保证。Enally是一个关键字,与try 和catch 一起用于异常的处理。finally块一定会被执行,无论在try块中是否有发生异常。47 ) Java中的编译期常量是什么?使用它又什么风险?公共静态不可变(public static final)变量也就是我们所说的编译期常量,这里的public可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这 些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或者第三方库中 的公有编译时常量,但是这个值

13、后面被其他人改变了,但是你的客户端仍然在使用老的值,至你已经部署了一个新的jar。为了避免这种情况,当你在更新依赖JAR文件时,确保重新编译你的程序。Java集合框架的面试题这部份也包含数据结构、算法及数组的面试问题48 ) List Set Map和Queue之间的区别(答案)List是一个有序集合,允许元素重复。它的某些实现可以提供基于下标值的常量访问时间,但是这不是List接口保证的。Set是一个无序集合。49 ) poll()方法和remove。方法的区别?poll()和remove()都是从队列中取出一个元素,但是poll()在获取元素失败的时候会返回空,但是remove。失败的时候

14、会抛出异常。50 ) Java 中 LinkedHashMap 和 PriorityQueue 的区别是什么?(答案)PriorityQueue保证最高或者者最低优先级的的元素总是在队列头部,但是LinkedHashMap维持的顺序是元素插入的顺序。当遍历一个PriorityQueue时,没有任何顺序保证,但是LinkedHashMap课保证遍历顺序是元素插入的顺序。51 ) AirayList 与 LinkedList 的不区别?(答案)最明显的区别是ArrrayList底层的数据结构是数组,支持随机访问,而LinkedList的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,Ar

15、rayList的时间复杂度是0(1),而LinkedList是0(n)。更多细节的讨论参见答案。52)用哪两种方式来实现集合的排序?(答案)你可以使用有序集合,如TreeSet或者TreeM叩,你也可以使用有顺序的的集合,如lis, t 然后通过Collections.sort。来排序。53 ) Java中怎么打印数组?(answer答案)你可以使用Arrays.toString。和Arrays.deepToString()方法来打印数组。由于数组没有实现toStringO方法,所以如果将数组传递给。方法,将无法打印出数组的内容,但是Arrays.toStringO可以打印每一个元素。54 )

16、 Java中的LinkedList是单向链表还是双向链表?(答案)是双向链表,你可以检查JDK的源码。在Eclipse,你可以使用快捷键Ctrl+ T,直 接在编辑器中打开该类。55 ) Java中的TreeM叩 是采用什么树实现的?(答案)Java EE相关的面试题】为了做Java EE的朋友,这里列出了一些web开辟的特定问题,你们可以用来准备JEE部份的面试:10大Spring框架面试题及答案(参见)10个非常好的XML面试问题(Java程序员)(参见)20个非常好的设计模式面试问题(参见)10个最流行的Struts面试题(Java开辟者)(参见)20个Tibco Rendezvous及

17、EMS 的面试题(更多)10个最频繁被问到的Servlet面试问题及答案(参见)20个jQuery面试问题(Java Web开辟者)(列表)10个非常好的Oracle面试问题(Java开辟者)(参见)10大来自J2EE面试中的JSP问题(更多)12个很好的RESTful Web Services面试问题(参见) 10大EJB面试问题及答案(参见)10大JMS及MQ系列面试题及答案(列表)10个非常好Hibernate面试问题(Java EE开辟者)(参见)1()个非常好的JDBC面试题(Java开辟者)(参见)15个JavaNIO和网络面试题及答案(参见)10大XSLT面试题及答案(更多)15

18、个来自Java面试的数据结构和算法问题(参见)10大Java面试难题及答案(参见)40个核心Java挪移开辟面试题及答案(列表)推荐给Java面试者的书籍如果你正为Java面试寻觅好的准备,你可以看一下下面的书籍,这些书籍包含了理论及编码的相关问题Markham 的Java编程面试揭秘(参见)破解编码面试:15。个编程问题及解答(参见) 程序面试揭秘:寻觅下一份工作的秘密(参见)Java面试中的重要话题】除了你看到的惊人的问题数量,我也尽量保证质量。我不止一次分享各个重要主题中的问题, 也确保包含所谓的高级话题,这些话题不少程序员不喜欢准备或者直接抛却,因为他们的工作不会涉及到这些。Java

19、NIO和JVM底层就是最好的例子。你也可以将设计模式划分到这一类中,但是越来越多有经验的程序员了解GOF设计模式并应用这些模式。我也尽量在这个列表中包含2022年最新的面试问题,这些问题可能是来年关注的核心。为了给你一个大致的了解,下面列出这份Java面试问题列表包含的主题:多线程,并发及线程基础数据类型转换的基本原则垃圾回收(GC)Java集合框架数组字符串GOF设计模式SOLID (单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)设计原则抽象类与接口Java 基础,如 equals 和 hashcode泛型与枚举Java 10 与 NI0常用网络协议Java中的数据结构和算法正则表达式

20、JVM底层Java最佳实践JDBCDate, Time 与 CalendarJava 处理 XMLJUnit编程L 120大Java面试题及答案】现在是时候给你展示我近5年从各种面试中采集来的120个问题了。我确定你在自己 的面试中见过不少这些问题,不少问题你也能正确回答。【多线程、并发及线程的基础问题】1 ) Java中能创建Volatile数组吗?能,Java中可以创建volatile类型数组,无非只是一个指向数组的引用,而不是整个数组。我的意思是,如果改变引用指向的数组,将会受到volatile的保护,但是如果多个线程同时改变数组的元素,volatile标示符就不能起到之前的保护作用了。

21、2)volatile能使得一个非原子操作变成原子操作吗?一个典型的例子是在类中有一个long类型的成员变量。如果你知道该成员变量会被多个线程访问,如计数器、价格等,你最好是将其设置为volatile为什么?因为Java中读取long类型变量不是原子的,需要分成两步,如果一个线程正在修改该long变量的值,另 一个线程可能只能看到该值的一半(前32位)。但是对一个volatile型的long或者double变 量的读写是原子。3 ) volatile修饰符的有过什么实践?一种实践是用volatile修饰long和double变量,使其能按原子类型来读写。double和long 都是64位宽,因此

22、对这两种类型的读是分为两部份的,第一次读取第一个32位,然后再 读剩下的32位,这个过程不是原子的,但Java中volatile型的long或者double变量的读写是原子的。volatile修复符的另一个作用是提供内存屏障(memory barrier),例如在分布式框架中的应用。简单的说,就是当你写一个volatile变量之前,Java内存模型会插入一个写屏障(write barrier),读一个volatile变量之前,会插入一个读屏障(read barrier )。意思就是说,在你写一个volatile域时,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线

23、程是可见的,因 为内存屏障会将其他所有写的值更新到缓存。4 ) volatile类型变量提供什么保证?(答案)volatile变量提供顺序和可见性保证,例如,JVM或者JIT为了获得更好的性能会对语句重排序,但是volatile类型变量即使在没有同步块的情况下赋值也不会与其他语句重排序。volatile提供happens-before的保证,确保一个线程的修改能对其他线程是可见的。某些情况卜,volatile还能提供原子性,如读64位数据类型,像long和double都不是原子的,但volatile类型的double和long就是原子的。5)10个线程和2个线程的同步代码,哪个更容易写?从写代

24、码的角度来说”者的复杂度是相同典3为同步代码与线程数量是相互独立的。但 戛同步策略的选择依赖于线程的数量为越多的线程意味着更大的竞争二所以你需要利时 同步技术,如锁分离,这要求更复杂的代码和专业知识J6)你是如何调用wait。方法的?使用if块还是循环?为什么?(答案)wait。方法应该在循环调用,因为当线程获取到CPU开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。下面是一段标准的使用wait和notify方法的代码:/ The standard idiom for using the wait methodsynchronized (obj) while

25、(condition does not hold)obj.wait(); / (Releases lock, and reacquires on wakeup) ./ Perform action appropriate to condition参见Effective Java第69条,获取更多关于为什么应该在循环中来调用wait方法的内容。7 )什么是多线程环境下的伪共享(false sharing)?伪共享是多线程系统(每一个处理器有自己的局部缓存)中一个众所周知的性能问题。伪共享 发生在不同处理器的上的线程对变量的修改依赖于相同的缓存行,如下图所示:【有经验程序员的Java面试题】伪共享

26、问题很难被发现,因为线程可能访问彻底不同的全局变量,内存中却碰巧在很相近的 位置上。如其他诸多的并发问题,避免伪共享的最基本方式是子细审查代码,根据缓存行来 调整你的数据结构。8 )什么是Busy spin ?我们为什么要使用它?Busy spin是一种在不释放CPU的基础上等待事件的技术。它时常用于避免丢失CPU缓存中的数据(如果线程先暂停,之后在其他CPU上运行就会丢失)。所以,如果你的工 作要求低延迟,并且你的线程目前没有任何顺序,这样你就可以通过循环检测队列中的新消息来代替调用sleep。或者wait。方法。它惟一的好处就是你只需等待很短的时间,如几微秒或者几纳秒。LMAX分布式框架是

27、一个高性能线程间通信的库,该库有一个Busy Spin WaitStrategy类就是基于这个概念实现的,使用busy spin循环EventProcessors 等待屏障。9 ) Java中怎么获取一份线程dump文件?在Linux下,你可以通过命令kill -3 PID (Java进程的进程TD )来获取Java应用的dump文件。在Windows下,你可以按下Ctrl + Break来获取。这样JVM就会将线程的dump文件打印到标准输出或者错误文件中,它可能打印在控制台或者日志文件中,具体位置依赖应用的配置。如果你使用Tomcat。10 ) Swing是线程安全的?(答案)不是,Swi

28、ng不是线程安全的。你不能通过任何线程来更新Swing组件,如JTable、JList或者JPanel,事实上,它们只能通过GUI或者AWT线程来更新。这就是为什么Swing提供invokeAndWait()和invokeLater()方法来获取其他线程的GUI更新请求。这些方法将更新请求放入AWT的线程队列中,可以向来等待,也可以通过异步更 新直接返回结果。你也可以在参考答案中查看和学习到更详细的内容。11)什么是线程局部变量?(答案)线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式。但

29、是在管理环境下(如web服务器)使用线程局部变量的时候要特殊小心,在这种情况下,工作线程的生 命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释 放,Java应用就存在内存泄露的风险。12)用wait-notify写一段代码来解决生产者-消费者问题?(答案)请参考答案中的示例代码。只要记住在同步块中调用wait。和notify。方法,如果阻塞,通过循环来测试等待条件。13)用Java写一个线程安全的单例模式(Singleton )?(答案)请参考答案中的示例代码,这里面一步一步教你创建一个线程安全的Java单例类。当我们说线程安全时,意思是即使初始化是在多线程环境中,

30、仍然能保证单个实例。Java中,使用枚举作为单例类是最简单的方式来创建线程安全单例模式的方式。14 ) Java中sleep方法和wait方法的区别?(答案)虽然两者都是用来暂停当前运行的线程,但是sleep。实际上只是短暂停顿,因为它不会释放锁,而wait。意味着条件等待,这就是为什么该方法要释放锁,因为惟独这样,其他等待的线程才干在满足条件时获取到该锁。15 )什么是不可变对象(immutable object )? Java中怎么创建一个不可变对象?(答案)不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如String、Integer及其它包装类。详情参见答案

31、,一步一步指导你在Java中创建一个不可变的类。16 )我们能创建一个包含可变对象的不可变对象吗?是的,我们是可以创建二个包含可变对象的不可变对象的,你只需要谨慎二点,不要共享可 变对象的引用就可以了,如果需耍变化时,就返回原对象的一个拷贝。最常见的例子就是对 象中包含一个日期对象的引用。数据类型和Java基础面试问题17 ) Java中应该使用什么数据类型来代表价格?(答案)如果不是特殊关心内存和性能的话,使用BigDecimal ,否则使用预定义精度的double类型。18)怎么将byte转换为String?(答案)可以使用String接收byte参数的构造器来进行转换,需要注意的点是要使

32、用的正确的编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也可能不同。19 ) Java中怎样将bytes转换为long类型?这个问题你来回答20 )我们能将int强制转换为byte类型的变量吗?如果该值大于byte类型的范围,将会浮现什么现象?是的,我们可以做强制转换,但是Java中int是32位的,而byte是8位的,所以,如果强制转化是,int类型的高24位将会被丢弃,byte类型的范围是从.128到 128 o21 )存在两个类,B继承A , C继承B ,我们能将B转换为C么?如C = (C) B;(answer 答案)22 )哪个类包含clone方法?是Cloneable

33、还是Object?(答案)是一个标示性接口,不包含任何方法,clone方法在object类中定义。并且需要知道clone。方法是一个本地方法,这意味着它是由c或者C+或者其他 本地语言实现的。23 ) Java中+操作符是线程安全的吗?(答案)23)不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会浮现多个线程交差。24)a = a + b与a+=b的区别(答案)+ 二隐式的将加操作的结果类型强制转换为持有结果的类型。如果两这个整型相加,如byte、short或者int,首先会将它们提升到int类型,然后在执行加法操作。如果加法操作的结果比a的最大值要大,

34、则a+b会浮现编译错误,但是a +=b没问题,如 下:byte a = 127;byte b = 127;b = a + b; error : cannot convert from int to byteb +二 a; / ok(译者注:这个地方应该表述的有误,其实无论a+b的值为多少,编译器都会报错,因为a+b操作会将a、b提升为int类型,所以将int类型赋值给byte就会编译出错)25 )我能在不进行强制转换的情况下将一个double值赋值给long类型的变量吗?(答案)不行,你不能在没有强制类型转换的前提下将一个double值赋值给long类型的变量,因为double类型的范围比lo

35、ng类型更广,所以必须要进行强制转换。26 ) 3*0.1 = ().3将会返回什么? true还是false?(答案)false,因为有些浮点数不能彻底精确的表示出来。27 ) int和Integer哪个会占用更多的内存?(答案)Integer对象会占用更多的内存。Integer是一个对象,需要存储对象的元数据。但是int是一个原始类型的数据,所以占用的空间更少。28 )为什么Java中的String是不可变的(Immutable )? (answer答案)Java中的String不可变是因为Java的设计者认为字符串使用非常频繁,将字符串设置为不可变可以允许多个客户端之间共享相同的字符串。更详细的内容参见答案。29 )我们能在Switch中使用String吗?(answer答案)从Java 7开始,我们可以在switch case中使用字符串,但这仅仅是一个语法糖。内部实现在switch中使用字符串的hash code。30 ) Java中的构造器链是什么?(answer答案)当你从一个构造器中调用另一个构造器,就是Java中的构造器链。这种情况只在重载了类的构造器的时候才会浮现JVM 底层与GC ( Garbage Collection )的面试问题31)64位JVM中,int的长度是多数?Java中,int类型变量的长度是一个固定值,与平台无关,都是32位。意思就是说,

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

当前位置:首页 > 应用文书 > 解决方案

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com