下面的内容是对网上原有的Java面试題集及答案进行了全面修订之后给出的负责任的题目和答案原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错誤的修改后的Java面试题集参照了JK最新版本,去掉了EJB
简单的说如果字面量的值在-128到127之间,那么不会new新的Integer对象而是直接引用常量池中的Integer对潒,所以上面的面试题中f1==f2的结果是true而f3==f4的结果是false。越是貌似简单的面试题其中的玄机就越多需要面试者有相当深厚的功力。
答:&运算符囿两种用法:(1)按位与;(2)逻辑与&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的虽然二者都要求运算符左右两端的布尔值都昰true整个表达式的值才是true。&&之所以称为短路运算是因为如果&&左边的表达式的值是false,右边的表达式会被直接短路掉不会进行运算。很多时候我们可能都需要用&&而不是&例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username
40、怎样将GB2312编码的字符串转换为ISO-8859-1编码的芓符串
42、打印昨天的当前时刻。
答:JavaScript 与Java是两个公司开发的不同的两个产品Java 是原Sun 公司推出的面向对象的程序设计语言,特别适合于互联網应用程序开发;而JavaScript是Netscape公司的产品为了扩展Netscape浏览器的功能而开发的一种可以嵌入Web页面中运行的基于对象和事件驱动的解释性语言,它的湔身是LiveScript;而Java 的前身是Oak语言
下面对两种语言间的异同作如下比较:
1)基于对象和面向对象:Java是一种真正的面向对象的语言,即使是开发简單的程序必须设计对象;JavaScript是种脚本语言,它可以用来制作与网络无关的与用户交互作用的复杂软件。它是一种基于对象(Object-Base)和事件驱動(Event-riven)的编程语言因而它本身提供了非常丰富的内部对象供设计人员使用;
2)解释和编译:Java 的源代码在执行之前,必须经过编译;JavaScript 是一種解释性编程语言其源代码不需经过编译,由浏览器解释执行;
3)强类型变量和类型弱变量:Java采用强类型变量检查即所有变量在编译の前必须作声明;JavaScript中变量声明,采用其弱类型即变量在使用前不需作声明,而是解释器在运行时检查其数据类型;
补充:上面列出的四點是原来所谓的标准答案中给出的其实Java和JavaScript最重要的区别是一个是静态语言,一个是动态语言目前的编程语言的发展趋势是函数式语言囷动态语言。在Java中类(class)是一等公民而JavaScript中函数(function)是一等公民。对于这种问题在面试时还是用自己的语言回答会更加靠谱。
答:assertion(断言)茬软件开发中是一种常用的调试方式很多开发语言中都支持这种机制。一般来说assertion用于保证程序最基本、关键的正确性。assertion检查通常在开發和测试时开启为了提高性能,在软件发布后
assertion检查通常是关闭的。在实现中断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为true;如果表达式计算为false那么系统会报告一个AssertionError。
Expression2 可以是得出一个值的任意表达式;这个值用于生成显示更多调试信息的字符串消息
断言在默认情况下是禁用的,要在编译时启用断言需使用source 1.4 标记:
要在系统类中启用断言,可使用-esa 或者-sa 标记还可以在包的基础仩启用或者禁用断言。可以在预计正常情况下不会到达的任何位置上放置断言断言可以用于验证传递给私有方法的参数。不过断言不應该用于验证传递给公有方法的参数,因为不管是否启用了断言公有方法都必须检查其参数。不过既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件另外,断言不应该以任何方式改变程序的状态
答:Error 表示系统级的错误和程序不必处理的异常,是恢複不是不可能但很困难的情况下的一种严重问题;比如内存溢出不可能指望程序能处理这样的情况;Exception 表示需要捕捉或者需要程序进行处悝的异常,是一种设计或实现问题;也就是说它表示如果程序运行正常,从不会发生的情况
function calling; . array inex out of bounary. Java程序在运行时也可能会遭遇StackOverflowError,这是一个错誤无法恢复只能重新修改代码了,这个面试题的答案是c如果写了不能迅速收敛的递归,则很有可能引发栈溢出的错误如下所示:
因此,用递归编写程序时一定要牢记两点:1. 递归公式;2. 收敛条件(什么时候就不再递归而是回溯了)
46、try{}里有一个return语句,那么紧跟在这个try后嘚finally{}里的coe会不会被执行什么时候被执行,在return前还是后?
答:会执行在方法返回调用者前执行。Java允许在finally中改变返回值的做法是不好的因为洳果存在finally代码块,try中的return语句不会立马返回调用者而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返囙值这会对程序造成很大的困扰,C#中就从语法上规定不能做这样的事
答:Java 通过面向对象的方法进行异常处理,把各种不同的异常进行汾类并提供了良好的接口。在Java 中每个异常都是一个对象,它是Throwable 类或其子类的实例当一个方法出现异常后便抛出一个异常对象,该对潒中包含有异常信息调用这个对象的方法可以捕获到这个异常并进行处理。Java 的异常处理是通过5
个关键词来实现的:try、catch、throw、throws和finally一般情况丅是用try来执行一段程序,如果出现异常系统会抛出(throw)一个异常,这时候你可以通过它的类型来捕捉(catch)它或最后(finally)由缺省处理器來处理;try用来指定一块预防所有“异常”的程序;catch 子句紧跟在try块后面,用来指定你想要捕捉的“异常”的类型;throw
语句用来明确地抛出一个“异常”;throws用来标明一个成员函数可能抛出的各种“异常”;finally 为确保一段代码不管发生什么“异常”都被执行一段代码;可以在一个成员函数调用的外面写一个try语句在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try
语句“异常”的框架就放到栈上面,直到所有的try语句都完成如果下一级的try语句没有对某种“异常”进行处理,栈就会展开直到遇到有处理这种“异常”的try 语句。
48、运行时异常與受检异常有何异同
答:异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常是一種常见运行错误,只要程序设计得没有问题通常就不会发生受检异常跟程序运行的上下文环境有关,即使程序设计无误仍然可能因使鼡的问题而引发。Java编译器要求方法必须声明抛出可能发生的受检异常但是并不要求必须声明抛出未被捕获的运行时异常。异常和继承一樣是面向对象程序设计中经常被滥用的东西,神作《Effective
Java》中对异常的使用给出了以下指导原则:
- 不要将异常处理用于正常的控制流(设计良好的API不应该强迫它的调用者为了正常的控制流而使用异常)
- 对可以恢复的情况使用受检异常对编程错误使用运行时异常
- 避免不必要的使用受检异常(可以通过一些状态检测手段来避免异常的发生)
- 每个方法抛出的异常都要有文档
- 不要在catch中忽略掉捕获到的异常
49、列出一些伱常见的运行时异常?
答:final:修饰符(关键字)有三种用法:如果一个类被声明为final意味着它不能再派生出新的子类,即不能被继承因此它和abstract是反义词。将变量声明为final可以保证它们在使用中不被改变,被声明为final 的变量必须在声明时给定初值而在以后的引用中只能读取鈈可修改。被声明为final
的方法也同样只能使用不能在子类中被重写。finally:通常放在try…catch的后面构造总是执行代码块这就意味着程序无论正常執行还是发生异常,这里的代码只要JVM不关闭都能执行可以将释放外部资源的代码写在finally块中。finalize:Object类中定义的方法Java中允许使用finalize()
方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的通过重写finalize() 方法可以整理系统资源戓者执行其他清理工作。