Java集合详解

来源:互联网 发布:用友会计软件普及版 编辑:程序博客网 时间:2024/05/22 14:17

Java集合简单介绍

  • Collection
    • List
      • LinkedList
      • ArrayList
      • Vector
      • CopyOnWriteArrayList
    • Set
      • HashSet
      • TreeSet
      • LinkedHashSet
      • CopyOnWriteArraySet
  • Map
    • HashMap
    • TreeMap
    • HashTable
    • LinkedHashMap
    • WeakHashMap
    • ConcurrentHashMap
    • ConcurrentSkipListMap

Collection是集合接口:
1. Set子接口:无序,不允许重复。
1. List子接口:有序,可以有重复元素。

List

1.LinkedList

特点:==LinkedList 内部使用Node内部类进行数据存储,保存上一个节点和下一个节点。使用的是链表数据结构。添加删除速度快,查找速度慢。不是线程安全的。==

private static class Node<E> {    E item;    Node<E> next;    Node<E> prev;    Node(Node<E> prev, E element, Node<E> next) {        this.item = element;        this.next = next;        this.prev = prev;    }}
2.ArrayList

特点: ==ArrayList内部使用数组进行数据存储transient Object[] elementData,默认初始化容量为10, private static final int DEFAULT_CAPACITY = 10;已原来的二倍方式扩容,扩容代码如下,不是线程安全的。==

 private void grow(int minCapacity) {    // overflow-conscious code    int oldCapacity = elementData.length;    int newCapacity = oldCapacity + (oldCapacity >> 1);    if (newCapacity - minCapacity < 0)        newCapacity = minCapacity;    if (newCapacity - MAX_ARRAY_SIZE > 0)        newCapacity = hugeCapacity(minCapacity);    // minCapacity is usually close to size, so this is a win:    elementData = Arrays.copyOf(elementData, newCapacity);}
3.Vector

特点: ==Vector内部使用数组进行数据存储Object[] elementData,是线程安全的。由于每个方法都加锁,性能低,不建议使用==

public synchronized void addElement(E obj) {    modCount++;    ensureCapacityHelper(elementCount + 1);    elementData[elementCount++] = obj;}
4.CopyOnWriteArrayList

特点: ==CopyOnWriteArrayList内部使用数组进行存储是线程安全,添加数据的时候add方法加锁,get方法没有加锁。add方法每次添加数据的时候都copy一份新的数组进行操作。在新的数组上进行修改操作。这样能保证多线程的数据安全性。添加数据性能偏低,每次都要拷贝数据耗费空间。读取的时候不具备实时性。可能读取旧的数据,CopyOnWriteSet和这个原理类似,CopyOnWrite容器适用于读多写少的场景。==

public synchronized void addElement(E obj) {    modCount++;    ensureCapacityHelper(elementCount + 1);    elementData[elementCount++] = obj;}

Set

1.HashSet

特点: ==HashSet使用的HashMap的key存储数据value用一个对象常量,代码如下,不能够重复,详细的底层数据结构见HashMap。不是线程安全的。==

public boolean add(E e) {    return map.put(e, PRESENT)==null;}
2.TreeSet

特点: ==TreeSet使用的TreeMap的key存储数据value用一个对象常量,不能够重复,详细的底层数据结构见TreeMap。不是线程安全的。==

3.LindedHashSet

特点: ==LindedHashSet使用LindedHashMap的key存储数据,详细底层结构见LinkedHashMap介绍,不是线程安全的。==

4.CopyOnWriteArraySet

特点: ==CopyOnWriteArraySet原理同CopyOnWriteArrayList,原理参考CopyOnWriteArrayList。==

Map

Map属于key-value数据结构

1.HashMap

特点: HashMap。不是线程安全的。HashMap允许null为key。是一个“链表散列”的数据结构,即数组和链表的结合体。在jdk8中链表长度超过8是转换成红黑树的数据结构,这样能保证在Hash冲突多的情况下也能保证元素查找的速度。

2.TreeMap

特点: TreeMap底层实用的是红黑树实现,不是线程安全的。具体详情看红黑树的原理。

3.LindedHashMap

特点: LindedHashMap和HashMap类似,只是里面多维护了一个添加的顺序,这样遍历集合时候能够按照顺序输出,不是线程安全的。HashMap默认构建一个初始容量为 16,负载因子默认为 0.75 的 容器。重载函数有HashMap(int initialCapacity)指定初始化容量(桶)的个数。HashMap(int initialCapacity, float loadFactor)可以初始化容量和负载因子。当容器总元素个数大于容量*负载因子时候,容器的容量*2进行扩容。

4.ConcurrentHashMap

特点: ConcurrentHashMap实现和HashMap类似,只是通过分段锁实现一个线程安全的Map。通过分段锁的设计既能减小锁的开销,又能保证数据的正确性。

5.ConcurrentSkipListMap

特点: ConcurrentSkipListMap是使用跳表的数据结构,有排序功能,对内部Node操作都是使用的是CAS进行更新。是线程安全的。

1 0
原创粉丝点击