java中有些类实现功能大同小异,他们最大的区别就在于是否是线程安全的。
- StringBuilder与StringBuffer
这两种类内部都维护了一个字符数组,不同于String类中的final所修饰的字符数组,这两种类都可不断地向字符数组中加入字符,也就是一种可变的字符序列。所以当需要进行大量的字符串拼接时可使用这两种类。
他们的区别在于,StringBuffer是线程安全的,而StringBuilder是线程不安全的,造成这种区别的原因是StringBuffer中的方法都被synchronized所修饰。
- Vector与ArrayList
这两种类都采用线性连续存储空间,即通过数组来存储数值,且他们都是List接口的实现类,List的实现类还有一个LinkedList
不同之处在于,
其一,Vector是线程安全的,而ArrayList是线程不安全的,这同样是由于Vector的方法被synchronized所修饰而造成的。
其二,当存储空间不同时,Vector默认增长至原来容量的两倍,而ArrayList增长至原来的1.5倍。
其三,Vector能通过capacityIncrement方法来设置每次增加多少存储容量,而ArrayList则不可以。
- HashMap与Hashtable
这两种类都是通过hash算法来判断数据存储位置,且都实现了Map接口(Hashtable是在JDK4中被重写了,实现了Map接口),通过键值对的方式存储数据。
不同之处在于,
其一,HashMap是线程不安全的,Hashtable是线程安全的,同样是由于Hashtable的方法被synchronized修饰造成。
其二,HashMap可以接收键值(key)为null或者value为null的键值对,而Hashtable不行。
其三,HashMap与Hashtable的迭代器不同,HashMap的迭代器是Iterator类型的,而Hashtable的迭代器是Enumerator类型的。
在JDK5中提供了ConcurrentHashMap,它也是线程安全的,它是Hashtable的替代品,他的扩展性比Hashtable更好。
以上几种类中线程安全的比线程不安全的执行速度更慢,当我们想要将线程不安全的类同步时,我们可以通过Collections的三个方法synchronizedList(list),synchronizedSet(set),synchronizedMap(map)来将其转为线程安全。
网友评论