final和static对比
 
| static知识点 | 介绍 | 
|---|
| static代码块 | 当JVM加载类时,static代码块会且只会被执行一次。 | 
|  | 可用于优化程序性能。 | 
|  | 实例代码块在每次创建对象时,都会自动执行。 | 
| static方法 | static方法中不能使用this和super关键字。 | 
| 静态内部类 | 静态内部类的创建不需要依赖外部类的创建, | 
|  | 不能使用外部类的非static成员变量和方法。 | 
| 静态变量 | 被所有对象共享。 | 
| 访问方式 | 直接使用类名。 | 
 
| final知识点 | 介绍 | 
|---|
| final量 | 不可变常量,一旦创建,则不可修改。 | 
|  | 如果是引用类型的变量,则不能再指向另一个对象。 | 
| final方法 | 不能被子类重写(类中的所有private方法,都隐式的被final修饰)。 | 
| final类 | 不能被继承,其中所有方法也默认被final修饰 | 
|  | 不能修饰构造方法 | 
| 使用场景 | 把方法锁定,避免任何继承类修改该方法的含义。 | 
|  | 提高效率,早期会将final方法转为内嵌调用(已过时)。 | 
 
接口和抽象类对比
 
| 接口知识点 |  | 
|---|
| 关键字 | interface、implements | 
| 类实现接口 | 一个类可以实现多个接口。 | 
| 接口可以多继承 | 一个接口可以继承多个接口。 | 
 
| 抽象类知识点 |  | 
|---|
| 关键字 | abstract | 
| 抽象方法 | 只有声明,没有方法体。 | 
|  | 注意,抽象类可以没有抽象方法 | 
|  | 但有抽象方法,则一定是抽象类。 | 
| 抽象类 | 用abstract关键字修饰。 | 
|  | 不能用来创建对象。 | 
|  | 子类继承抽象类时,必须实现其中所有抽象方法。 | 
 
方法重写
 
| 重写知识点 |  | 
|---|
| 参数一致 | 方法名、参数列表、返回值类型必须全部一致。 | 
| 访问权限 | 子类方法的访问权限不能小于父类的对应方法。 | 
| @Override注解 | 可以不用添加,但不建议。 | 
| 不能重写的方法 | 静态方法和构造方法不能重写。 | 
|  |  | 
 
final、finally、finalize
 
| final | 可以用于修饰类、方法、变量。 | 
|---|
| final方法 | 不能被重写。 | 
| final量 | 不能被修改,常量。 | 
| final类 | 不能被继承,(String类就是final修饰)。 | 
 
| finally | 常用于try-catch-finally中 | 
|---|
|  | 用来关闭某些资源如JDBC连接、文件对象等。 | 
|  | 如果执行 System.exit(1);,finally中的代码也可能不会被执行。 | 
 
| finalize | java.lang.Object中的一个方法,(已经不推荐使用) | 
|---|
|  | 用于保证对象在被垃圾回收之前,完成特定资源的回收。 | 
 
String类和StringBuffer类
 
 
HashSet
 
HashSet添加元素时,如何判断元素是否重复?
 
| hashCode() | 调用hashCode(),计算元素的哈希值, | 
|---|
|  | 哈希值不同的元素一定不同, | 
|  | 哈希值相同的元素,可能相同。 | 
|  | 当哈希值相同时,才会调用equals方法进一步判断。 | 
 
HashMap的底层存储结构
 
| 哈希数组+红黑树 | 底层使用长度默认为16的哈希数组, | 
|---|
|  | 链表长度等于8且哈希数组的长度大于64时,链表会自动转为红黑树。 | 
|  |  | 
| 补充 | 哈希表的负载因子为0.75,当使用率达到0.75时,会自动扩容。 | 
 
HashMap和CurrentHashMap
 
HashMap和CurrentHashMap的区别有哪些?
 
| 线程安全 | HashMap不是线程安全的。 | 
|---|
|  | ConcurrentHashMap是线程安全的。 | 
| 分段锁技术 | ConcurrentHashMap采用分段锁技术, | 
|  | 分段锁技术将整个Hash桶进行了分段segment,每个segment上都有对应的锁。 | 
|  | 增加了锁的粒度,提高了并发性能。 | 
 
线程安全的集合有哪些?
 
| Vector | 使用synchronized关键字。 | 
|---|
| Hashtable | 使用synchronized关键字。 | 
| ConcurrentHashMap | 分段锁(Segment) | 
| Stack | 继承于Vector, 栈是后进先出的。 | 
| ArrayBlockingQueue | 阻塞队列,底层使用数组结构。 | 
 
HashMap的底层原理是什么?如何扩容?如何解决Hash碰撞的?
 
 
Exception和Error
 
| Exception | 继承了Throwable类 | 只有Throwable类的实例才可以被抛出(throw)或捕获(catch)。 | 
|---|
|  | 可以预料的意外情况。 |  | 
|  | 分为可检查和不可检查两种 | checked:必须在代码中显式的捕获处理,不处理,则无法编译。 | 
|  |  | unchecked:运行时异常,非空异常、数组越界异常等。 | 
| 常见Exception |  |  | 
 
| Error | 也继承了Throwable类 | 
|---|
|  | 正常情况下不太可能出现的情况,会导致程序处于非正常的,不可恢复的状态。 | 
| 常见Error |  | 
 
强引用、软引用、弱引用、幻象引用
 
| 不同的引用类型 | 主要体现对象不同的可达性状态和对垃圾收集的影响。 | 
|---|
| 强引用 StrongReference | 只要还有强引用指向一个对象,那么该对象就不会被垃圾收集器回收。 | 
| 软引用 SoftReference | 只有当JVM认为内存不足时,才会试图回收软引用的对象。 | 
|  | 确保在抛出OutOfMemoryError之前,清理软引用的对象。 | 
| 弱引用 WeakReference | 仅提供一种访问在弱引用状态下对象的途径。 | 
| 幻象引用 | 仅提供了一种确保对象被finalize之后,做某些事情的机制。 | 
 
| Java的不同可达性级别 | reachability level |  | 
|---|
| 强可达 | Strongly Reachable | 一个对象可以有一个或多个线程可以不通过各种引用访问到的情况。 | 
| 软可达 | Softly Reachable |  | 
| 弱可达 | Weakly Reachable |  | 
| 幻象可达 | Phantom Reachable |  | 
| 不可达 | unreachable |  |