集合框架总结
Collection:
1,List:
1,ArrayList:Object数组
2,Vector:Object
3,LinkedList:双向链表(JDK1.6之前为循环链表,JDK1.7取消循环)
2,Set:
1,HashSet(无序,唯一):基于HashMap实现的,底层采用HashMap来保存元素
2,LinkedHashSet:LinkedHashSet继承于HashSet,并且其内部是通过LinkedHashMap来实现的
3,TreeSet(有序,唯一):红黑树(自平衡的排序二叉树)
Map:
1,HashMap:JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,连表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)
2,LinkedHashMap
3,Hashtable
4,TreeMap:红黑树
=========================================================================================================
1.说说List ,Set ,Map三者的区别:
List(对付顺序的好帮手):List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象。
Set(注重独一无二的性质):不允许重复的集合。不会有多个元素引用相同的对象。
Map(用Key来搜索的专家):使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,
但是Key不能重复,典型的Key是String类型,但也可以是任何对象。
2.Arraylist与LinkedList区别
1,是否保证线程安全:Arraylist和LinkedList都是不同步的,也就都不保证线程安全
2,底层数据结构:Arraylist底层使用的是Object数组;
LinkedList底层使用的是双向链表数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环)
3,插入和删除是否受元素位置的影响:
1,ArrayList采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。
比如:执行add(E e)方法的时候,Arraylist会默认在将指定的元素追加到此列表的末尾,这种情况时间
复杂度就为O(1)。但是如果要在指定位置i插入和删除元素的话(add (int index, E element))时间复杂度
就为O(n-i)。因为在进行上述*作为时候集合中第 i 和第 i 之后的(n-i)个元素都要执行向后或向前移动一位的
*作。
2,LinkedList采用链表存储,所以对于add(E e)方法的插入,删除元素时间复杂度不受元素位置的影响,近似
O(1),如果是要在指定位置 i 插入和删除元素的话(add(int index,E element))时间复杂度近似为O(n)
因为需要先移动到指定位置再插入。
4,是否支持快速随机访问:
LinkedList不支持高效的随机元素访问,而ArrayList支持。
//快速随机访问就是通过元素的序号快速获取元素对象(对应于 get(int index)方法)。
5,内存空间占用:
ArrayList的空间浪费主要体现在 在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每
一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)
3,List的遍历方式选择:
实现了RandomAccess接口的List,优先选择普通for循环,其次foreach;
未实现RandomAccess接口的List,优先选择iterator遍历(foreach遍历底层也是通过iterator实现的),大size的数据,千万
不要使用普通的for循环