您的位置:首页 > 编程语言 > Java开发

java学习记录(三)集合

2014-02-21 19:59 375 查看
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 工具类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: