Java基础总结
一、基础中的战斗机
Java是解释型语言还是编译型?
Java是解释和编译并存。
Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。
String、StringBuffer、StringBuilder 的区别?
String:是只读字符串,也就意味着 String 引用的字符串内容是不能被改变的。每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。
StringBuffer/StringBuilder:表示的字符串对象可以直接进行修改。StringBuilder 是 Java 5 中引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被 synchronized 修饰,因此它的效率也比 StringBuffer 要高。
为什么重写equals还要重写hashcode?
如果只重写equals没有重写hashCode(),就会导致相同的key值也被hashcode认为是不同的key值(因为没有重写hashCode(),则任何对象的hashCode()值都不相等),就会在hashmap中存储相同的key值(map中key值不能相同),这就不符合条件了。
final、finally、finalize的区别?
final:修饰类时,类不能被继承。
修饰方法时,方法不能被重写。
修饰变量时,变量不能被修改,而且要在初始化时赋值。
finally:配合try、catch使用,不论是否捕获异常,都会走finally。但遇到特殊情况也会不走,比如在finally中有异常。通常用于释放资源, 如 I/O 缓冲区, 数据库连接等等。
finalize:在垃圾收集器删除对象之前对这个对象调用的。
什么是 Java 序列化?
将一个 Java 对象,转换成二进制数组、JSON 字符串、 XML 字符串,
Java IO
// todo
error 和 exception 有什么区别?CheckedException 和 RuntimeException 有什么区别?
error:不可控制的。表示系统级的错误和程序不必处理的异常,是 Java 运行环境中的内部错误或者硬件问题。
exception:表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。
RuntimeException(运行时异常):表示无法让程序恢复的异常,导致的原因通常是因为执行了错误的操作,建议终止逻辑,因此,编译器不检查这些异常。
CheckedException(受检查异常):是表示程序可以处理的异常,也即表示程序可以修复(由程序自己接受异常并且做出处理),所以称之为受检查异常。
请列出 5 个运行时异常?
NullPointerException 空指针(经常哈哈哈)
IndexOutOfBoundsException 数组越界 (偶尔)
ClassCastException 类型转换 (偶尔)
NumberFormatException 数值格式转化 (偶尔)
ArrayStoreException 数据存储异常,操作数组时类型不一致(我还没遇到过)
throw 与 throws 的区别 ?
throw:在程序中自己抛出。
throws:在方法上抛出。
说说反射的用途及实现?
在运行时构造一个类的对象。
判断一个类所具有的成员变量和方法。
调用一个对象的方法。
生成动态代理。
二、锁
锁升级的过程
无锁->偏向锁->轻量级锁->重量级锁