1.集合框架
Collection
--List
--ArrayList 查询快,增删慢
--LinkedList 增删慢,查询快
--Vector 查询快, 增删慢, 由于是线程安全,所以比 ArrayList 性能差
--Set 元素不可重复,无索引
--HashSet
--TreeSet
Map(不是继承自 Collection)
--HashMap
--TreeMap
Hashtable
--Properties 一般用于配置文件,key 和 value 均为 String 类型
2.迭代器 Iterator
1) Iterator 迭代器对象是内部类
2) List 中,在 Iterator 操作的时候,不能用集合的方法(例如add())方法再操作元素,否则会抛出并发操作异常
这时如果要修改添加元素,需要 ListIterator .
3) Vector 有一个elements()方法,返回一个 Enumeration<E>对象,可以操作Vector元素
3)泛型
1> 静态方法不可以访问类上定义的泛型,static要放在泛型前边
2> 泛型限定 ? 通配符
? extends E 接收E或者E的子类
? super E 接收E或者E的父类
4.List
1) ArrayList 和 LinkedList 是线程不安全的,实现的时候没有锁
2) Vector 是线程安全的,synchronized 同步函数实现
3) Vector 和 ArrayList 是数组结构,数组默认初始大小是10;LinkedList是双向链表结构
4) List 集合的contains()方法调用的是元素对象的equals()方法。
如果有特殊要求,可以覆写equals()方法。
比如要按对象属性的值判断是否存在,则必须要覆写equals()方法,因为初始的equals方法比较的是地址值
5) 扩容:
1> ArrayList:
默认 int newCapacity = oldCapacity + (oldCapacity >> 1) 增加%50,
或者增加显示指定的大小 ensureCapacity(int minCapacity), 取两者较大的值
2> Vector:
默认 int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
或者增加显示指定的大小ensureCapacity(int minCapacity), 取两者较大的值
其中 capacityIncrement 为容量增量,在构造时可以显示指定,默认为0
也就是说,通常情况下,Vector是增加原始容量的1倍,而ArrayList是增加50%。
3> LinkedList:
因为是链表结构,需要的时候增加节点即可
4. Set
1) HashSet 和 TreeSet 都不是线程同步的
HashSet 无序, TreeSet 有序
HashSet 允许 null, TreeSet 不允许 null
2)HashSet 是基于 HashMap 实现的,底层是哈希表,默认初始容量是16,加载因子0.75.
1> HashSet 和 HashMap 容量都是2的N次方。即使显示指定的容量大小不是2的N次方,
也会设定为2的N次方。
int capacity = 1;
while (capacity < initialCapacity)
capacity <<= 1;
因为取模运算在包括Java在内的大多数语言中的效率都十分低下,而当除数为2的N次方时,取模运算将退化为最简单的位运算,其效率明显提升
2> HashMap 当元素数量大于现有容量和加载因子的成绩,就进行扩容,容量增加一倍
threshold = (int)Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);
if ((size >= threshold) && (null != table[bucketIndex])) {
resize(2 * table.length);
由于容量是变的,所以不保证元素的顺序是不变的。
3> HashSet 存储对象的时候,先比较hashcode()值,如果相同,再比较equals(), 所以 HashSet 在存储自定义对象的时候通常需要重写hashcode()和equals()
3)TreeSet 是有序的,所以在存储自定义对象的时候需要让对象具有比较性
1> 在定义类的时候实现Comparable接口,覆盖compareTo()方法
2> 可以让TreeSet本身具备比较性, 实现Comparator接口,覆盖Compare方法,然后在定义 TreeSet 的时候传递给 TreeSet,优先级高于实现Comparable接口
3> TreeSet 是基于TreeMap实现的,底层是红黑树。
5. Map
1) Hashtable 是线程同步的,不支持 null 值和键,效率低, Hashtable 默认初始容量传递的是11
HashMap 是非线程同步的,支持 null 键和值,效率高,取消了contains()方法,
除此之外 HashMap 和 Hashtable 基本相同
TreeMap 非线程同步,底层是红黑树,不支持 null 键,支持 null 值
2) HashMap 扩容方式和 HashSet 相同
Hashtable 扩容时候也是增加一倍 int newCapacity = (oldCapacity << 1) + 1;
3) 在自定义对象的时候,通常覆写hashcode()和equals()方法,以及实现Comparable接口比较好
6. Collections 工具类
1) sort(..)可以对 List 进行排序
2) binarySearch(...) 二分查找
7. Arrays 工具类
Collection
--List
--ArrayList 查询快,增删慢
--LinkedList 增删慢,查询快
--Vector 查询快, 增删慢, 由于是线程安全,所以比 ArrayList 性能差
--Set 元素不可重复,无索引
--HashSet
--TreeSet
Map(不是继承自 Collection)
--HashMap
--TreeMap
Hashtable
--Properties 一般用于配置文件,key 和 value 均为 String 类型
2.迭代器 Iterator
1) Iterator 迭代器对象是内部类
2) List 中,在 Iterator 操作的时候,不能用集合的方法(例如add())方法再操作元素,否则会抛出并发操作异常
这时如果要修改添加元素,需要 ListIterator .
3) Vector 有一个elements()方法,返回一个 Enumeration<E>对象,可以操作Vector元素
3)泛型
1> 静态方法不可以访问类上定义的泛型,static要放在泛型前边
2> 泛型限定 ? 通配符
? extends E 接收E或者E的子类
? super E 接收E或者E的父类
4.List
1) ArrayList 和 LinkedList 是线程不安全的,实现的时候没有锁
2) Vector 是线程安全的,synchronized 同步函数实现
3) Vector 和 ArrayList 是数组结构,数组默认初始大小是10;LinkedList是双向链表结构
4) List 集合的contains()方法调用的是元素对象的equals()方法。
如果有特殊要求,可以覆写equals()方法。
比如要按对象属性的值判断是否存在,则必须要覆写equals()方法,因为初始的equals方法比较的是地址值
5) 扩容:
1> ArrayList:
默认 int newCapacity = oldCapacity + (oldCapacity >> 1) 增加%50,
或者增加显示指定的大小 ensureCapacity(int minCapacity), 取两者较大的值
2> Vector:
默认 int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
或者增加显示指定的大小ensureCapacity(int minCapacity), 取两者较大的值
其中 capacityIncrement 为容量增量,在构造时可以显示指定,默认为0
也就是说,通常情况下,Vector是增加原始容量的1倍,而ArrayList是增加50%。
3> LinkedList:
因为是链表结构,需要的时候增加节点即可
4. Set
1) HashSet 和 TreeSet 都不是线程同步的
HashSet 无序, TreeSet 有序
HashSet 允许 null, TreeSet 不允许 null
2)HashSet 是基于 HashMap 实现的,底层是哈希表,默认初始容量是16,加载因子0.75.
1> HashSet 和 HashMap 容量都是2的N次方。即使显示指定的容量大小不是2的N次方,
也会设定为2的N次方。
int capacity = 1;
while (capacity < initialCapacity)
capacity <<= 1;
因为取模运算在包括Java在内的大多数语言中的效率都十分低下,而当除数为2的N次方时,取模运算将退化为最简单的位运算,其效率明显提升
2> HashMap 当元素数量大于现有容量和加载因子的成绩,就进行扩容,容量增加一倍
threshold = (int)Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);
if ((size >= threshold) && (null != table[bucketIndex])) {
resize(2 * table.length);
由于容量是变的,所以不保证元素的顺序是不变的。
3> HashSet 存储对象的时候,先比较hashcode()值,如果相同,再比较equals(), 所以 HashSet 在存储自定义对象的时候通常需要重写hashcode()和equals()
3)TreeSet 是有序的,所以在存储自定义对象的时候需要让对象具有比较性
1> 在定义类的时候实现Comparable接口,覆盖compareTo()方法
2> 可以让TreeSet本身具备比较性, 实现Comparator接口,覆盖Compare方法,然后在定义 TreeSet 的时候传递给 TreeSet,优先级高于实现Comparable接口
3> TreeSet 是基于TreeMap实现的,底层是红黑树。
5. Map
1) Hashtable 是线程同步的,不支持 null 值和键,效率低, Hashtable 默认初始容量传递的是11
HashMap 是非线程同步的,支持 null 键和值,效率高,取消了contains()方法,
除此之外 HashMap 和 Hashtable 基本相同
TreeMap 非线程同步,底层是红黑树,不支持 null 键,支持 null 值
2) HashMap 扩容方式和 HashSet 相同
Hashtable 扩容时候也是增加一倍 int newCapacity = (oldCapacity << 1) + 1;
3) 在自定义对象的时候,通常覆写hashcode()和equals()方法,以及实现Comparable接口比较好
6. Collections 工具类
1) sort(..)可以对 List 进行排序
2) binarySearch(...) 二分查找
7. Arrays 工具类