1.常用的集合有哪些,谈谈对它们的理解?
Collection接口:基本集合接口,位于java.util包中,单列集合,有两个子接口
(1).List接口:有序可重复接口,能够精确控制每个元素的插入位置,
有三个实现类
LinkedList:基于链表实现,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢;
ArrayList:基于数组;每次增删都要创建新的数组,但数组有索引。数组增
删慢,查找快
Vector:基于数组,线程安全的,效率低
(2).Set接口:元素不可重复接口;
有两个实现类
HashSet:存储的元素无序,不可重复,底层是哈希表
LinkedHashSet:存储的元素有序,不可重复,底层是哈希表和链表的结合
Map接口 :键—值对集合接口,有三个实现类(HashMap,HashTable,TreeMap)
HashMap:非线程安全,高效,无序。支持键或值为null值;
LinkedHashMap:是 HashMap 的一个子类,保存了记录的插入顺序
HashTable:线程安全,低效,不支持键或值为null值;
TreeMap: 能够把它保存的记录根据键排序,默认是键值的升序排序
2.HashMap和Hashtable 有什么区别?
HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是他们有以下不同点:HashMap允许键和值是null,而Hashtable不允许键或者值是null。
Hashtable是同步的,而HashMap不是同步的。因此HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
HashMap提供了可供应用迭代的键的集合,因此,HashMap 是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。一般认为Hashtable是一个遗留的类。
3.List、Map、Set 三个接口存取元素时,各有什么特点?
List以特定索引来存取元素,可以有重复元素。
Set不能存放重复元素(用对象的 equals()方法来区分元素是否重复)。
Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一。
Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果。
4.ArrayList 和 LinkedList 有什么区别?
ArrayList和LinkedList都实现了List接口,他们有以下的不同点:
ArrayList底层是数组实现的,它的访问速度快,添加删除需要遍历已使速度慢
LinkedList底层是链表实现的,访问速度较慢,添加删除速度快,占用内存大;
ArrayList 是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问速度快。与此对应,LinkedList是以元素链表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是 O(n)。相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
5.Collection 和 Collections 的区别。
Collection是集合类的上级接口,继承与他的接口主要有 Set 和 List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作
6. HashMap和HashTable、ConcurrentHashMap区别?
相同点:
HashMap和Hashtable都实现了Map接口
都可以存储key-value数据
不同点:
HashMap可以把null作为key或value,HashTable不可以
HashMap线程不安全,效率高。HashTable线程安全,效率低。
HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。
什么是fail-fast?
就是最快的时间能把错误抛出而不是让程序执行。
6.2 如何保证线程安全又效率高?
Java5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
ConcurrentHashMap将整个Map分为N个segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认N为16。
6.3 我们能否让HashMap同步?
HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);