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 | |