Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign upJava核心技术笔记 #26
Comments
thinkerou
added
the
Java
label
Dec 12, 2018
thinkerou
self-assigned this
Dec 12, 2018
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
thinkerou commentedDec 12, 2018
•
edited
final, finally, finalize
final
可以用来修饰类、方法和变量:修饰的类表示不可扩展继承,修饰的变量不可修改,修饰的方法不可重写(override)。finally
用来保证重点代码一定要被执行的机制,如使用try-finally
、try-catch-finally
来进行类似关闭 JDBC 连接、保证 unlock 锁等动作。finalize
在 Java9 中已被标记位Deprecated
,不关注。String, StringBuffer, StringBuilder
String
是Immutable
类,被声明为final class
,所有属性也被声明为final
,正因为它的不可变性,类似拼接、裁剪等字符串操作都会产生新的 String 对象。StringBuffer
是为解决 String 产生太多中间对象的问题而提供的,可以使用append
或add
方法把字符串添加到已有序列的末尾或指定的位置;StringBuffer
是线程安全的,所以会有额外的性能开销,除非有线程安全的需要,否则就使用StringBuilder
;它的线程安全是在各种修改数据的方法上增加关键字synchronized
来实现的。StringBuilder
和StringBuffer
没有本质区别,只是去掉了线程安全,有效减少了开销;它们底层都是利用可修改的(char,JDK9后是byte,在Java中char是两个byte)数组,都继承自AbstractStringBuilder
。int, Integer
int
是Java里8个原始数据类型(boolean, byte, char, short, int, long, float, double)之一,Java虽号称一切都是对象,但原始数据类型除外。Integer
是int
对应的包装类,它有一个 int 类型的字段存储数据,并提供基本操作,如数学运算、类型转换等;引入自动装箱和自动拆箱后,Java可以根据上下文自动进行转换。AtomicInteger
,AtomicLong
这样的线程安全类。Vector, ArrayList, LinkedList
Vector
是Java早期提供的线程安全的动态数组,它的内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组并拷贝原有数组数据。ArrayList
也是动态数组,但不是线程安全的,所以性能更好,它也可以根据需要调整容量,但 Vector 在扩容时会提高1倍,而 ArrayList 只增加 50% 而已。LinkedList
是非线程安全的双向链表,所以不需要动态调整容量。Hashtable, HashMap, TreeMap
Hashtable
是Java早期提供的哈希表实现,线程安全的,不支持null键和值。HashMap
和hashtable
本质上没什么区别,但它是非线程安全的且支持null键和值。TreeMap
是基于红黑树提供的顺序访问的Map,和HashMap不同,它的get、put和remove操作都是O(log(n))时间,具体顺序可以由指定的Comparator来决定或根据键的自然顺序来判断。ConcurrentHashMap
synchronized
,而是使用分离锁机制。IO, NIO, AIO