志在指尖
用双手敲打未来

比较难的java经典面试题及答案

一个扎手的Java问题,假如Java编程言语不是你规划的,你怎么能答复这个问题呢。Java编程的常识和深化了解有助于答复这种扎手的Java核心方面的面试问题。
为什么wait,notify和notifyAll是在Object类中界说的而不是在Thread类中界说
这是有名的Java面试问题,招2~4年经历的到高级Java开发人员面试都或许碰到。
这个问题的好在它能反映了面试者对等候通知机制的了解,以及他对此主题的理解是否明确。就像为什么Java中不支撑多承继或者为什么String在Java中是final的问题相同,这个问题也或许有多个答案。
为什么在Object类中界说wait和notify办法,每个人都能说出一些理由。从我的面试经历来看,wait和nofity仍然是大多数Java程序员最困惑的,特别是2到3年的开发人员,假如他们要求运用wait和notify,他们会很困惑。因而,假如你去参加Java面试,请确保对wait和notify机制有充沛的了解,而且能够轻松地运用wait来编写代码,并经过生产者-消费者问题或完成阻塞行列等了解通知的机制。
为什么等候和通知需求从同步块或办法中调用,以及Java中的wait,sleep和yield办法之间的差异,假如你还没有读过,你会觉得风趣。为何wait,notify和notifyAll属于Object类?为什么它们不应该在Thread类中?以下是我以为有含义的一些主意:
1)wait和notify不仅仅是一般办法或同步东西,更重要的是它们是Java中两个线程之间的通讯机制。对言语规划者而言,假如不能经过Java关键字(例如synchronized)完成通讯此机制,同时又要确保这个机制对每个方针可用,那么Object类则是的正确声明位置。记住同步和等候通知是两个不同的范畴,不要把它们看成是相同的或相关的。同步是供给互斥并确保Java类的线程安全,而wait和notify是两个线程之间的通讯机制。
2)每个方针都可上锁,这是在Object类而不是Thread类中声明wait和notify的另一个原因。
3)在Java中为了进入代码的临界区,线程需求确定并等候确定,他们不知道哪些线程持有锁,而仅仅知道锁被某个线程持有,而且他们应该等候获得锁,而不是去了解哪个线程在同步块内,并恳求它们开释确定。
4)Java是根据Hoare的监视器的思想(http://en.wikipedia.org/wiki/…。在Java中,一切方针都有一个监视器。
线程在监视器上等候,为履行等候,咱们需求2个参数:
一个线程
一个监视器(任何方针)
在Java规划中,线程不能被指定,它总是运行当前代码的线程。但是,咱们能够指定监视器(这是咱们称之为等候的方针)。这是一个很好的规划,因为假如咱们能够让任何其他线程在所需的监视器上等候,这将导致“侵略”,导致在规划并发程序时会遇到困难。请记住,在Java中,一切在另一个线程的履行中侵入的操作都被弃用了(例如stop办法)。
为什么Java不支撑运算符重载?
另一个相似扎手的Java问题。为什么C++支撑运算符重载而Java不支撑?有人或许会说+运算符在Java中已被重载用于字符串连接,不要被这些论据所欺骗。
与C++不同,Java不支撑运算符重载。Java不能为程序员供给自在的标准算术运算符重载,例如+,-,*和/等。假如你曾经用过C++,那么Java与C++比较少了很多功用,例如Java不支撑多重承继,Java中没有指针,Java中没有引证传递。另一个相似的问题是关于Java经过引证传递,这首要表现为Java是经过值仍是引证传参。尽管我不知道背后的真实原因,但我以为以下说法有些道理,为什么Java不支撑运算符重载。
1)简略性和明晰性。明晰性是Java规划者的方针之一。规划者不是只想复制言语,而是希望具有一种明晰,真实面向方针的言语。添加运算符重载比没有它肯定会使规划更杂乱,而且它或许导致更杂乱的编译器,或减慢JVM,因为它需求做额定的工作来辨认运算符的实际含义,并削减优化的时机,以确保Java中运算符的行为。
2)避免编程错误。Java不允许用户界说的运算符重载,因为假如允许程序员进行运算符重载,将为同一运算符赋予多种含义,这将使任何开发人员的学习曲线变得峻峭,工作变得更加混乱。据观察,当言语支撑运算符重载时,编程错误解添加,然后添加了开发和交付时间。因为Java和JVM已经承担了大多数开发人员的职责,如在经过供给废物收集器进行内存办理时,因为这个功用添加污染代码的时机,成为编程错误之源,因而没有多大含义。
3)JVM杂乱性。从JVM的角度来看,支撑运算符重载使问题变得更加困难。经过更直观,更干净的办法运用办法重载也能完成相同的工作,因而不支撑Java中的运算符重载是有含义的。与相对简略的JVM比较,杂乱的JVM或许导致JVM更慢,并为确保在Java中运算符行为确实定性然后削减了优化代码的时机。
4)让开发东西处理更简单。这是在Java中不支撑运算符重载的另一个优点。省掉运算符重载使言语更简单处理,这反过来又更简单开发处理言语的东西,例如IDE或重构东西。Java中的重构东西远胜于C++。
为什么char数组比Java中的String更适合存储暗码?
另一个根据String的扎手Java问题,相信我只有很少的Java程序员能够正确答复这个问题。这是一个真实艰难的核心Java面试问题,而且需求对String的扎实知识才干答复这个问题。
这是最近在Java面试中向我的一位朋友问询的问题。他正在接受技能主管职位的面试,而且有超越6年的经历。假如你还没有遇到过这种状况,那么字符数组和字符串能够用来存储文本数据,但是挑选一个而不是另一个很难。但正如我的朋友所说,任何与String相关的问题都必须对字符串的特殊特点有一些线索,比方不变性,他用它来说服访发问的人。在这里,咱们将讨论为什么你应该运用char[]存储暗码而不是String的一些原因。
字符串:1)因为字符串在Java中是不可变的,假如你将暗码存储为纯文本,它将在内存中可用,直到废物收集器清除它.而且为了可重用性,会存在String在字符串池中,它很或许会保留在内存中持续很长时间,然后构成安全威胁。
因为任何有权拜访内存转储的人都能够以明文方式找到暗码,这是另一个原因,你应该一直运用加密暗码而不是纯文本。因为字符串是不可变的,所以不能更改字符串的内容,因为任何更改都会发生新的字符串,而假如你运用char[],你就能够将一切元素设置为空白或零。因而,在字符数组中存储暗码能够显着下降窃取暗码的安全危险。
2)Java自身主张运用JPasswordField的getPassword()办法,该办法回来一个char[]和不引荐运用的getTex()办法,该办法以明文方式回来暗码,因为安全原因。应遵循Java团队的主张,坚持标准而不是反对它。
3)运用String时,总是存在在日志文件或操控台中打印纯文本的危险,但假如运用Array,则不会打印数组的内容而是打印其内存位置。尽管不是一个真实的原因,但仍然有道理。
StringstrPassword=“Unknown”;
char[]charPassword=newchar[]{‘U’,’n’,’k’,’w’,’o’,’n’};
System.out.println(“字符暗码:”+strPassword);
System.out.println(“字符暗码:”+charPassword);
输出
字符串暗码:Unknown
我还主张运用散列或加密的暗码而不是纯文本,并在验证完成后立即从内存中清除它。因而,在Java中,用字符数组用存储暗码比字符串是更好的挑选。尽管仅运用char[]还不行,还你需求擦除内容才干更安全。
以上便是小编介绍的“比较难的java经典面试题及答案”的内容,希望对我们有帮助,关注动力节点,想了解更多Java技能知识留言给小编。

未经允许不得转载:IT技术网站 » 比较难的java经典面试题及答案
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载