Java面试题之九
四十六、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
对于这个题,只要弄清楚Math提供的三个与取整相关的方法就OK了。
1.ceil,英文含义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.6)的结果为-11。
2.floor,英文含义是地板,该方法就表示向下取整,Math.floor(11.6)的结果是11,Math.floor(-11.4)的结果-12。
3.round,表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,Math.round(11.5)的结果是12,Math.round(-11.5)的结果为-11。
四十七、Java 有没有goto?
java中的保留字,现在没有在java中使用。与此类似的还有个叫const。
四十八、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口,用来拓展接口。抽象类也可以实现接口。抽象类也可以继承实体类,只要该实体类有明确的构造方法。其实,任何抽象类最终都是Object的子类。
四十九、abstract 的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
都不行。理由:
1.static修饰的方法是不能被重写的,而abstract修饰的方法是没有给出实现的,必须要求子类去实现。很明显,它们是矛盾的。
2.native修饰的方法是要移交给本地操作系统,由其他语言来实现,而abstract 是交给子类实现,两者矛盾。
3.synchronized表示同步,是对具体操作进行同步,而abstract 修饰的方法没有给出具体操作的实现,所以两者矛盾。但是在子类重写后可以添加同步。
五十、数组有没有length()这个方法? String 有没有length()这个方法?
数组是没有length()这个方法的,但有length这个属性。String有length()这个方法。
五十一、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
根据API描述:If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result. 翻译成中文意思是:如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
所以,对于Object类来说:如果equals比较结果相等,必然有相同的hash code。
但是这是针对Object类,Object类的equals就是根据==来比较的,即比较是否为同一个对象。
这是符合hashCode的常规协定的:
Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application. 翻译成中文:在 Java 应用程序执行期间,在对同一对象多次调用 hashCode方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
至于如果子类重写了equals和hashCode,是否依然有equals相等则hashCode相等的结论,这是没法确定的。我测试过自定义类,该结论是否成立要依赖于equals和hashCode的具体实现。另外,我测试过String类,该结论依然是成立的。
五十二、垃圾回收的优点和原理。并考虑2 种回收机制。
关于垃圾回收前面已介绍过很多。
回收机制有:分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
五十三、描述一下JVM加载class文件的原理机制?
(1)Java中的所有类,必须被装载到JVM中才能运行,这个装载工作是由JVM中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中。
(2)java中的类大致分为三种:
1.系统类 2.扩展类 3.由程序员自定义的类
(3)类装载方式:
1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到JVM中,
2.显式装载, 通过class.forname()等方法,显式加载需要的类 。
(4)java类装载器:
1. Bootstrap Loader - 负责加载系统类
2. ExtClassLoader - 负责加载扩展类
3.AppClassLoader - 负责加载应用类
(5)步骤:装载、链接和初始化,其中链接又可以分成校验、准备、解析
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量,初始化Java代码和静态Java代码块
五十四、char型变量中能不能存贮一个中文汉字?为什么?
能够定义成为一个中文的,因为java中以unicode编码,一个char 占2个字节,16位,所以放一个中文是没问题的。
五十五、同步和异步有和异同,在什么情况下分别使用他们?举例说明。
我觉得描述它们的区别是针对多线程而言的。
如果只有一个主线程就只能是同步,上一段代码没有完成,下一段必须等到上一段代码完成后才可以执行。如买票排队。
对于异步,比如说,你在主线程中new Thread,开启一个子线程,就属于异步操作。上一段代码没有完成,下一段不必等到上一段代码完成就可以执行。如手机发送短信。
对于方法或块加了synchronized叫做同步块和同步方法,是为了保证数据的安全性。当一个块或方法的内容没执行完毕,其他线程是不能访问的。但同步也意味着效率低。