Java Collection集合类
Collection/Map层次结构图
Collection接口
boolean add(Object o) ; 向集合中加入一个对象的引用
void clear();删除集合中所有的对象,即不再持有这些对象的引用
boolean isEmpty();判断集合是否为空
boolean contains(Object o);判断集合中是否持有特定对象的引用
Iterartor iterator();返回一个Iterator对象,可以用来遍历集合中的元素
boolean remove(Object o);从集合中删除一个对象的引用
boolean add(Object o);向集合中加入一个对象的引用
int size();返回集合中元素的数目
Object[] toArray();返回一个数组,该数组中包括集合中的所有元素
Iterator接口
接口声明了如下方法:
next();返回下一个元素.
remove();从集合中删除上一个元素.
Set/List/Map的区别
java集合的主要分为三种类型:
· Set(集)
· List(列表)
· Map(映射)
数组大小固定,一个数组只能存放类型相同的数据(基本类型/引用类型).
集合可以存储和操作数目不固定的一组数据。 集合只能存放引用类型的的数据,不能存放基本数据类型。
Set/List
Set集合中对象无序,不能重复.List集合中对象有序,可以重复.
Set :
Set不保存重复元素,不保证维护元素的次序。。加入Set的元素必须定义equals()方法以确保对象的唯一性。
HashSet:底层通过HashMap实现,为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
TreeSet:底层通过TreeMap实现,保存次序的Set, 底层为树结构。
LinkedHashSet:底层通过LinkedHashMap实现,具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。
ArrayList/LinkedList
ArrayList底层基于数组实现,执行查询操作高效;
LinkedList底层基于双向链表实现,执行插入和删除操作高效.
两者都使用ListIterator迭代器.
LinkedList
链表的基本单元Entry
private static class Entry<E> {
E element;
Entry<E> next;
Entry<E> previous;
}
ListIterator
hasNext();
E next();
hasPrevious();
E previous();
int nextIndex();
int previousIndex();
set(E e);
add(E e);
remove();
关 注 点 | 结 论 |
LinkedList是否允许空 | 允许 |
LinkedList是否允许重复数据 | 允许 |
LinkedList是否有序 | 有序 |
LinkedList是否线程安全 | 非线程安全 |
HashMap/HashTable
| HashMap | HashTable |
Key/value允许为null | 允许 | 不允许 |
线程安全 | 不安全 | 安全 |
Java 5 |
| ConcurrentHashMap |
名称是table大小是16的Entry数组;table数组存储了Entry类的对象。HashMap类有一个叫做Entry的内部类。这个Entry类包含了key-value作为实例变量.确定数组index:hashcode % table.length取模.
基本单元Entry(散列表结构,无序)
private static class Entry<E> {
final K key;
V value;
Entry next;
final int hash;
}
关键点:
HashMap有一个叫做Entry的内部类,它用来存储key-value对。
Entry对象是存储在一个叫做table的Entry数组中。
table的索引在逻辑上叫做“桶”(bucket),它存储了链表的第一个元素。
key的hashcode()方法用来找到Entry对象所在的桶。
如果两个key有相同的hash值,他们会被放在table数组的同一个桶里面。
key的equals()方法用来确保key的唯一性。
LinkedHashMap
双向链表结构
LinkedHashMap采用的hash算法和HashMap相同,重新定义了数组中保存的元素Entry,该Entry保存当前对象的引用,还保存其上一个元素before和下一个元素after的引用,哈希表的基础上构成双向链接列表。
static class Entry<K,V> extends HashMap.Node<K,V> {
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
ConcurrentHashMap
ConcurrentHashMap中主要实体类就是三个:ConcurrentHashMap(整个Hash表),Segment(桶),HashEntry(节点).
通过分析Hashtable就知道,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术.有些跨段方法,比如size()和containsValue(),需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。
容器类小结: