[img]http://dl.iteye.com/upload/picture/pic/76977/9f624b02-d033-393f-8d82-1c15028a4ef1.jpg[/img]
集合类存放于java.util包中。
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
集合类型主要有3种:set(集)、list(列表)和map(映射)。
1、List([color=red]单列元素[/color]的集合)
列表的主要特征是其对象以线性方式(数组方式)存储,有先后顺序的集合,每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。[color=red]列表通常允许重复的元素[/color]。更正式地说,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。
列表的实现类主要有:数组(ArrayList)、链表(LinkedList)、向量(Vector)、堆栈(Stack)。
(1)ArrayList:List 接口的大小可变数组的实现。允许所有元素(包括 null)。每个实例都有一个容量,至少等于列表的大小。添加元素后,其容量也自动增长,每次默认增加原来的0.5倍。插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。[color=red]此实现不是同步的[/color]。
(2)LinkedList:List 接口的链接列表实现。允许所有元素(包括 null)。使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数据较快索引数据慢。此类实现 Queue 接口,在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将LinkedList用作堆栈、队列或双端队列(deque)。[color=red]此实现不是同步的[/color]。
(3)Vector:Vector 类可以实现可增长的对象数组。允许所有元素(包括 null)。与数组一样,可以使用整数索引访问组件。但是Vector 的大小可以根据需要增大或缩小,Vector默认增长为原来两倍。[color=red]此实现是同步的(线程安全)[/color]。
2、Set([color=red]单列元素[/color]的集合)
集(set)是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。对集中成员的访问和操作是通过集中对象的引用进行的,所以[color=red]集中不能有重复对象[/color]。 更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且[color=red]最多包含一个 null 元素[/color]。当增加相同的元素时,不会改变原有 set,并返回false。
集合的实现类主要有:TreeSet(实现排序功能)、HashSet。
(1)HashSet:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类[color=red]允许使用一个(最多一个)null 元素[/color]。[color=red]此实现不是同步的[/color]。对象类中必须override Object类中的两个方法(注意入参类型必须为Object),来确保对象元素的唯一性。
(2)TreeSet:基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序;或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法;或者根据set中对象类实现的Copmarable类的CompareTo方法比较,(1,-1,0)来确保对象元素的唯一性,为0表示对象相同,否则不同。[color=red]不允许有 null 元素[/color]。[color=red]此实现不是同步的[/color]。
3、Map([color=red]双列元素[/color]的集合)
将键映射到值的对象,此接口代替 Dictionary 类,后者完全是一个抽象类,而不是一个接口。每次存储时,要存储一对key/value,[color=red]不能存储重复的key,但允许有重复value,每个key只能对应唯一一个value值[/color]。
(1)TreeMap:该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。[color=red]此实现不是同步的[/color]。
(2)HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键(只能有一个key为null,value为null的可以有多个)。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。[color=red]此实现不是同步的[/color]。
(3)HashTable:不允许使用 null 值和 null 键(key、value都不能为null)。[color=red]此实现是同步的(线程安全)[/color]。
总结:
1、ArrayList与Vector的区别:
相同点:都实现了List接口,都是有序集合,可以按位置索引号取出某个元素,数据元素允许重复,允许是 null 值。是单列元素集合。
ArrayList:线程不安全(不同步),效率高(由于不执行同步),扩容时默认增加原来的0.5倍。
Vector:线程安全(同步),效率低,扩容时默认增长原来的一倍。
2、HashMap与HashTable的区别:
相同点:都实现了Map接口,是双列元素集合,key值不可以重复,value值可以重复。
HashMap:允许将null作为一个entry的key或者value(只能有一个key为null,value为null的可以有多个),线程不安全(不同步),效率高(由于不执行同步)。
HashTable:不允许将null作为一个entry的key或者value(key、value都不能为null),线程安全(同步),效率低。
3、List、Set、Map的区别:
List:单列集合,允许null元素和重复元素,是有序的集合,通过索引进行数据的访问。
Set:单列集合,不允许有重复元素(Hashset允许有null,TreeSet不允许有null),通过对象的应用来访问元素,是无序的集合(TreeSet通过对象类的compareTo方法来排序)。
Map:双列集合,不允许有重复的key值,允许有重复的value值。
集合类存放于java.util包中。
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
集合类型主要有3种:set(集)、list(列表)和map(映射)。
1、List([color=red]单列元素[/color]的集合)
列表的主要特征是其对象以线性方式(数组方式)存储,有先后顺序的集合,每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。[color=red]列表通常允许重复的元素[/color]。更正式地说,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。
列表的实现类主要有:数组(ArrayList)、链表(LinkedList)、向量(Vector)、堆栈(Stack)。
(1)ArrayList:List 接口的大小可变数组的实现。允许所有元素(包括 null)。每个实例都有一个容量,至少等于列表的大小。添加元素后,其容量也自动增长,每次默认增加原来的0.5倍。插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。[color=red]此实现不是同步的[/color]。
(2)LinkedList:List 接口的链接列表实现。允许所有元素(包括 null)。使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数据较快索引数据慢。此类实现 Queue 接口,在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将LinkedList用作堆栈、队列或双端队列(deque)。[color=red]此实现不是同步的[/color]。
(3)Vector:Vector 类可以实现可增长的对象数组。允许所有元素(包括 null)。与数组一样,可以使用整数索引访问组件。但是Vector 的大小可以根据需要增大或缩小,Vector默认增长为原来两倍。[color=red]此实现是同步的(线程安全)[/color]。
2、Set([color=red]单列元素[/color]的集合)
集(set)是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。对集中成员的访问和操作是通过集中对象的引用进行的,所以[color=red]集中不能有重复对象[/color]。 更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且[color=red]最多包含一个 null 元素[/color]。当增加相同的元素时,不会改变原有 set,并返回false。
集合的实现类主要有:TreeSet(实现排序功能)、HashSet。
(1)HashSet:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类[color=red]允许使用一个(最多一个)null 元素[/color]。[color=red]此实现不是同步的[/color]。对象类中必须override Object类中的两个方法(注意入参类型必须为Object),来确保对象元素的唯一性。
public int hashCode();
public boolean equals(Object obj);
(2)TreeSet:基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序;或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法;或者根据set中对象类实现的Copmarable类的CompareTo方法比较,(1,-1,0)来确保对象元素的唯一性,为0表示对象相同,否则不同。[color=red]不允许有 null 元素[/color]。[color=red]此实现不是同步的[/color]。
3、Map([color=red]双列元素[/color]的集合)
将键映射到值的对象,此接口代替 Dictionary 类,后者完全是一个抽象类,而不是一个接口。每次存储时,要存储一对key/value,[color=red]不能存储重复的key,但允许有重复value,每个key只能对应唯一一个value值[/color]。
(1)TreeMap:该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。[color=red]此实现不是同步的[/color]。
(2)HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键(只能有一个key为null,value为null的可以有多个)。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。[color=red]此实现不是同步的[/color]。
(3)HashTable:不允许使用 null 值和 null 键(key、value都不能为null)。[color=red]此实现是同步的(线程安全)[/color]。
总结:
1、ArrayList与Vector的区别:
相同点:都实现了List接口,都是有序集合,可以按位置索引号取出某个元素,数据元素允许重复,允许是 null 值。是单列元素集合。
ArrayList:线程不安全(不同步),效率高(由于不执行同步),扩容时默认增加原来的0.5倍。
Vector:线程安全(同步),效率低,扩容时默认增长原来的一倍。
2、HashMap与HashTable的区别:
相同点:都实现了Map接口,是双列元素集合,key值不可以重复,value值可以重复。
HashMap:允许将null作为一个entry的key或者value(只能有一个key为null,value为null的可以有多个),线程不安全(不同步),效率高(由于不执行同步)。
HashTable:不允许将null作为一个entry的key或者value(key、value都不能为null),线程安全(同步),效率低。
3、List、Set、Map的区别:
List:单列集合,允许null元素和重复元素,是有序的集合,通过索引进行数据的访问。
Set:单列集合,不允许有重复元素(Hashset允许有null,TreeSet不允许有null),通过对象的应用来访问元素,是无序的集合(TreeSet通过对象类的compareTo方法来排序)。
Map:双列集合,不允许有重复的key值,允许有重复的value值。