集合框架
1、Set、Map区别:
Set继承了Collection接口;而Map没有。
Set具有元素的不重复性;Map保存的是键值对。
- HashSet是基于HashMap实现的,HashSet存储的值作为HashMap的key值存放,从而保证了值的不重复性,因此HashSet的增删改查也是基于HashMap来实现的。**HashMap允许空的键值对,HashSet允许空的值。**HashSet初始化是可以指定内部HashMap的initialCapacity和loadFactor。
- LinkedHashSet继承HashSet,它是基于LinkedHashMap实现的。通过维护一个运行于所有条目的双向链表,LinkedHashMap保证了元素迭代的顺序;所以LinkedHashSet也保证了元素迭代的顺序。LinkedHashMap允许空的键值对,LinkedHashSet允许空的值。
- TreeSet实现了SortedSet接口,它是基于TreeMap实现的。TreeMap底层是一个红黑树的数据结构,所以TreeMap保证了键的有序性,TreeSet保证了存储的值的有序性。两者的增删改查操作均与红黑树的高度有关,为O(logn)。两者初始化的时候都可以传入comparator或者使用key默认的比较器来作为排序的基准。因为需要排序比较,所以TreeMap不允许空的key但是value可以为空,TreeSet不允许空的值。
2、Set、List区别
Set保证了元素的不重复性,而List允许重复值的存在。当然,它们底层实现不一样,List是基于数组或者链表的数据结构实现的。List允许允许空的值,而Set根据具体的实现类而定。
3、Arraylist、LinkedList区别
Arraylist是基于数组实现的,而LinkedList是基于链表实现的。两者都保证了元素迭代的顺序。
4、HashSet、LinkedHashSet区别
LinkedHashSet继承了HashSet;内部实现等价于HashMap和LinkedHashMap的区别。
5、HashMap、TreeMap、LinkedHashMap
- HashMap和LinkedHashMap允许空的键值对,而TreeMap不允许空的key,但是允许空的value。
- HashMap底层是基于数组和链表实现的。LinkedHashMap在HashMap的基础上又维护了一个运行于所有条目的双向链表(在Node上增加两个指针)来保证元素迭代的顺序(即元素插入的顺序)。
- TreeMap底层是基于红黑树实现的,因为红黑树是一种自平衡二叉查找树,所以TreeMap保证了key的有序性,在TreeMap上增删改查操作均与红黑树的高度有关,为O(logn)。TreeMap的Key按照自然顺序进行排序或者根据创建映射时提供的Comparator接口进行排序。
- HashMap与LinkedHashMap保证了以O(1)的时间复杂度进行增、删、改、查,从存储角度考虑,这两种数据结构是非常优秀的。另外,LinkedHashMap还额外地保证了Map的遍历顺序可以与put顺序一致,解决了HashMap本身无序的问题。
- 如果只需要存储功能,使用HashMap与LinkedHashMap是一种更好的选择;如果还需要保证统计性能或者需要对Key按照一定规则进行排序(取出最值等操作),那么使用TreeMap是一种更好的选择。
简单来说,collection的子类如下:
--List:将以特定次序存储元素,所以取出来的顺序可能和放入顺序不同。
--ArrayList:擅长随机访问元素,但在List中间插入、删除、移动元素较慢。
--LinkedList:插入、删除、移动元素方便,随机访问元素差。
--Set:每个值只能保存一个对象,不能含有重复的元素。
--HashSet:使用散列函数。
--TreeSet:使用红黑树。
--LinkedHashSet:使用链表结合散列函数。
--Queue:先进先出的容器。
Map的子类有以下三个:
--HashMap
--HashTable
--TreeMap