零碎的面试题目总结2

1、谈谈你对Java平台的理解,Java是解释运行,这句话对不对?

        Java是一个面向对象的语言,有两个显著的特征,第一是:“一次编译,到处运行”,容易获得跨平台能力。第二个就是垃圾收集器-GC,通过回收分配内存,使得程序员不用担心内存的分配和回收。

        JRE,即Java运行环境,包括jvm和Java类库,以及一些模块等

        JDK,则可以看作是JRE的一个超集,包含更多的工具,比如编译器,诊断工具等。

        “Java是解释运行”这句话不太准确。首先Java源代码,首先通过javac编译成字节码文件,之后运行时,Java虚拟机内嵌的解释器 将字节码转换成最终的机器码。但是常见的JDK都提供了JIT编译器,即动态编译器。JIT在运行时将热点字节码转换成机器码,此时部分热点代码属于编译运行,而不是解释运行。

2、对比Exception和Error,运行时异常与一般异常有什么区别?

        Exception和Error都继承于Throwable类,Java中只有throwable类型的实例才可以被抛出(throw)或捕获(catch)。

        Exception程序正常运行中可以预料的意外情况,可能并且应该被捕获,进行处理。

        Error是指在正常情况下不大可能出现的情况,绝大部非error会导致程序处于不可恢复的,非正常的状态。既然是非正常情况,则不需要被捕获。比如OutOfMemoryError。

        Exception又分为可检查和不可检查的异常,可检查的异常必须在源代码中显式的捕获处理,编译器检查的一部分。

        不检查异常就是运行时异常,NullPointerException、ArrayIndexOutOfBoundsException之类,通常是编码避免的逻辑错误。

3、谈谈final、finally、finalize有什么不同?

        Final可以用来修饰类、方法、变量。修饰class代表不可以继承、拓展,修饰的变量不能被修改,修饰的方法不能重写(override)。

        Finally是Java保证重点代码一定被执行的一种机制可以使用 try-finally 或者 try-catch-finally 来进行类似关闭 JDBC 连接、保证 unlock 锁等动作。

        finalize 是基础类 java.lang.Object 的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。finalize 机制现在已经不推荐使用,并且在 JDK 9 开始被标记为deprecated。

列几个 fianlly 不会被执行的情况:

1. try-cach 异常退出。

        try{

                system.exit(1)

        }finally{

                print(abc)

}

2. 无限循环

        try{

                while(ture){

                print(abc)

        }

        }finally{

                print(abc)

}

3. 线程被杀死

当执行 try,finally 的线程被杀死时。finally 也无法执行。总结

  1. 不要在 finally 中使用 return 语句。
  2. finally 总是执行,除非程序或者线程被中断。

4、强引用、软引用、弱引用、幻象引用有什么区别?具体使用场景是什么?

        不同的引用类型,其实是对象的不同的可达性(reachable)状态和对垃圾收集的影响。

        强引用:就是最常见的普通对象引用,只要还有一个强引用指向对象,就表明该对象还活着,垃圾收集器就不会回收这类对象。对于一个普通的对象,如果没有其他的引用关系,只要超过了应用的作用域或者显式的将对象的引用赋值为null,就是可以被垃圾收集了的,具体还要看垃圾收集策略。

        软引用:是一种相对强引用弱化一些的引用,它可以让对象豁免一些垃圾收集,只有当JVM认为内存不足时,才会试图回收软引用指向的对象。JVM会确保在抛出OutOfMemoryError之前,清理软引用指向的对象。软引用通常用来实现内存敏感的缓存,如果还有空闲内存,就暂时保留缓存,内存不足时清理掉,这样就保证了使用缓存时不会消耗内存。

        弱引用:不能使对象豁免垃圾收集,仅提供一种访问在弱引用状态下的对象的途径。这样可以构建一种没有特定约束的关系,比如,维护一种非强制性的映射关系,如果试图获取对象时,对象还在,就使用它,否则重新实例化。同样是很多缓存实现的选择。

        虚引用:不能通过它访问对象,他仅仅提供了一种确保对象被finalize以后,做某些事情的机制。

5、理解 Java 的字符串,String、StringBuffer、StringBuilder有什么区别?

        String类是字符序列不可变的类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。

        StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String

        StringBuilder类,与StringBuffer相似,构造方法和方法基本相同。不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder

上一篇:android上如何写配置文件


下一篇:大数据Java基础之异常