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