注:java中的Map、HashMap类似于C#中的Dictionary
如:Java
import java.util.*; Map map = new HashMap(); map.add(o);
C#
using system; using system.Collections.Generic; IDictionary map = new Dictionary(); map.Add(o);
-----------------------------------------分割线------------------------------------------------
有序否 |
允许元素重复否 |
||
Collection |
否 |
是 |
|
List |
是 |
是 |
|
Set |
AbstractSet |
否 |
否 |
HashSet |
|||
TreeSet |
是(用二叉树排序) |
||
Map |
AbstractMap |
否 |
使用key-value来映射和存储数据,Key必须惟一,value可以重复 |
HashMap |
|||
TreeMap |
是(用二叉树排序) |
几个面试常见问题:
1.Q:ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?
A:Vector和HashTable是线程同步的(synchronized)。性能上,ArrayList和HashMap分别比Vector和Hashtable要好。
2.Q:大致讲解java集合的体系结构
A:List、Set、Map是这个集合体系中最主要的三个接口。
其中List和Set继承自Collection接口。
Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。
List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。
Map也属于集合系统,但和Collection接口不同。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是三个主要的实现类。
SortedSet和SortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序。
3.Q:Comparable和Comparator区别
A:调用java.util.Collections.sort(List list)方法来进行排序的时候,List内的Object都必须实现了Comparable接口。
java.util.Collections.sort(List list,Comparator c),可以临时声明一个Comparator 来实现排序。
Collections.sort(imageList, new Comparator() {
public int compare(Object a, Object b) {
int orderA = Integer.parseInt( ( (Image) a).getSequence());
int orderB = Integer.parseInt( ( (Image) b).getSequence());
return orderA - orderB;
}
});
如果需要改变排列顺序
改成return orderb - orderA 即可。
1.List和Map区别:
1) list是存储单列数据的集合,Map是存储键和值这样的双列数据的集合
2) list 中存储的数据是有顺序,并且允许重复;Map中存储的数据是没顺序的,其键是不能重复的,值可以重复。
2. List,Set,Map是否继承自Collection接口
List和Set是继承自Collection接口,Map不是
3. List 、Map、Set三个接口,存取元素时,各有什么特点:
首先,List和Set具有相似性,它们都是单列元素的集合,所以,它们由一个共同的父接口,叫Collection。
1)Set
Set里面不允许有重复的元素,所谓重复,即不能有两个相等的对象。
Set集合通过add方法存对象,该方法有一个boolean的返回值,当集合中没有某个元素时,add方法可成功加入该元素,并返回true,否则返回false。
Set取元素时,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。
2)List
List表示有先后顺序的集合。可调用add(int index,Objecet)方法,指定当前对象在集合中的存放位置。
List除了可以从Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。
3)Map
Map与List和Set不同,它是双列的集合,其中有put方法,定义如下:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。
取可以根据key获得相应的value,即get(Object key)返回值为key所对应的value。另外,也可以获得所有的key的结合,还可以获得key和value组合成的Map.Entry对象的集合。
4. ArrayList Vector LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于世纪存储的数据以便增加和插入元素,他们都允许直接按序号索引元素,但是插入元素要设计数组元素移动等内存操作,所以索引数据快而插入数据慢。
vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数据较快。
LinkedList也是县城不安全的,LinkedList提供了一些方法,使得LinkedList可以被当做堆栈和队列来使用。
5.Collection和Collections的区别:
Collection是集合类的上级接口,继承与它的接口主要有Set和List。
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
6. Collection框架中实现比较要实现的接口: comparable/comparator
7. ArrayList和Vector的区别:
相同点:
这两个类都实现了List接口(List接口继承了Colection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,并且 其中的数据是允许重复的,这事HashSet之类的结合的最大不同,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素。
区别:
(1)同步性
Vector是线程安全的,也就是说它的方法之间是线程同步的,而ArrayList是线程不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高一些;如果有多个线程会访问集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
(2)数据增长
ArrayList和Vector都有一个初始的容量大小,当存储进他们里面的元素的个数超过了容量时。就需要增加ArrayList和Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用和程序效率之间要取得一定的平衡。
8. HashMap和Hashtable的区别:
相同点:
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。
HashMap允许将null作为一个entry的key获知value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。
就HahsMap和Hashtable主要从三个方面来说:
一、历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现
二、同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程不安全的,不是同步的
三、值:只有HashMap可以让你将空值作为一个表的key或value