Java常见集合类区别

Java常见集合类区别

  • 1. List和Map区别
    • 1.1 深入阐述
  • 2. ArrayList和Vector的区别
    • 2.1 具体区别
  • 3. ArrayList, Vector, LinkedList的存储性能和特性
  • 4. HashMap和Hashtable的区别
    • 4.1 两者区别总结

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 具体区别

  1. Vector是一个古老的集合,从JDK1.0开始便有了,因此它包含了大量方法名很长的方法。
  2. 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 两者区别总结

  1. HashMap允许使用null作为key或value,而Hashtable不允许
  2. HashMap线程不安全的,因此性能较好;但Hashtable线程安全的,因此性能较差。

实际上,在多线程环境下,Java的Collections工具类将HashMap包装成线程安全的类。因此依然应该使用HashMap。

Map map = Collections.synchronizedMap(new HashMap());

编程时应该尽量避免使用Hashtable

除非在一个古老的API中强制要求使用Hashtable

参考资料:4分钟理清Java常见集合类区别,看完80%的同学都涨薪了

你可能感兴趣的:(Java,java,jvm,开发语言)