java集合详解、集合大全
Collection<E> 层次结构 中的根接口。Collection 表示一组对象
一、 List :实现 collection接口 有序的集合 可以允许重复
| ArrayList | |
| 初始大小 | 10 |
| 扩容因子 | (大小*3)/2 + 1 |
| 扩容例子 | 10 超过时之后扩容到 16 然后 25 然后 38... |
| 数据处理 | 删除其中一个元素后后面的元素会自动向前推 |
| 线程是否安全 | 不安全 |
| 优势 | ArrayList的优势在于读取和表尾插入 |
| 多线程使用 | List list = Collections.synchronizedList(new ArrayList(…)) |
| LinkedList | |
| 说明 | List接口的链接列表实现 。 |
| 初始大小 | 1 |
| 数据处理 | 删除其中一个元素后后面的元素会自动向前推,
LinkedList 中的链接关系是由 Entity实现的, 每个Entity都有 上一个Entity引用 下一个Entity引用 本身元素值Entry(E element, Entry<E> next, Entry<E> previous) LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。 此类实现 Queue 接口,为 add、poll 等提供先进先出队列操作 |
| 优势 | LinkedList的优势在于表中插入和删除 |
| 线程是否安全 | 不安全 ,可以使用如下进行安全处理
List list = Collections.synchronizedList(new LinkedList(...)); |
| Vector | |
| 说明 | Vector 类可以实现可增长的对象数组 |
| 初始大小 | 10 |
| 扩容因子 | 1 , 默认扩容一倍 |
| 扩容例子 | 10 超过时之后扩容到 20 然后 40 然后 80… |
| 数据处理 | 删除其中一个元素后后面的元素会自动向前推 |
| 是否同步 | Vector 是同步的 |
| 用法 | 一般在多线程中使用对于一般的数据存储直接用ArrayList |
| Stack | |
| 类型解释 | 表示后进先出(LIFO)的对象堆栈 。
它通过五个操作对类 Vector 进行了扩展 , 允许将向量视为堆栈。 它提供了通常的 push 和 pop 操作 |
| 几种方法 | empty()
测试堆栈是否为空。 E peek() 查看栈顶对象而不移除它。 E pop() 移除栈顶对象并作为此函数的值返回该对象。 E push(E item) 把项压入栈顶。 int search(Object o) 返回对象在栈中的位置,以 1 为基数。 |
| Arrays | |
| 说明 | 专门用来操作数组的辅助类 Array 固定个数效率最高 |
| 数据处理 | Arrays中拥有一组static函数, equals(): 比较两个array是否相等。array拥有相同元素个数,
且所有对应元素两两相等。 |
| 优势 | 这个就是用来处理数组的,效率特别高
如果之前对Arrays没这么的重视,在J2SE 5.0之后,可以多关照它几眼 。如果有数组操作方面的相关需求,可以先查查 java.util.Arrays的API文 件说明,看看有没有现成的方法可以使用 |
二、Set :一个不包含重复元素的 collection。
| HashSet | |
| 说明 | 内部使用HashMap 来存储数据 |
| 初始大小 | 16 |
| 扩容因子 | 数据超过当前大小*0.75 容量扩一倍 |
| 扩容例子 | 当前容量16 如果插入13个数 超过了(16*0.75=12)
容量增加16 最后容量是 32。 |
| 优势 | 不允许有重复的元素 |
| 线程是否安全 | 不安全,可以使用如下进行安全处理
Set s = Collections.synchronizedSet(new HashSet(...)) |
| LinkedHashSet | |
| 说明 | 内部使用HashMap 来存储数据 |
| 初始大小 | 16 |
| 扩容因子 | 数据超过当前大小*0.75 容量扩一倍 |
| 扩容例子 | 当前容量16 如果插入13个数 超过了(16*0.75=12)
容量增加16 最后容量是 32。 |
| 优势 | 不允许有重复的元素 、 查询足够快 、 有序 |
| 线程是否安全 | 不安全,可以使用如下进行安全处理
Set s = Collections.synchronizedSet(new HashSet(...)) |
三、Map :一个不包含重复元素的 无序集合 键值对 。
| HashMap | |
| 说明 | 内部使用Entity来存储数据,key可以为空
put方法:如果key为空,则替换换Key为空的值, 否则插入到第 O 位置上。 for (Entry<K,V> e = table[0]; e != null; e = e.next) { //null key都放在table[0]上 if (e.key == null) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } 如果key不为空,先算出来key对象的hashcode , 然后调用函数 hash()在算一次, 最后把结果和当前hash大小进行计算找到存放该值的位置; 如果该位置有值 直接把当前值(entity)链接到该值最前面 , Entry<K,V> e = table[bucketIndex]; //这个地方获取当前位置的 e //table[bucketIndex] = new Entry<K,V>(hash, key, value, e); //这个地方把要插入的entity的next属性指向 e, 然后把整个entity放入 hashMap的index位置, 如果没有值就直接放入, 数组位置每变大一次 里面每个对象的位置都要重新计算一下 |
| 初始大小 | 16 |
| 扩容因子 | 数据超过当前大小*0.75 容量扩一倍 |
| 扩容例子 | 当前容量16 如果插入13个数 超过了(16*0.75=12)
容量增加16 最后容量是 32 |
| 优势 | 查询足够快 |
| 线程是否安全 | 线程不安全 可以使用如下进行安全处理
Set s = Collections.synchronizedSet(new HashSet(...)) |
| Hashtable | |
| 初始大小 | 11 |
| 扩容因子 | 大小 = 大小 * 2 + 1 |
| 扩容例子 | 11 然后 23 然后47 .... |
| 是否同步 | hashtable是同步的. |
| 优势 | 查询足够快 |
| 说明 | key 不允许为空
数据的put和get和hashMap基本上一致 里面的所有方法除了不需要同步的都有 synchronized |
| LinkedHashMap | |
| 初始大小 | 16 |
| 扩容因子 | 数据超过当前大小*0.75 容量扩一倍 |
| 扩容例子 | 当前容量16 如果插入13个数 超过了(16*0.75=12)
容量增加16 最后容量是 32 |
| 是否同步 | 异步线程不安全 多线程使用可以如下
Map m = Collections.synchronizedMap(new LinkedHashMap(...)) |
| 优势 | 查询足够快的 有序 |
| 说明 | 链表的形式存储数据 使用的hash算法保持数据,但同样也维护了一个插入
顺序查询对象时,速度足够快 |
| TreeMap | |
| 初始大小 | 0 |
| 扩容因子 | 1 |
| 扩容例子 | 每插入一个键值对,内部创建一个entity来存储 size + 1 |
| 是否同步 | 异步线程不安全 多线程使用可以如下
Map m = Collections.synchronizedMap(new TreeMap(...)); |
| 优势 | 能够维护其内元素的排序状态 |
| 说明 | TreeMap 初始化为0 , 每插入一个键值对,内部创建一个entity来存储
内部实现和维护的是一颗红黑树,遍历的时候使用的是前序遍历法,但是 查询get方法的时候需要遍历,速度不如直接使用hash算法的快 |
| Properties | |
| 初始大小 | 11 |
| 扩容因子 | 大小 = 大小 * 2 + 1 |
| 扩容例子 | 11 然后 23 然后47 .... |
| 是否同步 | 是同步的. |
| 优势 | 查询足够快 可保存在流中或从流中加载数据 |
| 说明 | 实现了 HashTable 表示了一个持久的属性集。
Properties 可保存在流中或从流中加载数据。
|
摘自:http://www.javady.com/index.php/53.html#respond
原创文章 @www.javady.com, 转载请标明出处
浙公网安备 33010602011771号