关于集合常见面试问题
一、list、set、map的区别:
答: list和set都实现了collection接口
List:允许重复、可以有多个null元素、有序(输出的顺序就是插入的顺序):ArrayList、LinkedList、Vector
set:不允许重复对象、无序排序、只允许有一个空元素:HashSet、LinkedHashSet、treeSet
Map:Map是一个接口,Map可以有多个null值但最多只能有一个null键:HashMap、Hashtable 、TreeMap
二、 ArrayList、LinkedList和Vector的区别:
ArrayList:通过索引,访问速度快
LinkedList: LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项前后项即可,插入数据较快
Vector:线程安全, Vector由于使用了synchronized方法-线程安全,所以性能上比ArrayList要差
三、hashSet、LinkedHashSet 和TreeSet的使用:
hashset: HashSet底层的确就是HashMap啊,把HashMap的value赋上一个固定的值不就和HashSet一样了
LinkedHashSet :
TreeSet:
四、HashMap、 Hashtable和TreeMap的区别:
这三个都对Map接口进行了实现:
1.HashMap是不安全的线程,他允许Key值出现一次null Value值出现无数次的Null
2.Hashtable是安全的线程,他不仅实现了Map接口也实现了Dictionary接口,他的key值与Value值都不允许出现Null
3.treeMap是可以进行排序的,默认按照键的自然顺序进行升序排序,若要进行降序排序则需要在构造集合时候传递一个比较器
五、 Hashtable和HashMap 的区别:
1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
2.HashTable不允许null值,key和value都不可以,HashMap允许null值,key和value都可以。HashMap允许key值只能由一个null值,因为hashmap如果key值相同,新的key, value将替代旧的。
3.HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。
4.HashTable使用Enumeration,HashMap使用Iterator。
5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
6.哈希值的使用不同,HashTable直接使用对象的hashCode。
六、 什么场景下使用list,set,map?(回答它们的优缺点就可以了)
答:
-
如果你经常会使用索引来对容器中的元素进行访问,那么 List 是你的正确的选择。如果你已经知道索引了的话,那么 List 的实现类比如 ArrayList 可以提供更快速的访问,如果经常添加删除元素的,那么肯定要选择LinkedList。
-
如果你想容器中的元素能够按照它们插入的次序进行有序存储,那么还是 List,因为 List 是一个有序容器,它按照插入顺序进行存储。
-
如果你想保证插入元素的唯一性,也就是你不想有重复值的出现,那么可以选择一个 Set 的实现类,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的实现类都遵循了统一约束比如唯一性,而且还提供了额外的特性比如 TreeSet 还是一个 SortedSet,所有存储于 TreeSet 中的元素可以使用 Java 里的 Comparator 或者 Comparable 进行排序。LinkedHashSet 也按照元素的插入顺序对它们进行存储。
-
如果你以键和值的形式进行数据存储那么 Map 是你正确的选择。你可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择。