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