String
- 只读字符串。
- 每次+操作会隐式的在内存中new一个跟原字符串一样的StringBuilder对象,然后append+号后面的字符串。
StringBuilder
- 可变字符串对象。
- 线程不安全。
StringBuffer
- 可变字符串对象。
- 线程安全。
数组
- 一种线性数据结构,使用连续的存储空间存放相同数据类型的集合容器。
- 存储和访问效率高,时间复杂度O(1)。
- 删除数据需要重排后面的数据,时间复杂度O(n)。
- 初始化时需要指定长度,长度不可变。
- 可通过复制的方式扩容长度。
- 支持存储基本数据类型。
Collection
- 可以存储多个不同对象的容器。
- 不直接存储对象,而是对象的引用。
- 不能存储基本数据类型。
List
- 继承了Collection的有序列表。
- 通过索引访问列表元素。
ArrayList
- List接口的动态数组实现,容量不足时按1.5倍扩容。
- 初始化的默认容量为10。
- 访问速度快。
- 线程不安全。
- 在添加大量元素时,如果已知元素数量,使用ensureCapacity()方法先进行扩容,避免添加元素过程中的多次扩容。
- 实现了Cloneable接口,可以被复制,但是是浅拷贝。
LinkedList
- List接口的链表实现。
- 插入和删除元素的性能优越,时间复杂度O(1)。
- 线程不安全。
Collections
Collections是集合的一个辅助工具类,它包含了很多集合操作的静态方法,用于实现集合的搜索、排序、线程安全化等操作。
Map
键值对映射的抽象接口,一个键对应一个值。
HashMap
- 基于map接口的非同步实现。
- 线程不安全。
- key和value可以null,key不能重复,所以只有一个key可以为null。
- 初始容量16,容量建议2的N次方,能提高计算机的执行效率。
- 扩容阈值默认0.75。
- 每次扩容为原容量的两倍。
- 底层采用数组+链表实现,数组的每个元素存储一个单向链表,当链表的长度超过一定的阈值时,就会转换成红黑树。转换的目的是当链表中元素较多时,也能保证HashMap的存取效率(备注:链表转为红黑树只有在数组的长度大于等于64才会触发)。
Fail-Fast机制
一种错误机制,当多个线程对同一个集合的内容进行操作时,就可能发生fail-fast事件。
modCount:集合内部记录集合修改次数的属性,每次修改,modCount+1。
expectModCount:迭代器内部记录集合的修改次数,初始化时会将集合当前的修改次数记录下来,迭代器修改集合元素时,modCount、expectModCount均+1。
集合的fail-fast机制:迭代器遍历的每次循环开始时候,expectModCount会和modCount比较,如果不相等,就认为有别的线程修改了集合,则会抛出ConcurrentModificationException异常。
泛型
- 本质是参数类型化,就是把数据类型当做一个参数。
- 使用泛型可以避免显示的强制类型转换,增加代码的可读性。
- 使用泛型能够降低运行时的类型转化异常,提高代码健壮性。
浅拷贝
新对象和旧对象的成员变量的值一致,引用变量指向的也是同一个对象。
深拷贝
新对象和旧对象的成员变量的值一致,新对象中的引用变量指向的对象也是被复制了新对象。
final
- 被final修饰的类不可以被继承。
- 被final修改的方法不可以被重写。
- 被final修改的变量不可变,如果修改的是引用,那么引用不可变,引用指向的对象内容可变。
- 被final修改的方法,jvm会尝试内联,以提高运行效率。
- 被final修饰的常量,在编译期间,会存入常量池中。
finally
- 不管有没有异常,finally模块中的代码都会执行。
- 当try和catch中有return时,finally任然会执行。
- return的值是在finally执行前确定的。
- finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
异常
- 运行时异常(RuntimeException):RuntimeException及其子类,编译器不会检查,属于不可预知的异常。如:ClassCastException,NullPointerException。
- 被检查的异常(CheckedException)::Exception本身,以及Exception子类(除运行时异常外)都属于被检查的异常。可以理解为编译器会检查的异常,那么通过throw进行申明抛出,要么通过try-catch捕获处理。如:IOException。
- 错误(Error):Error类及其子类,当资源不足、约束失败、或是其他程序无法继续运行的条件发生时,就会产生错误,程序本省无法修复这些错误。如:OutOfMemoryErro,ThreadDeat