类之间的继承关系——不含接口
实现了Iterator接口的集合必须提供一个可以获得Iterator对象的方法。且通过Iterator,集合便有了hasNext(), remove()等方法。并可以使用增强for循环
接口之间的继承接口——不含类
1.AbstractCollection(聚类)
1.1 AbstractList(列表)
1.1.1ArrayList(线性表)—在内存里面地址是连续的线性空间,那么对于随机存储会很方便,因为他可以直接到的是对象地址,对于没有元素删减的操作方便
1.1.2.LinkedList(链表)—-在内存里面的地址是随机的,当要找一个元素的时候需要找到第一个元素,然后一直往回找,但是节点与节点之间是链表形式的所以删除和插入元素比较方便
Vector(线性同步表)—在多个线性访问的时候,会进行锁操作,让在同一个时间段只有一个线程访问Vector对象,所以Vector是线程安全的,每个方法都加了synchronized修饰符,除此之外和ArrayList是一样的。
1.1.3.Stack–栈,先进后出push()加到栈顶,poll()从栈顶拿出
1.2AbstractSet(集合)
1.2.1.HashSet(随机集合)HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。
1.2.2.TreeSet(有序集合)—TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。
1.3AbstractQueue(队列)
1.3.1AbstractQueue实现了Queue接口,可以像排队一样先进先出
offer()在队尾加入对象,poll()从队首取出对象,peek()判断是否还能取出元素,remove()移除元素不能返回null
1.3.2Deque继承了Queue接口可以指定在队前、队末加入和取出对象
public class Test {
public static void main(String[] args) {
Queue q=new LinkedList<>();
q.offer("1");
q.offer("2");
q.offer("3");
System.out.println(q.poll());
}
}
2.AbstractMap(键值对)
首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value。这就是我们平时说的键值对。
2.1HashMap与TreeMap
2.1.1HashMap–values是无序的
2.1.1TreeMap–values是有序的
3.Dictionary
HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)
和值(value),而Hashtable则不行)。
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtab
le;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有
其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove
()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也
是Enumeration和Iterator的区别。
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程
,那么使用HashMap性能要好过Hashtable。HashMap不能保证随着时间的推移Map中的元素次序是不变的。
总结 hashmap非线性安全,hashTable是线性安全的