Java面试题(二) 集合框架


什么是集合?什么时候使用集合?

当数据多了需要存储,需要容器,但是数据的个数又不确定的时候,无法使用数组(数组长度是固定的,集合长度是可变的),这时便使用了Java中的另一个容器--集合

细节:

集合中存储的都是对象的地址(引用)

集合中不可以存储基本数据类型(Jdk 1.5之前)   之后可以存储,但是存储的还是对象(自动装箱/拆箱)

存储的时候自动提升为Object类型,取出的时候如果需要使用元素的特有内容,必须进行向下转型


集合框架体系结构

在网上找的图,感觉很不错

Java面试题(二) 集合框架

ArrayList和Vector的区别?

先说一下共同点

这两个类都实现了List接口(List接口继承了Collection接口),它们是有序的集合(存储在这两个集合中的元素是有序的,相当于动态数组),其中的数据允许重复,特点是查询速度快,增删较慢,初始的默认为10

区别是

1.Vector是线程安全的,也就是说是它的方法之间是线程同步的

  ArrayList是线程序不安全的,它的方法之间是线程不同步的

2.Vector默认增长为原来两倍

   ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)

3.Vector可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法


HashMap和Hashtable的区别?

HashMap允许key和value为null,而HashTable不允许。

HashTable是同步的,而HashMap不是。所以HashMap适合单线程环境,HashTable适合多线程环境。

在Java1.4中引入了LinkedHashMap,HashMap的一个子类,假如你想要遍历顺序,你很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的。

HashMap提供对key的Set进行遍历,因此它是fail-fast的,但HashTable提供对key的Enumeration进行遍历,它不支持fail-fast。

HashTable被认为是个遗留的类,如果你寻求在迭代的时候修改Map,你应该使用CocurrentHashMap。


让HashMap同步的方法

Map m = Collections.synchronizeMap(hashMap);


List、Set与Map区别?

List、Set都是继承自Collection接口,而Map不是

List允许有重复的元素(何数量的重复元素都可以在不影响现有重复元素的值及其索引的情况下插入到 List),Set不允许重复(Set 以及所有实现了 Set 接口的类都不允许重复值的插入),Map 以键值对的形式对元素进行存储(Map不允许重复键,但允许重复值)

List允许有任意数量的空值,Set最多允许一个空值出现,Map只允许一个空键,但允许任意数量的空值出现

List及其所有实现类保持了每个元素的插入顺序,Set中的元素是无序的(但某些 Set 的实现类以某种顺序对其中的元素进行排序,比如 LinkedHashSet 按照元素的插入次序进行排序)

Map 跟 Set 一样对元素进行无序储存(但其某些实现类对元素进行了排序,TreeMap 依据键对其中的元素进行升序排序,而 LinkedHashMap 则按照每个元素的插入次序进行排序)


Collection和Collections的区别?

Collection是集合类的上级接口,继承他的接口主要有Set和List.

Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。


Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?

使用equals()方法进行判断


Enumeration和Iterator接口的区别?

Enumeration的速度是Iterator的两倍,也使用更少的内存

与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其它线程去修改集合

迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者从集合中移除元素,而Enumeration不能做到