集合接口以及常用实现类:
collection和Map区别:
Collection是最基本的集合接口,存储的是Object。JDK不提供直接继承Collection的类,提供了Collection的子接口List和Set。
Map是以key-value的形式来存储的,可看成是key集合,或Value集合,或key-value集合,key不可重复。Map常用的实现类主要是HashMap、HashTable、TreeMap、LinkedHashMap。
List和Set区别:
List和Set都继承了Collection接口。
List中的元素是有序的,可以重复。
Set中的元素是无序的,不可以重复。
List和数组的区别:
数组维数是固定的,赋值不允许超过数组定义的大小。
List会随着元素的增减自动为每个元素确定一个相应的位置。
List的常用实现类主要是:
ArrayList
LinkedList
Vector
ArrayList和LinkedList区别:
ArrayList是以数组方式实现的,可以使用索引的方式来快速定位对象,因此,在读取操作上使用ArrayList效率较高。对于插入和删除操作,需要移动后端的数组元素,从而重新调整索引顺序,调整索引顺序会消耗一定时间,ArrayList不适于插入删除操作。
LinkedList是以链表方式实现的,对于插入和删除操作,只要改变前后对象的引用即可,因此,在插入和删除操作上,LinkedList效率较高。对于读取操作,需要遍历节点来定位元素,效率较低。
因此,当需要频繁随机访问数据时,采用ArrayList。当需要频繁操作其中的数据而不用随机访问时,采用LinkedList。
ArrayList和Vector区别:
Vector是线程安全的,当一个Iterator被创建而且正在被使用时,另一线程改变了Vector的状态,这时Iterator的方法将抛出异常。
ArrayList/LinkedList是非线程安全的。
ArrayList和Vector实现机制相似,都是使用数组来控制对象。二者初始化长度都为10。当增加的数据超过10时,Vector缺省情况下自动增长原来一倍的数组长度。ArrayList增长原来的50%的长度。如果要保存大量的数据,那么,使用Vector比较好一些,因为可以通过设置集合的初始化大小来避免不必要的资源开销。【见最下长度增长图片】
HashMap和HashTable区别:
二者比较类似,HashMap是非线程安全的。HashTable是线程安全的。
关于是否同步的选择:
如果程序在单线程环境中,或者访问仅仅在单线程中进行,考虑非线程安全的类,这样效率较高。如果多个线程可能同时操作一个类,就应该使用线程安全的集合类。