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
特点:
- 有序,存储和取出的元素顺序一致
- 可重复,存储的元素可以重复
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
特点
- 不带重复元素的集合
- 没有带索引的方法,所以不能使用普通的for循环
HashSet
特点
- 底层数据结构是hash表
- 对集合的迭代顺序不做任何保证,也就是说不保证存储和取出的元素顺序一致
- 没有带索引的方法,所以不能使用普通的for循环遍历
- 由于是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,
它维持于所有条目的运行双向链表。 该链表定义了迭代排序,它是将元素插入集合(插入顺序 ) 的顺序 。 请注意,如果一个元件被重新插入到组插入顺序不受影响特点:
- 哈希表和链表实现的set接口,具有可预测的迭代次序
- 由链表保证元素有序,也就是元素存取的顺序是一致的
- 由哈希表保证元素唯一,也就是没有重复的元素
TreeSet
特点:
- 元素有序,具体顺序取决于其构造方法。
- 没有带索引的方法,所以不能使用普通的for循环遍历
- 由于是set集合,所以不包含重复元素的集合
- 构造方法
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HashTable
概念:线程安全,键和值都不能为空
- 若不需要线程安全的实现,HashMap 优于 HashTable
- 若需要线程安全的高并发的实现,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