java中心ITeye - 娱乐之横扫全球

java中心ITeye

2019-01-10 20:34:30 | 作者: 迎荷 | 标签: 办法,运用,答案 | 浏览: 2319

Java 面试跟着时刻的改动而改动。在曩昔的日子里,当你知道 String 和 StringBuilder 的差异就能让你直接进入第二轮面试,可是现在问题变得越来越高档,面试官问的问题也更深化。在我初入职场的时分,相似于 Vector 与 Array 的差异、HashMap 与 Hashtable 的差异是最盛行的问题,只需求记住它们,就能在面试中取得更好的时机,但这种景象现已不复存在。现在,你将会被问到许多 Java 程序员都没有看过的范畴,如 NIO,规划办法,老练的单元测验,或许那些很难把握的常识,如并发、算法、数据结构及编码。

 

由于我喜爱研讨面试题,因而我现已搜集了许多的面试问题,包括许多许多不同的主题。我现已为这许多的问题预备一段时刻了,现在我将它们同享给你们。这儿边不光包括经典的面试问题,如线程、调集、equals 和 hashcode、socket,并且还包括了 NIO、数组、字符串、Java 8 等主题。

 

该列表包括了入门级 Java 程序员和多年经历的高档开发者的问题。不管你是 1、2、3、4、5、6、7、8、9 仍是 10 年经历的开发者,你都能在其间找到一些风趣的问题。这儿包括了一些超级简略答复的问题,一同包括经历丰富的 Java 程序员也会扎手的问题。

 

当然你们也是十分走运的,当今有许多好的书来协助你预备 Java 面试,其间有一本我觉得特别有用和风趣的是 Markham 的 Java 程序面试揭秘(Java Programming Interview Exposed)。这本书会通知你一些 Java 和 JEE 面试中最重要的主题,即便你不是预备 Java 面试,也值得一读。

 

该问题列表特别长,咱们有各个当地的问题,所以,答案必需求矮小、简练、爽性,不牵丝攀藤。因而,除了这一个阶段,你只会听到问题与答案,再无其他内容,没有反应,也没有点评。为此,我现已写好了一些博文,在这些文章中你能够找到我对某些问题的观念,如我为什么喜爱这个问题,这个问题的应战是什么?期望从面试者那获取到什么样的答案?

 

这个列表有一点不同,我鼓舞你选用相似的办法去同享问题和答案,这样简略温习。我期望这个列表对面试官和提名人都有很好的用途,面试官能够对这些问题上做一些改动以获取别致和令人惊讶的元素,这对一次好的面试来说十分重要。而候选者,能够扩展和测验 Java 程序言语和渠道要害范畴的常识。2015 年,会更多的重视并发概念,JVM 内部,32 位 JVM 和 64 JVM的差异,单元测验及整齐的代码。我坚信,假如你读过这个巨大的 Java 面试问题列表,不管是电话面试仍是面临面的面试,你都能有很好的体现。

 

Java 面试中的重要论题

 

除了你看到的惊人的问题数量,我也尽量确保质量。我不止一次同享各个重要主题中的问题,也确保包括所谓的高档论题,这些论题许多程序员不喜爱预备或许直接抛弃,由于他们的作业不会涉及到这些。Java NIO 和 JVM 底层便是最好的比如。你也能够将规划办法划分到这一类中,可是越来越多有经历的程序员了解 GOF 规划办法并运用这些办法。我也尽量在这个列表中包括 2015 年最新的面试问题,这些问题或许是来年重视的中心。为了给你一个大致的了解,下面列出这份 Java 面试问题列表包括的主题:

 

多线程,并发及线程根底
!--[if !supportLineBreakNewLine]--
!--[endif]--

数据类型转化的基本准则
!--[if !supportLineBreakNewLine]--
!--[endif]--

废物收回(GC)
!--[if !supportLineBreakNewLine]--
!--[endif]--

Java 调集结构
!--[if !supportLineBreakNewLine]--
!--[endif]--

数组
!--[if !supportLineBreakNewLine]--
!--[endif]--

字符串
!--[if !supportLineBreakNewLine]--
!--[endif]--

GOF 规划办法
!--[if !supportLineBreakNewLine]--
!--[endif]--

SOLID (单一功用、开闭准则、里氏替换、接口阻隔以及依靠回转)规划准则
!--[if !supportLineBreakNewLine]--
!--[endif]--

笼统类与接口
!--[if !supportLineBreakNewLine]--
!--[endif]--

Java 根底,如 equals 和 hashcode
!--[if !supportLineBreakNewLine]--
!--[endif]--

泛型与枚举
!--[if !supportLineBreakNewLine]--
!--[endif]--

Java IO 与 NIO
!--[if !supportLineBreakNewLine]--
!--[endif]--

常用网络协议
!--[if !supportLineBreakNewLine]--
!--[endif]--

Java 中的数据结构和算法
!--[if !supportLineBreakNewLine]--
!--[endif]--

正则表达式
!--[if !supportLineBreakNewLine]--
!--[endif]--

JVM 底层
!--[if !supportLineBreakNewLine]--
!--[endif]--

Java 最佳实践
!--[if !supportLineBreakNewLine]--
!--[endif]--

JDBC
!--[if !supportLineBreakNewLine]--
!--[endif]--

Date, Time 与 Calendar
!--[if !supportLineBreakNewLine]--
!--[endif]--

Java 处理 XML
!--[if !supportLineBreakNewLine]--
!--[endif]--

JUnit
!--[if !supportLineBreakNewLine]--
!--[endif]--

编程

 

120 大 Java 面试题及答案

 

现在是时分给你展现我近 5 年从各种面试中搜集来的 120 个问题了。我确认你在自己的面试中见过许多这些问题,许多问题你也能正确答复。

 

多线程、并发及线程的根底问题

 

1)Java 中能创立 Volatile 数组吗?
!--[if !supportLineBreakNewLine]--
!--[endif]--

能,Java 中能够创立 volatile 类型数组,不过仅仅一个指向数组的引证,而不是整个数组。我的意思是,假如改动引证指向的数组,将会遭到 volatile 的维护,可是假如多个线程一同改动数组的元素,volatile 标明符就不能起到之前的维护效果了。

 

2)volatile 能使得一个非原子操作变成原子操作吗?
!--[if !supportLineBreakNewLine]--
!--[endif]--

一个典型的比如是在类中有一个 long 类型的成员变量。假如你知道该成员变量会被多个线程拜访,如计数器、价格等,你最好是将其设置为 volatile。为什么?由于 Java 中读取 long 类型变量不是原子的,需求分红两步,假如一个线程正在修正该 long 变量的值,另一个线程或许只能看到该值的一半(前 32 位)。可是对一个 volatile 型的 long 或 double 变量的读写是原子。

 

3)volatile 润饰符的有过什么实践?
!--[if !supportLineBreakNewLine]--
!--[endif]--

一种实践是用 volatile 润饰 long 和 double 变量,使其能按原子类型来读写。double 和 long 都是64位宽,因而对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个进程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。volatile 修正符的另一个效果是供给内存屏障(memory barrier),例如在分布式结构中的运用。简略的说,便是当你写一个 volatile 变量之前,Java 内存模型会刺进一个写屏障(write barrier),读一个 volatile 变量之前,会刺进一个读屏障(read barrier)。意思便是说,在你写一个 volatile 域时,能确保任何线程都能看到你写的值,一同,在写之前,也能确保任何数值的更新对一切线程是可见的,由于内存屏障会将其他一切写的值更新到缓存。

 

4)volatile 类型变量供给什么确保?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

volatile 变量供给次序和可见性确保,例如,JVM 或许 JIT为了取得更好的功用会对句子重排序,可是 volatile 类型变量即便在没有同步块的状况下赋值也不会与其他句子重排序。 volatile 供给 happens-before 的确保,确保一个线程的修正能对其他线程是可见的。某些状况下,volatile 还能供给原子性,如读 64 位数据类型,像 long 和 double 都不是原子的,但 volatile 类型的 double 和 long 便是原子的。

 

 

!--[if !supportLists]-- 5.  !--[endif]-- 10 个线程和 2 个线程的同步代码,哪个更简略写?
!--[if !supportLineBreakNewLine]--
!--[endif]--

!--[if !supportLists]-- 6.  !--[endif]-- 从写代码的视点来说,两者的杂乱度是相同的,由于同步代码与线程数量是互相独立的。可是同步战略的挑选依靠于线程的数量,由于越多的线程意味着更大的竞赛,所以你需求运用同步技能,如锁别离,这要求更杂乱的代码和专业常识。

 

 

6)你是怎样调用 wait()办法的?运用 if 块仍是循环?为什么?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

wait() 办法应该在循环调用,由于当线程获取到 CPU 开端履行的时分,其他条件或许还没有满意,所以在处理前,循环检测条件是否满意会更好。下面是一段规范的运用 wait 和 notify 办法的代码:

 

// The standard idiom for using the wait method

synchronized (obj) {

while (condition does not hold)

obj.wait(); // (Releases lock, and reacquires on wakeup)

... // Perform action appropriate to condition

}

 

拜见 Effective Java 第 69 条,获取更多关于为什么应该在循环中来调用 wait 办法的内容。

 

7)什么是多线程环境下的伪同享(false sharing)?
!--[if !supportLineBreakNewLine]--
!--[endif]--

伪同享是多线程体系(每个处理器有自己的部分缓存)中一个众所周知的功用问题。伪同享发作在不同处理器的上的线程对变量的修正依靠于相同的缓存行,如下图所示:

 


!--[if !supportLineBreakNewLine]--
!--[endif]--

 

!--[if mso !supportInlineShapes supportFields] span /span span   /span SHAPE span   /span \* MERGEFORMAT span /span ![endif]-- !--[if gte vml 1] v:rect id="Rectangle_x0020_1" o:spid="_x0000_s1026" o:gfxdata="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 0942j9zmnBZd8Y2YwVk6ZkmI03arSzSrZAs3DSnXwdwV1APbSnU3xr26Kabkz8mUYhr/z0zR+wm8 fahPdAR8eNErMNKV0vG4UCGHLpSE1B8IGBxM74Bsgfe78BiSCt5Km19BDvWvrTnLw5Q1HCLVPg2Q oLAfqVAQsgdtyWTfKcyq6d5lWbKUkcmogroysWqPySFhI90DW3pv91AIqW66SdoGDO5k/rn3aQWN Az3kFOvN6WT53mtr4J+efGwxg1FuHzYDTeb/XMV8PFjsqna9WZ7tvUVD9IPFmNXIqgKEFbaCdlr2 r6nCK261tmMtWVxrZspBFJctBmI+ECXwDgnpf7D/UeEz+wVDb6gjvg+9FcHHC80M0gay+oIdPJBu kJY4hsHJEm0yaVbWtenopL2WbdbnPOnmck84W2t2lni/orPz4cwV59TieTo79bDja0tb6WqI7MkS BdI0O8iYwJR9ydrFCRoH1Y4HX5Mg0PfgCr5HeUCraVpN0+AKPjLBsGS/DHW89CKjwHNLyTH1jFLP MI2M0sgozYwCw1n6DSajtKBT6c8m8NlO/3go+0ICE1z6RSVrqs7nvs2/AAAA//8DAFBLAwQUAAYA CAAAACEAnGZGQbsAAAAkAQAAKgAAAGNsaXBib2FyZC9kcmF3aW5ncy9fcmVscy9kcmF3aW5nMS54 bWwucmVsc4SPzQrCMBCE74LvEPZu0noQkSa9iNCr1AcIyTYtNj8kUezbG+hFQfCyMLPsN7NN+7Iz eWJMk3ccaloBQae8npzhcOsvuyOQlKXTcvYOOSyYoBXbTXPFWeZylMYpJFIoLnEYcw4nxpIa0cpE fUBXNoOPVuYio2FBqrs0yPZVdWDxkwHii0k6zSF2ugbSL6Ek/2f7YZgUnr16WHT5RwTLpRcWoIwG MwdKV2edNS1dgYmGff0m3gAAAP//AwBQSwECLQAUAAYACAAAACEAu+VIlAUBAAAeAgAAEwAAAAAA AAAAAAAAAAAAAAAAW0NvbnRlbnRfVHlwZXNdLnhtbFBLAQItABQABgAIAAAAIQCtMD/xwQAAADIB AAALAAAAAAAAAAAAAAAAADYBAABfcmVscy8ucmVsc1BLAQItABQABgAIAAAAIQBlWxpO+QIAAIoG AAAfAAAAAAAAAAAAAAAAACACAABjbGlwYm9hcmQvZHJhd2luZ3MvZHJhd2luZzEueG1sUEsBAi0A FAAGAAgAAAAhAJxOXiHiBgAAOhwAABoAAAAAAAAAAAAAAAAAVgUAAGNsaXBib2FyZC90aGVtZS90 aGVtZTEueG1sUEsBAi0AFAAGAAgAAAAhAJxmRkG7AAAAJAEAACoAAAAAAAAAAAAAAAAAcAwAAGNs aXBib2FyZC9kcmF3aW5ncy9fcmVscy9kcmF3aW5nMS54bWwucmVsc1BLBQYAAAAABQAFAGcBAABz DQAAAAA= " filled="f" stroked="f" o:lock v:ext="edit" aspectratio="t"/ w:wrap type="none"/ w:anchorlock/ /v:rect ![endif]-- !--[if gte vml 1] v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f" v:stroke join / v:formulas v:f eqn="if lineDrawn pixelLineWidth 0"/ v:f eqn="sum @0 1 0"/ v:f eqn="sum 0 0 @1"/ v:f eqn="prod @2 1 2"/ v:f eqn="prod @3 21600 pixelWidth"/ v:f eqn="prod @3 21600 pixelHeight"/ v:f eqn="sum @0 0 1"/ v:f eqn="prod @6 1 2"/ v:f eqn="prod @7 21600 pixelWidth"/ v:f eqn="sum @8 21600 0"/ v:f eqn="prod @7 21600 pixelHeight"/ v:f eqn="sum @10 21600 0"/ /v:formulas v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/ o:lock v:ext="edit" aspectratio="t"/ /v:shapetype ![endif]-- !--[if mso !supportInlineShapes supportFields] v:shape id="_x0000_i1025" type="#_x0000_t75" v:imagedata croptop="-65520f" cropbottom="65520f"/ /v:shape span /span ![endif]--

伪同享

 


!--[if !supportLineBreakNewLine]--
!--[endif]--

有经历程序员的 Java 面试题

 

 

伪同享问题很难被发现,由于线程或许拜访彻底不同的全局变量,内存中却碰巧在很附近的方位上。如其他许多的并发问题,防止伪同享的最基本办法是细心查看代码,依据缓存行来调整你的数据结构。

 

8)什么是Busy spin?咱们为什么要运用它?
!--[if !supportLineBreakNewLine]--
!--[endif]--

Busy spin 是一种在不开释 CPU 的根底上等候工作的技能。它常常用于防止丢掉 CPU 缓存中的数据(假如线程先暂停,之后在其他CPU上运转就会丢掉)。所以,假如你的作业要求低推迟,并且你的线程现在没有任何次序,这样你就能够经过循环检测行列中的新消息来替代调用 sleep() 或 wait() 办法。它仅有的长处便是你只需等候很短的时刻,如几微秒或几纳秒。LMAX 分布式结构是一个高功用线程间通讯的库,该库有一个 BusySpinWaitStrategy 类便是依据这个概念完成的,运用 busy spin 循环 EventProcessors 等候屏障。

 

9)Java 中怎样获取一份线程 dump 文件?
!--[if !supportLineBreakNewLine]--
!--[endif]--

在 Linux 下,你能够经过指令 kill -3 PID (Java 进程的进程 ID)来获取 Java 运用的 dump 文件。在 Windows 下,你能够按下 Ctrl + Break 来获取。这样 JVM 就会将线程的 dump 文件打印到规范输出或过错文件中,它或许打印在操控台或许日志文件中,详细方位依靠运用的装备。假如你运用Tomcat。

 

10)Swing 是线程安全的?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

不是,Swing 不是线程安全的。你不能经过任何线程来更新 Swing 组件,如 JTable、JList 或 JPanel,事实上,它们只能经过 GUI 或 AWT 线程来更新。这便是为什么 Swing 供给 invokeAndWait() 和 invokeLater() 办法来获取其他线程的 GUI 更新恳求。这些办法将更新恳求放入 AWT 的线程行列中,能够一向等候,也能够经过异步更新直接回来成果。你也能够在参考答案中查看和学习到更详细的内容。

 

11)什么是线程部分变量?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

线程部分变量是局限于线程内部的变量,归于线程本身一切,不在多个线程间同享。Java 供给 ThreadLocal 类来支撑线程部分变量,是一种完成线程安全的办法。可是在办理环境下(如 web 服务器)运用线程部分变量的时分要特别当心,在这种状况下,作业线程的生命周期比任何运用变量的生命周期都要长。任何线程部分变量一旦在作业完成后没有开释,Java 运用就存在内存走漏的危险。

 

12)用 wait-notify 写一段代码来处理出产者-顾客问题?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

请参考答案中的示例代码。只需记住在同步块中调用 wait() 和 notify()办法,假如堵塞,经过循环来测验等候条件。

 

 

!--[if !supportLists]-- 13. !--[endif]-- 用 Java 写一个线程安全的单例办法(Singleton)?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

!--[if !supportLists]-- 14. !--[endif]-- 请参考答案中的示例代码,这儿边一步一步教你创立一个线程安全的 Java 单例类。当咱们说线程安全时,意思是即便初始化是在多线程环境中,依然能确保单个实例。Java 中,运用枚举作为单例类是最简略的办法来创立线程安全单例办法的办法。

 

 

14)Java 中 sleep 办法和 wait 办法的差异?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

尽管两者都是用来暂停当时运转的线程,可是 sleep() 实际上仅仅时刻短中止,由于它不会开释锁,而 wait() 意味着条件等候,这便是为什么该办法要开释锁,由于只要这样,其他等候的线程才干在满意条件时获取到该锁。

 

15)什么是不可变目标(immutable object)?Java 中怎样创立一个不可变目标?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

不可变目标指目标一旦被创立,状况就不能再改动。任何修正都会创立一个新的目标,如 String、Integer及其它包装类。概况拜见答案,一步一步辅导你在 Java 中创立一个不可变的类。

 

16)咱们能创立一个包括可变目标的不可变目标吗?
!--[if !supportLineBreakNewLine]--
!--[endif]--

是的,咱们是能够创立一个包括可变目标的不可变目标的,你只需求慎重一点,不要同享可变目标的引证就能够了,假如需求变化时,就回来原目标的一个仿制。最常见的比如便是目标中包括一个日期目标的引证。

 

数据类型和 Java 根底面试问题

 

17)Java 中应该运用什么数据类型来代表价格?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

假如不是特别关怀内存和功用的话,运用BigDecimal,不然运用预界说精度的 double 类型。

 

18)怎样将 byte 转化为 String?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

能够运用 String 接纳 byte[] 参数的结构器来进行转化,需求留意的点是要运用的正确的编码,不然会运用渠道默许编码,这个编码或许跟本来的编码相同,也或许不同。

 

19)Java 中怎样将 bytes 转化为 long 类型?
!--[if !supportLineBreakNewLine]--
!--[endif]--

这个问题你来答复 :-)
!--[if !supportLineBreakNewLine]--
!--[endif]--

20)咱们能将 int 强制转化为 byte 类型的变量吗?假如该值大于 byte 类型的规模,将会呈现什么现象?
!--[if !supportLineBreakNewLine]--
!--[endif]--

是的,咱们能够做强制转化,可是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,假如强制转化是,int 类型的高 24 位将会被丢掉,byte 类型的规模是从 -128 到 128。

 

21)存在两个类,B 承继 A,C 承继 B,咱们能将 B 转化为 C 么?如 C = (C) B;(answer答案)

 

22)哪个类包括 clone 办法?是 Cloneable 仍是 Object?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

java.lang.Cloneable 是一个标明性接口,不包括任何办法,clone 办法在 object 类中界说。并且需求知道 clone() 办法是一个本地办法,这意味着它是由 c 或 c++ 或其他本地言语完成的。

 

23)Java 中 ++ 操作符是线程安全的吗?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

23)不是线程安全的操作。它涉及到多个指令,如读取变量值,添加,然后存储回内存,这个进程或许会呈现多个线程交差。

 

24)a = a + b 与 a += b 的差异(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

+= 隐式的将加操作的成果类型强制转化为持有成果的类型。假如两这个整型相加,如 byte、short 或许 int,首要会将它们提升到 int 类型,然后在履行加法操作。假如加法操作的成果比 a 的最大值要大,则 a+b 会呈现编译过错,可是 a += b 没问题,如下:
!--[if !supportLineBreakNewLine]--
!--[endif]--

byte a = 127;
!--[if !supportLineBreakNewLine]--
!--[endif]--

byte b = 127;
!--[if !supportLineBreakNewLine]--
!--[endif]--

b = a + b; // error : cannot convert from int to byte
!--[if !supportLineBreakNewLine]--
!--[endif]--

b += a; // ok
!--[if !supportLineBreakNewLine]--
!--[endif]--

(译者注:这个当地应该表述的有误,其实不管 a+b 的值为多少,编译器都会报错,由于 a+b 操作会将 a、b 提升为 int 类型,所以将 int 类型赋值给 byte 就会编译犯错)

 

25)我能在不进行强制转化的状况下将一个 double 值赋值给 long 类型的变量吗?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

不可,你不能在没有强制类型转化的前提下将一个 double 值赋值给 long 类型的变量,由于 double 类型的规模比 long 类型更广,所以必需求进行强制转化。

 

26)3*0.1 == 0.3 将会回来什么?true 仍是 false?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

false,由于有些浮点数不能彻底准确的表示出来。

 

27)int 和 Integer 哪个会占用更多的内存?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

Integer 目标会占用更多的内存。Integer 是一个目标,需求存储目标的元数据。可是 int 是一个原始类型的数据,所以占用的空间更少。

 

28)为什么 Java 中的 String 是不可变的(Immutable)?(answer答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

Java 中的 String 不可变是由于 Java 的规划者以为字符串运用十分频频,将字符串设置为不可变能够答应多个客户端之间同享相同的字符串。更详细的内容拜见答案。

 

29)咱们能在 Switch 中运用 String 吗?(answer答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

从 Java 7 开端,咱们能够在 switch case 中运用字符串,但这仅仅是一个语法糖。内部完成在 switch 中运用字符串的 hash code。

 

30)Java 中的结构器链是什么?(answer答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

当你从一个结构器中调用另一个结构器,便是Java 中的结构器链。这种状况只在重载了类的结构器的时分才会呈现。

 

JVM 底层与 GC(Garbage Collection)的面试问题

 

31)64 位 JVM 中,int 的长度是大都?
!--[if !supportLineBreakNewLine]--
!--[endif]--

Java 中,int 类型变量的长度是一个固定值,与渠道无关,都是 32 位。意思便是说,在 32 位和 64 位的Java 虚拟机中,int 类型的长度是相同的。

 

32)Serial 与 Parallel GC之间的不同之处?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

Serial 与 Parallel 在GC履行的时分都会引起 stop-the-world。它们之间首要不同 serial 搜集器是默许的仿制搜集器,履行 GC 的时分只要一个线程,而 parallel 搜集器运用多个 GC 线程来履行。

 

33)32 位和 64 位的 JVM,int 类型变量的长度是大都?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

32 位和 64 位的 JVM 中,int 类型变量的长度是相同的,都是 32 位或许 4 个字节。

 

34)Java 中 WeakReference 与 SoftReference的差异?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

尽管 WeakReference 与 SoftReference 都有利于进步 GC 和内存的功率,可是 WeakReference ,一旦失掉终究一个强引证,就会被 GC 收回,而软引证尽管不能阻挠被收回,可是能够推迟到 JVM 内存不足的时分。

 

35)WeakHashMap 是怎样作业的?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

WeakHashMap 的作业与正常的 HashMap 相似,可是运用弱引证作为 key,意思便是当 key 目标没有任何引证时,key/value 将会被收回。

 

36)JVM 选项 -XX:+UseCompressedOops 有什么效果?为什么要运用?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

当你将你的运用从 32 位的 JVM 迁移到 64 位的 JVM 时,由于目标的指针从 32 位添加到了 64 位,因而堆内存会忽然添加,差不多要翻倍。这也会对 CPU 缓存(容量比内存小许多)的数据发作晦气的影响。由于,迁移到 64 位的JVM 首要动机在于能够指定最大堆巨细,经过紧缩 OOP 能够节约必定的内存。经过 -XX:+UseCompressedOops 选项,JVM 会运用 32 位的 OOP,而不是 64 位的 OOP。

 

37)怎样经过 Java 程序来判别 JVM 是 32 位仍是 64 位?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

你能够查看某些体系特点如 sun.arch.data.model 或 os.arch 来获取该信息。

 

38)32 位 JVM 和 64 位 JVM 的最大堆内存分别是大都?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

理论上说上 32 位的 JVM 堆内存能够抵达 2^32,即 4GB,但实际上会比这个小许多。不同操作体系之间不同,如 Windows 体系大约 1.5 GB,Solaris 大约 3GB。64 位 JVM答应指定最大的堆内存,理论上能够到达 2^64,这是一个十分大的数字,实际上你能够指定堆内存巨细到 100GB。乃至有的 JVM,如 Azul,堆内存到 1000G 都是或许的。

 

39)JRE、JDK、JVM 及 JIT 之间有什么不同?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

JRE 代表 Java 运转时(Java run-time),是运转 Java 引证一切必要的。JDK 代表 Java 开发东西(Java development kit),是 Java 程序的开发东西,如 Java 编译器,它也包括 JRE。JVM 代表 Java 虚拟机(Java virtual machine),它的职责是运转 Java 运用。JIT 代表即时编译(Just In Time compilation),当代码履行的次数超越必定的阈值时,会将 Java 字节码转化为本地代码,如,首要的热门代码会被准换为本地代码,这样有利大幅度进步 Java 运用的功用。
!--[if !supportLineBreakNewLine]--
!--[endif]--

最近5年133个Java面试问题列表

 

3 年作业经历的 Java 面试题

 

40)解说 Java 堆空间及 GC?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

当经过 Java 指令发动 Java 进程的时分,会为它分配内存。内存的一部分用于创立堆空间,当程序中创立目标的时分,就从对空间中分配内存。GC 是 JVM 内部的一个进程,收回无效目标的内存用于将来的分配。
!--[if !supportLineBreakNewLine]--
!--[endif]--

最近5年133个Java面试问题列表

 

JVM 底层面试题及答案

 

41)你能确保 GC 履行吗?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

不能,尽管你能够调用 System.gc() 或许 Runtime.gc(),可是没有办法确保 GC 的履行。

 

42)怎样获取 Java 程序运用的内存?堆运用的百分比?
!--[if !supportLineBreakNewLine]--
!--[endif]--

能够经过 java.lang.Runtime 类中与内存相关办法来获取剩下的内存,总内存及最大堆内存。经过这些办法你也能够获取到堆运用的百分等到堆内存的剩下空间。Runtime.freeMemory() 办法回来剩下空间的字节数,Runtime.totalMemory() 办法总内存的字节数,Runtime.maxMemory() 回来最大内存的字节数。

 

43)Java 中堆和栈有什么差异?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

JVM 中堆和栈归于不同的内存区域,运用意图也不同。栈常用于保存办法帧和部分变量,而目标总是在堆上分配。栈一般都比堆小,也不会在多个线程之间同享,而堆被整个 JVM 的一切线程同享。

 

最近5年133个Java面试问题列表

 

关于内存的的面试问题和答案

 

Java 基本概念面试题

 

44)“a==b”和”a.equals(b)”有什么差异?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

假如 a 和 b 都是目标,则 a==b 是比较两个目标的引证,只要当 a 和 b 指向的是堆中的同一个目标才会回来 true,而 a.equals(b) 是进行逻辑比较,所以一般需求重写该办法来供给逻辑共同性的比较。例如,String 类重写 equals() 办法,所以能够用于两个不同目标,可是包括的字母相同的比较。

 

45)a.hashCode() 有什么用?与 a.equals(b) 有什么联系?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

hashCode() 办法是相应目标整型的 hash 值。它常用于依据 hash 的调集类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 办法联系特别严密。依据 Java 规范,两个运用 equal() 办法来判别持平的目标,有必要具有相同的 hash code。

 

46)final、finalize 和 finally 的不同之处?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

final 是一个润饰符,能够润饰变量、办法和类。假如 final 润饰变量,意味着该变量的值在初始化后不能被改动。finalize 办法是在目标被收回之前调用的办法,给目标自己终究一个复生的时机,可是什么时分调用 finalize 没有确保。finally 是一个要害字,与 try 和 catch 一同用于反常的处理。finally 块必定会被履行,不管在 try 块中是否有发作反常。

 

47)Java 中的编译期常量是什么?运用它又什么危险?
!--[if !supportLineBreakNewLine]--
!--[endif]--

公共静态不可变(public static final )变量也便是咱们所说的编译期常量,这儿的 public 可选的。实际上这些变量在编译时会被替换掉,由于编译器知道这些变量的值,并且知道这些变量在运转时不能改动。这种办法存在的一个问题是你运用了一个内部的或第三方库中的公有编译时常量,可是这个值后边被其他人改动了,可是你的客户端依然在运用老的值,乃至你现已布置了一个新的jar。为了防止这种状况,当你在更新依靠 JAR 文件时,确保从头编译你的程序。

 

Java 调集结构的面试题

 

这部分也包括数据结构、算法及数组的面试问题

 

 

!--[if !supportLists]-- 48. !--[endif]-- List、Set、Map 和 Queue 之间的差异(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

!--[if !supportLists]-- 49. !--[endif]-- List 是一个有序调集,答应元素重复。它的某些完成能够供给依据下标值的常量拜访时刻,可是这不是 List 接口确保的。Set 是一个无序调集。

 

 

49)poll() 办法和 remove() 办法的差异?
!--[if !supportLineBreakNewLine]--
!--[endif]--

poll() 和 remove() 都是从行列中取出一个元素,可是 poll() 在获取元素失利的时分会回来空,可是 remove() 失利的时分会抛出反常。

 

50)Java 中 LinkedHashMap 和 PriorityQueue 的差异是什么?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

PriorityQueue 确保最高或许最低优先级的的元素总是在行列头部,可是 LinkedHashMap 保持的次序是元素刺进的次序。当遍历一个 PriorityQueue 时,没有任何次序确保,可是 LinkedHashMap 课确保遍历次序是元素刺进的次序。

 

51)ArrayList 与 LinkedList 的不差异?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

最显着的差异是 ArrrayList 底层的数据结构是数组,支撑随机拜访,而 LinkedList 的底层数据结构书链表,不支撑随机拜访。运用下标拜访一个元素,ArrayList 的时刻杂乱度是 O(1),而 LinkedList 是 O(n)。更多细节的评论拜见答案。

 

52)用哪两种办法来完成调集的排序?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

你能够运用有序调集,如 TreeSet 或 TreeMap,你也能够运用有次序的的调集,如list,然后经过 Collections.sort() 来排序。

 

53)Java 中怎样打印数组?(answer答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

你能够运用 Arrays.toString() 和 Arrays.deepToString() 办法来打印数组。由于数组没有完成 toString() 办法,所以假如将数组传递给 System.out.println() 办法,将无法打印出数组的内容,可是 Arrays.toString() 能够打印每个元素。

 

54)Java 中的 LinkedList 是单向链表仍是双向链表?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

是双向链表,你能够查看 JDK 的源码。在 Eclipse,你能够运用快捷键 Ctrl + T,直接在编辑器中翻开该类。

 

55)Java 中的 TreeMap 是选用什么树完成的?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

Java 中的 TreeMap 是运用红黑树完成的。

 

 

!--[if !supportLists]-- 56. !--[endif]-- Hashtable 与 HashMap 有什么不同之处?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

!--[if !supportLists]-- 57. !--[endif]-- 这两个类有许多不同的当地,下面列出了一部分:
!--[if !supportLineBreakNewLine]--
!--[endif]--

!--[if !supportLists]-- 58. !--[endif]-- a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来添加的。
!--[if !supportLineBreakNewLine]--
!--[endif]--

!--[if !supportLists]-- 59. !--[endif]-- b)Hashtable 是同步的,比较慢,但 HashMap 没有同步战略,所以会更快。
!--[if !supportLineBreakNewLine]--
!--[endif]--

!--[if !supportLists]-- 60. !--[endif]-- c)Hashtable 不答应有个空的 key,可是 HashMap 答应呈现一个 null key。
!--[if !supportLineBreakNewLine]--
!--[endif]--

!--[if !supportLists]-- 61. !--[endif]-- 更多的不同之处拜见答案。

 

 

57)Java 中的 HashSet,内部是怎样作业的?(answer答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

HashSet 的内部选用 HashMap来完成。由于 Map 需求 key 和 value,所以一切 key 的都有一个默许 value。相似于 HashMap,HashSet 不答应重复的 key,只答应有一个null key,意思便是 HashSet 中只答应存储一个 null 目标。

 

58)写一段代码在遍历 ArrayList 时移除一个元素?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

该问题的要害在于面试者运用的是 ArrayList 的 remove() 仍是 Iterator 的 remove()办法。这有一段示例代码,是运用正确的办法来完成在遍历的进程中移除元素,而不会呈现 ConcurrentModificationException 反常的示例代码。

 

59)咱们能自己写一个容器类,然后运用 for-each 循环码?
!--[if !supportLineBreakNewLine]--
!--[endif]--

能够,你能够写一个自己的容器类。假如你想运用 Java 中增强的循环来遍历,你只需求完成 Iterable 接口。假如你完成 Collection 接口,默许就具有该特点。

 

60)ArrayList 和 HashMap 的默许巨细是大都?(答案)

 

在 Java 7 中,ArrayList 的默许巨细是 10 个元素,HashMap 的默许巨细是16个元素(有必要是2的幂)。这便是 Java 7 中 ArrayList 和 HashMap 类的代码片段:

 

// from ArrayList.java JDK 1.7
!--[if !supportLineBreakNewLine]--
!--[endif]--

private static final int DEFAULT_CAPACITY = 10;

 

//from HashMap.java JDK 7
!--[if !supportLineBreakNewLine]--
!--[endif]--

static final int DEFAULT_INITIAL_CAPACITY = 1 4; // aka 16
!--[if !supportLineBreakNewLine]--
!--[endif]--

61)有没有或许两个不持平的目标有有相同的 hashcode?
!--[if !supportLineBreakNewLine]--
!--[endif]--

有或许,两个不持平的目标或许会有相同的 hashcode 值,这便是为什么在 hashmap 中会有抵触。持平 hashcode 值的规矩仅仅说假如两个目标持平,有必要有相同的hashcode 值,可是没有关于不持平目标的任何规矩。

 

62)两个相同的目标会有不同的的 hash code 吗?
!--[if !supportLineBreakNewLine]--
!--[endif]--

不能,依据 hash code 的规矩,这是不或许的。

 

63)咱们能够在 hashcode() 中运用随机数字吗?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

不可,由于目标的 hashcode 值有必要是相同的。拜见答案获取更多关于 Java 中重写 hashCode() 办法的常识。

 

64)Java 中,Comparator 与 Comparable 有什么不同?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

Comparable 接口用于界说目标的天然次序,而 comparator 一般用于界说用户定制的次序。Comparable 总是只要一个,可是能够有多个 comparator 来界说目标的次序。

 

65)为什么在重写 equals 办法的时分需求重写 hashCode 办法?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

由于有强制的规范指定需求一同重写 hashcode 与 equal 是办法,许多容器类,如 HashMap、HashSet 都依靠于 hashcode 与 equals 的规矩。

 

Java IO 和 NIO 的面试题

 

IO 是 Java 面试中一个十分重要的点。你应该很好把握 Java IO,NIO,NIO2 以及与操作体系,磁盘 IO 相关的根底常识。下面是 Java IO 中常常问的问题。

 

66)在我 Java 程序中,我有三个 socket,我需求多少个线程来处理?

 

67)Java 中怎样创立 ByteBuffer?

 

68)Java 中,怎样读写 ByteBuffer ?

 

69)Java 选用的是大端仍是小端?

 

70)ByteBuffer 中的字节序是什么?

 

71)Java 中,直接缓冲区与非直接缓冲器有什么差异?(答案)

 

72)Java 中的内存映射缓存区是什么?(answer答案)

 

73)socket 选项 TCP NO DELAY 是指什么?

 

74)TCP 协议与 UDP 协议有什么差异?(answer答案)

 

75)Java 中,ByteBuffer 与 StringBuffer有什么差异?(答案)

 

Java 最佳实践的面试问题

 

包括 Java 中各个部分的最佳实践,如调集,字符串,IO,多线程,过错和反常处理,规划办法等等。

 

76)Java 中,编写多线程程序的时分你会遵从哪些最佳实践?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

这是我在写Java 并发程序的时分遵从的一些最佳实践:
!--[if !supportLineBreakNewLine]--
!--[endif]--

a)给线程命名,这样能够协助调试。
!--[if !supportLineBreakNewLine]--
!--[endif]--

b)最小化同步的规模,而不是将整个办法同步,只对要害部分做同步。
!--[if !supportLineBreakNewLine]--
!--[endif]--

c)假如能够,更倾向于运用 volatile 而不是 synchronized。
!--[if !supportLineBreakNewLine]--
!--[endif]--

d)运用更高层次的并发东西,而不是运用 wait() 和 notify() 来完成线程间通讯,如 BlockingQueue,CountDownLatch 及 Semeaphore。
!--[if !supportLineBreakNewLine]--
!--[endif]--

e)优先运用并发调集,而不是对调集进行同步。并发调集供给更好的可扩展性。

 

77)说出几点 Java 中运用 Collections 的最佳实践(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

这是我在运用 Java 中 Collectionc 类的一些最佳实践:
!--[if !supportLineBreakNewLine]--
!--[endif]--

a)运用正确的调集类,例如,假如不需求同步列表,运用 ArrayList 而不是 Vector。
!--[if !supportLineBreakNewLine]--
!--[endif]--

b)优先运用并发调集,而不是对调集进行同步。并发调集供给更好的可扩展性。
!--[if !supportLineBreakNewLine]--
!--[endif]--

c)运用接口代表和拜访调集,如运用List存储 ArrayList,运用 Map 存储 HashMap 等等。
!--[if !supportLineBreakNewLine]--
!--[endif]--

d)运用迭代器来循环调集。
!--[if !supportLineBreakNewLine]--
!--[endif]--

e)运用调集的时分运用泛型。

 

78)说出至少 5 点在 Java 中运用线程的最佳实践。(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

这个问题与之前的问题相似,你能够运用上面的答案。对线程来说,你应该:
!--[if !supportLineBreakNewLine]--
!--[endif]--

a)对线程命名
!--[if !supportLineBreakNewLine]--
!--[endif]--

b)将线程和使命别离,运用线程池履行器来履行 Runnable 或 Callable。
!--[if !supportLineBreakNewLine]--
!--[endif]--

c)运用线程池

 

79)说出 5 条 IO 的最佳实践(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

IO 对 Java 运用的功用十分重要。抱负状况下,你不该该在你运用的要害途径上防止 IO 操作。下面是一些你应该遵从的 Java IO 最佳实践:
!--[if !supportLineBreakNewLine]--
!--[endif]--

a)运用有缓冲区的 IO 类,而不要独自读取字节或字符。
!--[if !supportLineBreakNewLine]--
!--[endif]--

b)运用 NIO 和 NIO2
!--[if !supportLineBreakNewLine]--
!--[endif]--

c)在 finally 块中封闭流,或许运用 try-with-resource 句子。
!--[if !supportLineBreakNewLine]--
!--[endif]--

d)运用内存映射文件获取更快的 IO。

 

80)列出 5 个应该遵从的 JDBC 最佳实践(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

有许多的最佳实践,你能够依据你的喜好来例举。下面是一些更通用的准则:
!--[if !supportLineBreakNewLine]--
!--[endif]--

a)运用批量的操作来刺进和更新数据
!--[if !supportLineBreakNewLine]--
!--[endif]--

b)运用 PreparedStatement 来防止 SQL 反常,并进步功用。
!--[if !supportLineBreakNewLine]--
!--[endif]--

c)运用数据库衔接池
!--[if !supportLineBreakNewLine]--
!--[endif]--

d)经过列名来获取成果集,不要运用列的下标来获取。

 

81)说出几条 Java 中办法重载的最佳实践?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

下面有几条能够遵从的办法重载的最佳实践来防止形成主动装箱的紊乱。
!--[if !supportLineBreakNewLine]--
!--[endif]--

a)不要重载这样的办法:一个办法接纳 int 参数,而另个办法接纳 Integer 参数。
!--[if !supportLineBreakNewLine]--
!--[endif]--

b)不要重载参数数量共同,而仅仅参数次序不同的办法。
!--[if !supportLineBreakNewLine]--
!--[endif]--

c)假如重载的办法参数个数多于 5 个,选用可变参数。

 

Date、Time 及 Calendar 的面试题

 

82)在多线程环境下,SimpleDateFormat 是线程安全的吗?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

不是,十分不幸,DateFormat 的一切完成,包括 SimpleDateFormat 都不是线程安全的,因而你不该该在多线程序中运用,除非是在对外线程安全的环境中运用,如将 SimpleDateFormat 约束在 ThreadLocal 中。假如你不这么做,在解析或许格局化日期的时分,或许会获取到一个不正确的成果。因而,从日期、时刻处理的一切实践来说,我强力引荐 joda-time 库。

 

83)Java 中怎样格局化一个日期?如格局化为 ddMMyyyy 的办法?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

Java 中,能够运用 SimpleDateFormat 类或许 joda-time 库来格局日期。DateFormat 类答应你运用多种盛行的格局来格局化日期。拜见答案中的示例代码,代码中演示了将日期格局化成不同的格局,如 dd-MM-yyyy 或 ddMMyyyy。

 

84)Java 中,怎样在格局化的日期中显现时区?(答案)

 

85)Java 中 java.util.Date 与 java.sql.Date 有什么差异?(答案)

 

86)Java 中,怎样核算两个日期之间的距离?(程序)

 

87)Java 中,怎样将字符串 YYYYMMDD 转化为日期?(答案)

 

单元测验 JUnit 面试题

 

89)怎样测验静态办法?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

能够运用 PowerMock 库来测验静态办法。

 

90)怎样运用 JUnit 来测验一个办法的反常?(答案)

 

91)你运用过哪个单元测验库来测验你的 Java 程序?(答案)

 

92)@Before 和 @BeforeClass 有什么差异?(答案)

 

编程和代码相关的面试题

 

93)怎样查看一个字符串只包括数字?(处理方案)

 

94)Java 中怎样运用泛型写一个 LRU 缓存?(答案 )

 

95)写一段 Java 程序将 byte 转化为 long?(答案)

 

95)在不运用 StringBuffer 的前提下,怎样回转一个字符串?(处理方案)

 

97)Java 中,怎样获取一个文件中单词呈现的最高频率?(处理方案)

 

98)怎样查看出两个给定的字符串是反序的?(处理方案)

 

99)Java 中,怎样打印出一个字符串的一切摆放?(处理方案)

 

100)Java 中,怎样才干打印出数组中的重复元素?(处理方案)

 

101)Java 中怎样将字符串转化为整数?(处理方案)

 

102)在没有运用暂时变量的状况怎样交流两个整数变量的值?(处理方案)

 

关于 OOP 和规划办法的面试题

 

这部分包括 Java 面试进程中关于 SOLID 的规划准则,OOP 根底,如类,目标,接口,承继,多态,封装,笼统以及更高档的一些概念,如组合、聚合及相关。也包括了 GOF 规划办法的问题。

 

103)接口是什么?为什么要运用接口而不是直接运用详细类?
!--[if !supportLineBreakNewLine]--
!--[endif]--

接口用于界说 API。它界说了类有必要得遵从的规矩。一同,它供给了一种笼统,由于客户端只运用接口,这样能够有多重完成,如 List 接口,你能够运用可随机拜访的 ArrayList,也能够运用方便刺进和删去的 LinkedList。接口中不答应写代码,以此来确保笼统,可是 Java 8 中你能够在接口声明静态的默许办法,这种办法是详细的。

 

104)Java 中,笼统类与接口之间有什么不同?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

Java 中,笼统类和接口有许多不同之处,可是最重要的一个是 Java 中约束一个类只能承继一个类,可是能够完成多个接口。笼统类能够很好的界说一个家族类的默许行为,而接口能更好的界说类型,有助于后边完成多态机制。关于这个问题的评论请查看答案。

 

105)除了单例办法,你在出产环境中还用过什么规划办法?
!--[if !supportLineBreakNewLine]--
!--[endif]--

这需求依据你的经历来答复。一般状况下,你能够说依靠注入,工厂办法,装修办法或许观察者办法,随意挑选你运用过的一种即可。不过你要预备答复接下的依据你挑选的办法的问题。

 

106)你能解说一下里氏替换准则吗?(答案)

 

 

!--[if !supportLists]-- 107.  !--[endif]-- 什么状况下会违背迪米特规律?为什么会有这个问题?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

!--[if !supportLists]-- 108.  !--[endif]-- 迪米特规律主张“只和朋友说话,不要陌生人说话”,以此来削减类之间的耦合。

 

 

108)适配器办法是什么?什么时分运用?
!--[if !supportLineBreakNewLine]--
!--[endif]--

适配器办法供给对接口的转化。假如你的客户端运用某些接口,可是你有别的一些接口,你就能够写一个适配去来衔接这些接口。

 

109)什么是“依靠注入”和“操控回转”?为什么有人运用?(答案)

 

110)笼统类是什么?它与接口有什么差异?你为什么要运用过笼统类?(答案)

 

111)结构器注入和 setter 依靠注入,那种办法更好?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

每种办法都有它的缺陷和长处。结构器注入确保一切的注入都被初始化,可是 setter 注入供给更好的灵敏性来设置可选依靠。假如运用 XML 来描绘依靠,Setter 注入的可读写会更强。经历规律是强制依靠运用结构器注入,可选依靠运用 setter 注入。

 

112)依靠注入和工程办法之间有什么不同?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

尽管两种办法都是将目标的创立从运用的逻辑中别离,可是依靠注入比工程办法更明晰。经过依靠注入,你的类便是 POJO,它只知道依靠而不关怀它们怎样获取。运用工厂办法,你的类需求经过工厂来获取依靠。因而,运用 DI 会比运用工厂办法更简略测验。关于这个论题的更详细评论请拜见答案。

 

113)适配器办法和装修器办法有什么差异?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

尽管适配器办法和装修器办法的结构相似,可是每种办法的呈现意图不同。适配器办法被用于桥接两个接口,而装修办法的意图是在不修正类的状况下给类添加新的功用。

 

114)适配器办法和署理办法之前有什么不同?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

这个问题与前面的相似,适配器办法和署理办法的差异在于他们的意图不同。由于适配器办法和署理办法都是封装真实履行动作的类,因而结构是共同的,可是适配器办法用于接口之间的转化,而署理办法则是添加一个额定的中间层,以便支撑分配、操控或智能拜访。

 

115)什么是模板办法办法?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

模板办法供给算法的结构,你能够自己去装备或界说进程。例如,你能够将排序算法看做是一个模板。它界说了排序的进程,可是详细的比较,能够运用 Comparable 或许其言语中相似东西,详细战略由你去装备。列出算法概要的办法便是众所周知的模板办法。

 

116)什么时分运用拜访者办法?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

拜访者办法用于处理在类的承继层次上添加操作,可是不直接与之相关。这种办法选用双派发的办法来添加中间层。

 

117)什么时分运用组合办法?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

组合办法运用树结构来展现部分与全体承继联系。它答应客户端选用共同的办法来对待单个目标和目标容器。当你想要展现目标这种部分与全体的承继联系时选用组合办法。

 

118)承继和组合之间有什么不同?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

尽管两种都能够完成代码复用,可是组合比承继共灵敏,由于组合答应你在运转时挑选不同的完成。用组合完成的代码也比承继测验起来愈加简略。

 

119)描绘 Java 中的重载和重写?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

重载和重写都答应你用相同的称号来完成不同的功用,可是重载是编译时活动,而重写是运转时活动。你能够在同一个类中重载办法,可是只能在子类中重写办法。重写必需求有承继。

 

120)Java 中,嵌套公共静态类与尖端类有什么不同?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

类的内部能够有多个嵌套公共静态类,可是一个 Java 源文件只能有一个尖端公共类,并且尖端公共类的称号与源文件称号有必要共同。

 

 

!--[if !supportLists]-- 121.  !--[endif]-- OOP 中的组合、聚合和相关有什么差异?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

!--[if !supportLists]-- 122.  !--[endif]-- 假如两个目标互相有联系,就说他们是互相相相关的。组合和聚合是面向目标中的两种办法的相关。组合是一种比聚合更强力的相关。组合中,一个目标是另一个的具有者,而聚合则是指一个目标运用另一个目标。假如目标 A 是由目标 B 组合的,则 A 不存在的话,B必定不存在,可是假如 A 目标聚合了一个目标 B,则即便 A 不存在了,B 也能够独自存在。

 

 

122)给我一个契合开闭准则的规划办法的比如?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

开闭准则要求你的代码对扩展敞开,对修正封闭。这个意思便是说,假如你想添加一个新的功用,你能够很简略的在不改动已测验过的代码的前提下添加新的代码。有好几个规划办法是依据开闭准则的,如战略办法,假如你需求一个新的战略,只需求完成接口,添加装备,不需求改动中心逻辑。一个正在作业的比如是 Collections.sort() 办法,这便是依据战略办法,遵从开闭准则的,你不需为新的目标修正 sort() 办法,你需求做的仅仅是完成你自己的 Comparator 接口。

 

123)笼统工厂办法和原型办法之间的差异?(答案)

 

124)什么时分运用享元办法?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

享元办法经过同享目标来防止创立太多的目标。为了运用享元办法,你需求确保你的目标是不可变的,这样你才干安全的同享。JDK 中 String 池、Integer 池以及 Long 池都是很好的运用了享元办法的比如。

 

Java 面试中其他林林总总的问题

 

这部分包括 Java 中关于 XML 的面试题,JDBC 面试题,正则表达式面试题,Java 过错和反常及序列化面试题

 

125)嵌套静态类与尖端类有什么差异?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

一个公共的尖端类的源文件称号与类名相同,而嵌套静态类没有这个要求。一个嵌套类坐落尖端类内部,需求运用尖端类的称号来引证嵌套静态类,如 HashMap.Entry 是一个嵌套静态类,HashMap 是一个尖端类,Entry是一个嵌套静态类。

 

126)你能写出一个正则表达式来判别一个字符串是否是一个数字吗?(处理方案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

一个数字字符串,只能包括数字,如 0 到 9 以及 +、- 最初,经过这个信息,你能够下一个如下的正则表达式来判别给定的字符串是不是数字。

 

127)Java 中,受查看反常和不受查看反常的差异?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

受查看反常编译器在编译期间查看。关于这种反常,办法强制处理或许经过 throws 子句声明。其间一种状况是 Exception 的子类但不是 RuntimeException 的子类。非受查看是 RuntimeException 的子类,在编译阶段不受编译器的查看。

 

128)Java 中,throw 和 throws 有什么差异?(答案)

 

throw 用于抛出 java.lang.Throwable 类的一个实例化目标,意思是说你能够经过要害字 throw 抛出一个 Error 或许一个Exception,如:
!--[if !supportLineBreakNewLine]--
!--[endif]--

throw new IllegalArgumentException(“size must be multiple of 2″)

 

而throws 的效果是作为办法声明和签名的一部分,办法被抛出相应的反常以便调用者能处理。Java 中,任何未处理的受查看反常强制在 throws 子句中声明。

 

129)Java 中,Serializable 与 Externalizable 的差异?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

Serializable 接口是一个序列化 Java 类的接口,以便于它们能够在网络上传输或许能够将它们的状况保存在磁盘上,是 JVM 内嵌的默许序列化办法,本钱高、软弱并且不安全。Externalizable 答应你操控整个序列化进程,指定特定的二进制格局,添加安全机制。

 

130)Java 中,DOM 和 SAX 解析器有什么不同?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

DOM 解析器将整个 XML 文档加载到内存来创立一棵 DOM 模型树,这样能够更快的查找节点和修正 XML 结构,而 SAX 解析器是一个依据工作的解析器,不会将整个 XML 文档加载到内存。由于这个原因,DOM 比 SAX 更快,也要求更多的内存,不适合于解析大 XML 文件。

 

131)说出 JDK 1.7 中的三个新特性?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

尽管 JDK 1.7 不像 JDK 5 和 8 相同的大版别,可是,仍是有许多新的特性,如 try-with-resource 句子,这样你在运用流或许资源的时分,就不需求手动封闭,Java 会主动封闭。Fork-Join 池某种程度上完成 Java 版的 Map-reduce。答应 Switch 中有 String 变量和文本。菱形操作符( )用于类型揣度,不再需求在变量声明的右边声明泛型,因而能够写出可读写更强、更简练的代码。另一个值得一提的特性是改进反常处理,如答应在同一个 catch 块中捕获多个反常。

 

132)说出 5 个 JDK 1.8 引进的新特性?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

Java 8 在 Java 历史上是一个开立异的版别,下面 JDK 8 中 5 个首要的特性:
!--[if !supportLineBreakNewLine]--
!--[endif]--

Lambda 表达式,答应像目标相同传递匿名函数
!--[if !supportLineBreakNewLine]--
!--[endif]--

Stream API,充分运用现代多核 CPU,能够写出很简练的代码
!--[if !supportLineBreakNewLine]--
!--[endif]--

Date 与 Time API,终究,有一个安稳、简略的日期和时刻库可供你运用
!--[if !supportLineBreakNewLine]--
!--[endif]--

扩展办法,现在,接口中能够有静态、默许办法。
!--[if !supportLineBreakNewLine]--
!--[endif]--

重复注解,现在你能够将相同的注解在同一类型上运用屡次。

 

133)Java 中,Maven 和 ANT 有什么差异?(答案)
!--[if !supportLineBreakNewLine]--
!--[endif]--

尽管两者都是构建东西,都用于创立 Java 运用,可是 Maven 做的工作更多,在依据“约好优于装备”的概念下,供给规范的Java 项目结构,一同能为运用主动办理依靠(运用中所依靠的 JAR 文件),Maven 与 ANT 东西更多的不同之处请拜见答案。

 

这便是一切的面试题,如此之多,是不是?我能够确保,假如你能答复列表中的一切问题,你就能够很轻松的敷衍任何中心 Java 或许高档 Java 面试。尽管,这儿没有包括 Servlet、JSP、JSF、JPA,JMS,EJB 及其它 Java EE 技能,也没有包括干流的结构如 Spring MVC,Struts 2.0,Hibernate,也没有包括 SOAP 和 RESTful web service,可是这份列表对做 Java 开发的、预备应聘 Java web 开发职位的人仍是相同有用的,由于一切的 Java 面试,开端的问题都是 Java 根底和 JDK API 相关的。假如你以为我这儿有任何应该在这份列表中而被我遗漏了的 Java 盛行的问题,你能够自在的给我主张。我的意图是从最近的面试中创立一份最新的、最优的 Java 面试问题列表。

 

Java EE 相关的面试题

 

为了做 Java EE 的朋友,这儿列出了一些 web 开发的特定问题,你们能够用来预备 JEE 部分的面试:

 

10 大 Spring 结构面试题及答案(拜见)
!--[if !supportLineBreakNewLine]--
!--[endif]--

10 个十分好的 XML 面试问题(Java 程序员)(拜见)
!--[if !supportLineBreakNewLine]--
!--[endif]--

20 个十分好的规划办法面试问题(拜见)
!--[if !supportLineBreakNewLine]--
!--[endif]--

10个最盛行的 Struts 面试题(Java 开发者)(拜见)
!--[if !supportLineBreakNewLine]--
!--[endif]--

20 个 Tibco Rendezvous 及 EMS 的面试题(更多)
!--[if !supportLineBreakNewLine]--
!--[endif]--

10 个最频频被问到的 Servlet 面试问题及答案(拜见)
!--[if !supportLineBreakNewLine]--
!--[endif]--

20 个 jQuery 面试问题(Java Web 开发者)(列表)
!--[if !supportLineBreakNewLine]--
!--[endif]--

10 个十分好的 Oracle 面试问题(Java 开发者)(拜见)
!--[if !supportLineBreakNewLine]--
!--[endif]--

10 大来自 J2EE 面试中的 JSP 问题(更多)
!--[if !supportLineBreakNewLine]--
!--[endif]--

12 个很好的 RESTful Web Services 面试问题(拜见)
!--[if !supportLineBreakNewLine]--
!--[endif]--

10 大 EJB 面试问题及答案(拜见)
!--[if !supportLineBreakNewLine]--
!--[endif]--

10 大 JMS 及 MQ 系列面试题及答案(列表)
!--[if !supportLineBreakNewLine]--
!--[endif]--

10 个十分好 Hibernate 面试问题

 

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    java元数据(metadata)ITeye

    数据,注解,一个
  • 2

    java awt Graphics 绘图ITeye

    字符串,二维码,图片
  • 3

    slf4jITeye

    日志,运用,一个
  • 4
  • 5

    spring+mybatis装备ITeye

    装备,一下,需求
  • 6

    文件的读写和操作ITeye

    文件,字节,输出
  • 7

    ubuntu下python办理ITeye

    能够,咱们,经过
  • 8

    第03章 惯例选择器 (2)ITeye

    主页,选择器,运用
  • 9

    zookeeper原理(转)ITeye

    节点,集群,一个
  • 10