Collection

概念:单例集合顶级父类

  • 公共方法
  • boolean add(E e) 添加元素
  • booean remove(Object o) 删除元素
  • void clean() 清空集合
  • boolean contains(Object o) 判断集合是否存在指定元素
  • boolean isEmpty() 判断集合是否为空
  • int size() 集合的长度,也就是集合中元素的个数
  • 遍历方法
public interface Iterator<E>
  • boolean hashNext() 如果迭代中还有元素,则返回true。
  • E next() 返回迭代中的下一个元素。
Collection<Person> person = new ArrayList<Person>();
//添加
person.add(new Person("Tom",21));
person.add(new Person("Kitty",23));
person.add(new Person("Jack",22));

Iterator<Person> iterator = person.iterator();//遍历

while(iterator.hasNext()){//循环迭代
    Person p = iterator.next();//转换
    System.out.println(p.getName() +" || "+p.getAge());
}

List

特点:

  1. 有序,存储和取出的元素顺序一致
  1. 可重复,存储的元素可以重复
List特有方法
• boolean add(E e) Appends the specified element to the end of this list.
• 添加指定元素到末尾
• void add(int index, E element) Inserts the specified element at the specified position in this list.
• E remove(int index) Removes the element at the specified position in this list.
• boolean remove(Object o) Removes the first occurrence of the specified element from this list, if it is present.
• E set(int index, E element) Replaces the element at the specified position in this list with the specified ele
  • ment.
LinkedList 特有方法
• void addFirst(E e) Inserts the specified element at the beginning of this list.
• void addLast(E e) Appends the specified element to the end of this list.
• E getFirst() Returns the first element in this list.
• E getLast() Returns the last element in this list.
• E removeFirst() Removes and returns the first element from this list.
• E removeLast() Removes and returns the last element from this list.

Set

特点

  1. 不带重复元素的集合
  2. 没有带索引的方法,所以不能使用普通的for循环
HashSet

特点

  1. 底层数据结构是hash表
  2. 对集合的迭代顺序不做任何保证,也就是说不保证存储和取出的元素顺序一致
  3. 没有带索引的方法,所以不能使用普通的for循环遍历
  4. 由于是set集合,所以是不包含重复元素的集合

方法:

hashset元素不重复源码

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{...
//hashset元素不重复源码   
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}
static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
}
//hash值和元素的hashCode()方法相关
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
    	//如果hash表未初始化,就对其初始化
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
		//根据对象的hash值计算对象的存储位置,如果该位置没有元素,则存储元素
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);
        else {
            Node<K,V> e; K k;
            /**
            	比较hash值:
            	存入元素和以前的元素比较hash值,
            		如果hash值不同,会执行下去,把元素添加到集合
            		如果hash值相同,会调用对象的equales方法,
            			如果返回false,会继续执行,把元素添加到集合
            			如果返回true,说明元素重复,不存储
            */
            if (p.hash == hash &&
                ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;
            else if (p instanceof TreeNode)
                e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
            else {
                for (int binCount = 0; ; ++binCount) {
                    if ((e = p.next) == null) {
                        p.next = newNode(hash, key, value, null);
                        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);
                        break;
                    }
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        break;
                    p = e;
                }
            }
            if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;
            }
        }
        ++modCount;
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);
        return null;
    }
  • 如果hashset装入对象,对象需要重写hashCode()和equals方法便可让装入的对象避免重复。

hashset无重复值的关键因素:

重写了hashCode() 和 equals() 方法

linkedHashSet

概述:

  • 哈希表和链表实现了Set接口,具有可预测的迭代次序。 这种实现不同于HashSet,它维持于所有条目的运行双向链表。 该链表定义了迭代排序,它是将元素插入集合(插入顺序的顺序 。 请注意,如果一个元件被重新插入到组插入顺序不受影响

特点:

  1. 哈希表和链表实现的set接口,具有可预测的迭代次序
  2. 由链表保证元素有序,也就是元素存取的顺序是一致的
  3. 由哈希表保证元素唯一,也就是没有重复的元素
TreeSet

特点:

  1. 元素有序,具体顺序取决于其构造方法。
  2. 没有带索引的方法,所以不能使用普通的for循环遍历
  3. 由于是set集合,所以不包含重复元素的集合
  • 构造方法

TreeSet() 构造一个新的,空的树组,根据其元素的自然排序进行排序。

TreeSet(Collection<? extends E> c) 构造一个包含指定集合中的元素的新树集,根据其元素的 自然排序进行排序

TreeSet(Comparator<? super E> comparator) 构造一个新的,空的树集,根据指定的比较器进行排序。

TreeSet(SortedSet<E> s) 构造一个包含相同元素的新树,并使用与指定排序集相同的顺序。

Map

特点: 以(key,value)形式键值对来 存储数据

常用方法:

• void clear() 删除map中所有的映射
• boolean containsKey(Object key) 如果map中包含指定的key值,返回true
• boolean containsValue(Object value) 如果map中包含指定的value值,返回true
• Set<Map,Entry<K,V> entrySet() Returns a Set view of the mappings contained in this map.
• boolean isEmpty() Returns true if this map contains no key-value mappings.
• Set keySet() Returns a Set view of the keys contained in this map. 返回所有key的集合
• V put(K key, V value) 添加 键值对 Associates the specified value with the specified key in this map (optional operation).
• V remove(Object key) Removes the mapping for a key from this map if it is present (optional operation).
• V get(Object key) Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.
Collection(V) values() Returns a Collection view of the values contained in this map.
HahMap

Modifier and Type

Method and Description

void

clear()Removes all of the mappings from this map.

boolean

containsKey(Object key)Returns true if this map contains a mapping for the specified key.

boolean

containsValue(Object value)Returns true if this map maps one or more keys to the specified value.

Set<Map.Entry<K,V>>

entrySet()Returns a Set view of the mappings contained in this map.

V

get(Object key)Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.

boolean

isEmpty()Returns true if this map contains no key-value mappings.

Set<K>

keySet()Returns a Set view of the keys contained in this map.

V

put(K key, V value)Associates the specified value with the specified key in this map.

V

remove(Object key)Removes the mapping for the specified key from this map if present.

boolean

remove(Object key, Object value)Removes the entry for the specified key only if it is currently mapped to the specified value.

V

replace(K key, V value)Replaces the entry for the specified key only if it is currently mapped to some value.

boolean

replace(K key, V oldValue, V newValue)Replaces the entry for the specified key only if currently mapped to the specified value.

int

size()Returns the number of key-value mappings in this map.

Collection<V>

values()Returns a Collection view of the values contained in this map.

HashTable

概念:线程安全,键和值都不能为空

  1. 若不需要线程安全的实现,HashMap 优于 HashTable
  2. 若需要线程安全的高并发的实现,ConcurrentHashMap 优于 HashMap
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, Serializable
ConcurrentHashMap
public class ConcurrentHashMap<K,V>
extends AbstractMap<K,V>
implements ConcurrentMap<K,V>, Serializable
TreeMap

根据其键值进行自然排序或创建时提供的comparator进行排序,具体取决于使用的构造函数。

public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable