Collection集合类

来源:互联网 发布:淘宝上怎么买到a货翡翠 编辑:程序博客网 时间:2024/05/22 12:50

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接口

接口声明了如下方法:

hasNext();判断集合中元素是否遍历完毕.

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(),需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。

容器类小结:

 

 


0 0