1.Iterable
是java顶级接口之一,Collection
接口继承Iterable
,所以Collection
的所有子类也实现了Iterable
接口。
允许对象成为 "foreach" 语句的目标。一个Iterable接口类可以使用foreach循环,例如
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<String>();
for(String str : arr){
System.out.println(str);
}
}
他只有一个方法:
/**
* Returns an iterator over a set of elements of type T.
*
* @return an Iterator.
*/
Iterator<T> iterator();
返回一个在一组 T 类型的元素上进行迭代的迭代器。2.Collectins接口
是层次结构中的根接口,Collection所代表的是一种规则它所包含的元素都必须遵循一条或者多条规则。如有些允许重复而有些则不能重复、有些必须要按照顺序插入而有些则是散列有些支持排序但是有些则不支持。如:List、Set。
主要方法:
a.add()确保此 collection 包含指定的元素(可选操作)。
b.contains()如果此 collection 包含指定的元素,则返回 true。
c.remove() 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
3.List接口
List是Collection的直接子接口,提供有序的集合即它用某种特定的插入顺序来维护元素顺序。用户可以对列表中每个元素的插入位置进行精确地控制,同时可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。
其主要实现类:
a)ArrayList类
ArrayList是一个动态的数组,也是最常用的数组,它允许符合规则的任何元素插入包括null,提供3个构造函数,默认构造长度为10的数组,也可构造一个包含指定 collection 的元素的列表,随着容器中元素的增加,数组的长度也会随之增加。每次添加新元素都会检查容器长度,当快要溢出时,则进行扩容。
ArrayList擅长于随机访问,且是线程不安全。
b)LinkedList类
Linked是一个双向链表结构,由于是双向链表结构,LinkedList额外提供了列表开头和结尾get、remove 和 insert 元素,由此这些操作允许将链接列表用作堆栈、队列或者双端队列。
和ArrayList的结构一样,也是非同步的,多线程操作需要加上同步操作。
c) Vector
Vector和ArrayList一样也是一个动态数据,提供指定容量增量的的构造函数,其他操作和ArrayList一致,不同的是Vector的方法都是同步方法,所以是多线程安全数组。
d)Stack
Stack表示一个后进先出的(LIFO)对象堆栈,数据结构与Vector基本一致,对Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。
首次创建堆栈时,它不包含项。
4.Set接口
一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2)
的元素对 e1
和 e2
,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。实现了Set接口的集合有:EnumSet、HashSet、TreeSet。
a)HashSet
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
b)TreeSet
基于 TreeMap
的 NavigableSet
实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator
进行排序,具体取决于使用的构造方法。
c)EnumSet
是枚举的专用Set。所有的元素都是枚举类型。
5.Map
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。保证了键值的一一对应关系,实现map的有:HashMap、TreeMap、HashTable、Properties、EnumMap。
a) HashMap
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashMap是基于数组及链表的结构,通过Key的hashCode映射到数组位置,再判断该位置是否存在数据,在验证是否有相同的key值存在,在此基础上添加。
b) TreeMap
基于红黑树(Red-Black tree)的 NavigableMap
实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator
进行排序,具体取决于使用的构造方法。
此实现不是同步的。如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 外部同步。
c) HashTable
与HashMap结构相同,不同是只允许非空的键值,且是线程安全,效率低于HashMap。
6.Queue
队列,它主要分为两大类,一类是阻塞式队列,队列满了以后再插入元素则会抛出异常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。另一种队列则是双端队列,支持在头、尾两端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。
7.异同点
a)ArrayList、Vector
相同点:
1)都是动态数组,支持动态扩容,都支持随机访问
2)Vector和ArrayList的数据结构都相同,在查找指定位置的数据时间复杂度是相同的,但在删除、移动指针位置就需要所有元素移动,相比之下LinkedList链表的结构效率更高。
不同点:
1)Vector方法都是同步方法,是线程安全的,而ArrayList是不同步的方法,所以在多线程开发需要考虑线程安全。
2)如果集合中的元素的数据大于目前集合数组的长度时,Vector的增长率是目前数组长度的100%,ArrayList增长率是目前数组长度的50%,如在集合中使用数据量比较大的数据。Vector有一定的优势。
b)ArrayList、LinkedList
不同点:
1)ArrayList是基于动态数组的结构,LinkedList是基于双向链表的结构
2)对于随机访问get set,ArrayList的效率会更高,因为LInkedList需要指针查找。
3)对于新增删除,LinkedList更占优势,ArrayList需要移动数据。
两者都是非线程安全,需要主动进行同步操作,实际应用情况,当数据量少的时候新增删除ArrayList与LinkedList的效率差不多,涉及到大批量的数据新增修改LinkedList的效率会明显高于ArrayList。
c)HashMap、HashTable
1)Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
2)同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
3)HashMap可以让你将空值作为一个表的条目的key或value 。
d)TreeMap、HashMap
1)HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。HashMap中元素的排列顺序是不固定的)。
2) HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。集合框架”提供两种常规的Map实现:HashMap和TreeMap (TreeMap实现SortedMap接口)。
3) 在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和 equals()的实现。 这个TreeMap没有调优选项,因为该树总处于平衡状态。