Tag1:自己总结,如有什么问题,会及时更正。
Tag2:重点在于集合框架结构分析和底层数据结构实现原理。
一、集合框架结构图
二、分类分析
1、常用List总结
红色编号1:以上四个方法均直接或者间接继承自AbstractList,都可以储存相同数值。其中,ArrayList在实际运用中使用最多,LinkedList其次。其它两个基本不用。由于ArrayList和LinkedList的结构特征,注定了它们的优缺点刚好相反,在实际应用中应根据它们的优缺点选择使用。另外,ArrayList的使用远远多于LinkedList。
2、常用Set总结
浅蓝色编号2:以上三个set 集合均直接或者间接继承于AbstractSet方法,均不可以存储相同对象值。其中LinkedHashSet继承自HashSet,具有链表的结构,因此,有序。TreeSet有树形的结构,默认是升序排列,可以实现比较器接口,进行自定义排序。同样,TreeSet也可以实现比较器接口,进行自定义排序。HashSet没有不能排序(没有相关方法)。其中,HashSet最常用。
3、 常用 Map 总结
浅青色编号3:HashMap和HashSet具有一样的数据结构,同样不能排序,随机访问快的特点。LinkedHashMap继承自HashMap,有序。TreeMap具有树的结构,有序,可以实现比较器。特别注意:Hashtable 和Properties继承自Dictionary,和以上三个map继承自不同的父类,出现较早,线程安全,但基本已经不用。Properties多用于读写Java的配置文件。
常见的集合面试题(来源自网络)
1、HashMap和HashTable有何不同?
(1)HashMap允许key和value为null,而HashTable不允许。
(2)HashTable是同步的,而HashMap不是。所以HashMap适合单线程环境,HashTable适合多线程环境。
(3)在Java1.4中引入了LinkedHashMap,HashMap的一个子类,假如你想要遍历顺序,你很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的。
(4)HashMap提供对key的Set进行遍历,因此它是fail-fast的,但HashTable提供对key的Enumeration进行遍历,它不支持fail-fast。
(5)、HashTable被认为是个遗留的类,如果你寻求在迭代的时候修改Map,你应该使用CocurrentHashMap。
2、如何决定选用HashMap还是TreeMap?
对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。
3、ArrayList和Vector有何异同点?
ArrayList和Vector在很多时候都很类似。
(1)两者都是基于索引的,内部由一个数组支持。
(2)两者维护插入的顺序,我们可以根据插入顺序来获取元素。
(3)ArrayList和Vector的迭代器实现都是fail-fast的。
(4)ArrayList和Vector两者允许null值,也可以使用索引值对元素进行随机访问。
以下是ArrayList和Vector的不同点。
(1)Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。
(2)ArrayList比Vector快,它因为有同步,不会过载。
ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。
4、ArrayList和LinkedList有何区别?
ArrayList和LinkedList两者都实现了List接口,但是它们之间有些不同。
(1)ArrayList是由Array所支持的基于一个索引的数据结构,所以它提供对元素的随机访问,复杂度为O(1),但LinkedList存储一系列的节点数据,每个节点都与前一个和下一个节点相连接。所以,尽管有使用索引获取元素的方法,内部实现是从起始点开始遍历,遍历到索引的节点然后返回元素,时间复杂度为O(n),比ArrayList要慢。
(2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素会更快,因为在一个元素被插入到中间的时候,不会涉及改变数组的大小,或更新索引。
(3)LinkedList比ArrayList消耗更多的内存,因为LinkedList中的每个节点存储了前后节点的引用。
5、Collections类是什么?
Java.util.Collections是一个工具类仅包含静态方法,它们操作或返回集合。它包含操作集合的多态算法,返回一个由指定集合支持的新集合和其它一些内容。这个类包含集合框架算法的方法,比如折半搜索、排序、混编和逆序等。