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