set集合:
类似于一个罐子,很多对象都可以丢进去,通常是不能记住丢进去的顺序的,因此set集合中的对象不能是同一个对象。存 储的时候采用hash算法机制,计算存储的位置。
HashSet类:
无序,允许存放null值,地城封装的是HashMap,实现的时候是不同步的,线程步安全。
当存入一个元素的时候使用hashCode()方法来得一个int值,然后根据这个值决定对象放在HashSet中的存储位置。如果有 两个元素则利用equal()方法比较,即使其结果返回是true,只要hashCode值不一样也可以添加成功。换一句话说比较两个对象是不是相等需要比较equal相等,还要hashCode也要相等。因此重写的时候尽量保证equal()返回true的时候,hashCode()方法也换回true。
如果equal返回是false的时候,其hashCode的值是true的时候,则在同一个桶之中需要存放很多元素,这样会导致性能下 降。
LinkedHashSet类
LinkedHashSet是HashSet的子类,它使用链表维护元素元素的次序,因此在遍历的LinkedHashSet()的时候,会按照添加的顺序来 访问集合里面的元素。
TreeSet类
TreeSet是接口类SortedSet的实现类,因此可以确保该类是一个排序状态。
与HashSet不同的是,TreeSet是以红黑树的结构来决定存储位置的。
排序状态则分为两种:
自然排序,利用cmpareTo()方法来比较元素的大小,按照升序排序,元素要实现 Comparable接口,因为其提供comparaTo()。
定制排序,在创建的是时候与Comparator关联,因为Comparator是一个函数式接口,故可以利用Lambda表达式。
TreeSet类是利用comparaTo()来判断两个元素是否相等
EnumSet类
存入的元素都是枚举里面的元素,不允许存null,以位向量形式存储,像是非常紧凑和高效,因此对像内存占用小,运行效率也很 好。
总结:
HasSet性能要比TreeSet好,因为TreeSet需要维护一红黑树,因为在不需要对元素进行排序的时候,一般选择都是HasSet。
HashSet和LinkedHashSet相比,插入和删除的候,HashSet性能要好,因为维护链表会带来额外开销,但是在遍历的时候 LinkeHashSet却要好一些。
EnumSet是Set所有实现类中,性能最好的,另外HashSet TreeSet EnumSet都是线程不安全的。如果要线程安全则需要Collection类中的synchronizedSortedSet方法来包装该set集合。
List集合:
list是Collection是子接口,List集合代表一个可重复的,排序的元素集合,其默认的索引顺序是其添加顺序,从0开始。
ArratList和Vector实现类
ArrayList和Vector作为list最经典的实现类,完全支持list接口的全部功能,且都是基于数组实现的。
ArrayList是线程不安全的,Vector是线程安全的,所以ArrayList是性能相对好些,但是即使在使用的时候一般也是利用collection将 ArrayList用来保证其线程安全。
LinkedList实现类
LinkedList实现了Deque,所以即可以当成队列也可以当成栈来使用。ArrayList内部是以数组的形式存储的,因此在随机访问的时候 性能较好,而LinkedList在插入和删除的时候性能比较出色。
Map集合:
用来存储键值对,其中key和value可以是任何的引用类型数据,但是key值不能相同。
HashMap和Hashtable实现类:
两者之间的关系和HashSet和Vector相似。
两者之间的主要区别:
HashMap线程不安全,Hashtable线程安全,因此HashMap性能会更好一点。
Hashtable不可以把null作为key和value,但是HashMap可以把Null作为key和value。
两者共同点:
与HashSet类似, Hashtable和HashMap判断key是否相同的标准是,equal()方法是true,并且HashCode()方法也是true。
判断value是否相同,主要是equal()方法是否相同。
LinkedHashMap实现类
使用双向链表来维护的key-value,并只维护key的次序。因为需要维护插入元素的顺序,性能比hashMap低,但是在迭代访问的时候 性能比较好,且迭代的时候与添加元素的顺序一致。
SortedMap接口和TreeMap实现类
TreeMap是SortedMap的实现类,其本身久是一颗红黑树结构,通过排序来确定来确定存储节点。
排序的方式:
自然排序:key必须实现了Comparable,且必须是同一个类型的数据。
定制排序:传入一个Comparator对象,该对象负责对key进行排序。
判断相等,comparaTo()返回0表示两个key相等。
WeakHashMap实现类
因为HashMap对对象使用的是强引用,在垃圾回收的时候,不会被回收。而WeakHashMap保留的是对实际对象的弱引用,因此在垃圾回收的时候key所引用的对象可能被回收。当垃圾回收的时候,回收了key所引用的对象之后,WeakHashMap会自动删除key对应的Key-value键值对。
对象应用的级别:
强引用:垃圾回收永远回收不了。
软引用:要发生内存溢出之前,把这些对象列入垃圾回收的范围之中,进行第二次回收。
弱引用:只能生存到下一次垃圾收集发生之前,当垃圾回收工作的时候,无论内存足够都回回收。
虚引用:用来收到一个系统通知,当对象被垃圾回收的时候。
IdentityHashMap实现类
和HashMap类似,但是在处理两个key是否相等的时候要严格相等,key1=key2。
注意字符串直接量,由于字符串直接量是使用常量池来管理的,所以==比较会返回true。
总结:
TreeMap通常比HashMap,Hashtable要慢,尤其在插入删除的时候。但是有一个好处是TreeMap中的key-value是一个总是有序状态,无序进行排序操作。