集合面试题

获取数组的长度使用什么?获取字符串使用什么?获取集合使用什么?

答: 获取数组的长度使用length属性

  获取字符串使用length()方法

  获取集合使用size()方法

 

 

HashMap和HashTable的区别?

 

相同点

 

HashMap 和 HashTable 都是基于哈希表实现的,其内部每个元素都是 key-value 键值对,HashMap 和 HashTable 都实现了 Map、Cloneable、Serializable 接口。

 

不同点

 

  • (1)继承的父类不同

 

HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。不过它们都同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口

 

  • (2) 线程安全性不同

 

Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步 HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。具体的原因在下一篇文章中会详细进行分析。使用HashMap时就必须要自己增加同步处理,虽然HashMap不是线程安全的,但是它的效率会比Hashtable要好很多。

 

  • (3)空值不同

  • HashMap 允许空的 key 和 value 值,HashTable 不允许空的 key 和 value 值。HashMap 会把 Null key 当做普通的 key 对待。不允许 null key 重复。

  • (4) 初始容量大小和每次扩充容量大小的不同

 

Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。

 

HashMap 和 HashSet 的区别

HashSet 继承于 AbstractSet 接口,实现了 Set、Cloneable,、java.io.Serializable 接口。HashSet 不允许集合中出现重复的值。HashSet 其实就是用HashMap来实现的,所有对 HashSet 的操作其实就是对 HashMap 的操作。所以 HashSet 也不保证集合的顺序,也不是线程安全的容器。

 

ArrayList和LinkedList的区别?

1)ArrayList和LinkedList可想从名字分析,它们一个是Array(动态数组)的数据结构,一个是Link(链表)的数据结构,此外,它们两个都是对List接口的实现。 前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列

2)当随机访问List时(get和set操作),ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。

3)当对数据进行增加和删除的操作时(add和remove操作),LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。

4)从利用效率来看,ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。

5)ArrayList主要控件开销在于需要在lList列表预留一定空间;而LinkList主要控件开销在于需要存储结点信息以及结点指针信息。

 

Set 与 List 有什么不同?

List,Set都是继承自Collection接口

List特点:元素有放入顺序,元素可重复 ,

Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)

List接口有三个实现类:LinkedList,ArrayList,Vector ,

Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet

 

ArrayList和Vector的区别?

1)不同的在于序列化方面:ArrayList比Vector安全

在ArrayList集合中:

//采用elementData数组来存储集合元素 private transient Object[] elementData;

在Vector集中中:

//采用elementData数组来保存集合元素 private Object[] elementData;

从源码可以看出,ArrayList提供的writeObject和readObject方法来实现定制序列化,而Vector只是提供了writeObject方法,并没有完全实现定制序列化。

2)不同点在于Vector是线性安全的,ArrayList是非线性安全的

ArrayList和Vector的绝大部分方法都是一样的,甚至连方法名都一样,只是Vector的方法大都添加关键之synchronized修饰。

在add方法中,Vector电泳的是insertElementAt(element,index);

public synchronized void isnertElementAt(E obj,int index);

将 ArrayList中的add(int index,E element)方法和Vector的isnertElementAt(E Obj,int index)方法进行对比,可以发现vectorde insertElementAt(E obj,int index)方法只是多了synchronized修饰。

3)扩容上区别

ArrayList集合和Vector集合底层都是数组实现的,在数组容量不足的时候采取的扩容机制不同。

ArrayList集合容量不足,采取在原有容量基础上扩充为原来的1.5倍。

而Vector则多了一个选择:当capacityIncrement实例变量大于0时,扩充为原有容量加上capacityIncrement的容量值。否则采取在原有容量基础上扩充为原来的1.5倍。

Collection 和 Collections的区别?

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

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

posted on 2017-02-16 20:20  LoaderMan  阅读(173)  评论(0编辑  收藏  举报

导航