List所包含的元素可以重复,元素按放入的先后顺序来存放;Map中的key-value对是无序的,key不允许重复。
可以把List当作Map来看,List相当于一个key都是int类型的Map。
程序通过元素的索引(相当于通过int类型的key)来读取List集合的元素时,可以当作Map根据key来读取value。
Map也可以当成是元素索引可以是任意类型的List集合
这两个类都实现了List接口,List接口继承了Collection接口。
他们都是有序集合。
存储的元素位置都是有顺序的,相当于动态的数组。
可以按照位置索引来取出某个元素。
并且其中的数据是允许重复的,这是由List集合规范制订的。
ArrayList和Vector的底层都是基于数组的。因此他们的实现代码也大致相似。
总体来说,ArrayList可以完全代替Vector,除了在一些很古老的API中强制要求使用Vector之外。
Vector还有一个特征,它是线程安全的,因此性能比较差。
ArrayList是线程不安全的,因此性能较好。
即使在多线程环境下使用List集合,也应该选用ArrayList而不是Vector。因为Java还提供了一个Collections工具类,它可以把ArrayList包装成线程安全的集合类,例如如下代码:
List list = Collections.synchronizedList(new ArrayList());
ArrayList和Vector都是使用数组方式储存数据的。
数组元素的数据大于实际储存的数据以便增加和插入元素。
它们都允许直接按序号索引元素。但是插入元素需要涉及数组元素移动等内存操作。所以索引数据快,插入数据慢。
Vector由于使用了synchronized方法,因此是线程安全的,性能上较ArrayList差。
LinkedList使用双向链表来实现储存。序号索引数据需要进行前向或后向遍历。插入数据时,记录本项的前后项即可。所以插入速度较快。
LinkedList也是线程不安全的。LinkedList提供了一些方法使得其可以当作栈和队列进行使用。实际上Java提供了Collections工具类,它可以把ArrayList和LinkedList包装成线程安全的集合。
因此实际编程中应该避免使用vector。
HashMap与Hashtable的区别类似于ArrayList与Vector的区别。
Hashtable与Vector都是JDKl.0就有的一个古老的集合。
Hashtable是一个继承自Dictionary的古老集合。
从JDK1.2引入了集合框架的Map接口后,Java用Hashtable也实现了Map接口。Hashtable也新增实现了一些Map接口中定义的方法。
实际上Hashtable和HashMap的底层的实现很相似。他们都是基于Hash表的实现。
实际上,在多线程环境下,Java的Collections工具类将HashMap包装成线程安全的类。因此依然应该使用HashMap。
Map map = Collections.synchronizedMap(new HashMap());
编程时应该尽量避免使用Hashtable
除非在一个古老的API中强制要求使用Hashtable
参考资料:4分钟理清Java常见集合类区别,看完80%的同学都涨薪了