集合总结
集合的简单结构(口头叙述一下):
Iteratable接口中含有一个iterator()方法,可以产生一个iterator对象
Collection接口继承了Iteratable接口,源码中使用的extends关键字;(单一数据)
而Collection接口下有以下接口继承了Collection接口:
实现了List接口的类:ArrayList; LinkList,Vector
实现了Set接口的类或接口:HashSet,SortedSet->TreeSet
与Collection接口类似,还有一个Map接口(键值对)
HashMap,HashTable,SortedMap->TreeMap
这里主要例举了比较重要的集合。
LIst:(有序,可重复,含下标,且元素允许为空)
ArrayList、LinkList和Vector的特点:
ArrayList: 底层使用数组实现,初始默认容量为10,会进行扩容,扩容大小为原来大小的1.5倍,检索快,但是插入删除慢,当插入删除末尾元素时无影响。
LinkList:底层使用双向链表实现,因此插入删除操作快,但是检索慢
Vector:底层使用数组实现,初始默认容量为10,会进行扩容,扩容大小为原来的2被,方法含有synchronized 关键字,线程安全,但是由于效率低,基本被放弃
Set:(无序,不可重复,HashSet元素允许为空,TreeSet元素不允许为空)
HashSet:底层使用的是HashMap,添加元素时,HashSet集合作为HashMap的键进行构造,初始默认容量为16,会进行扩容,负载因子为0.75,即超过这个指标便会进行扩容,扩容为原来的2倍
TreeSet:底层使用的是TreeMap,元素按照一定的规则进行排序,如果需要自定义规则时,需要实现Comparable接口或者传递Comparator对象。
Map:(键值对)
HashMap:底层使用的时哈希表,键和值允许为空,并且,键只允许一个为空。初始容量为16,会进行扩容,负载因子为0.75。并且,当哈希表单向链表中元素超过8个,单向链表数据结构会变成红黑树数据结构,当红黑树上的节点数小于6时,会重新变为单向链表。
HashTable:底层使用的时哈希表,线程安全,键和值不允许为空。初始容量为11,扩容后大小为原容量的2倍+1。
Properties:键和值只能为字符串。
TreeMap:底层使用的是自平衡二叉树。
哈希表,数据结构上是由一组单向链表组成的数组。当HashMap执行put()方法时,首先将key,value封装到Node对象中,然后调用key的hashCode()方法得出hash值,而后通过哈希函数将这个hash值转换为数组下标,如果数组下标对应的位置为空,就将此对象加进去。如果不为空,就会对key和链表上的每个key进行equals()比较,当所有返回的都是false,就添加到末尾,如果返回了true,就更新value。
执行get()方法时,调用key的hashCode()方法,然后通过hash函数计算出数组下标定位,如果这个位置上无元素,放回null,如果有单向链表,key进行equals运算,若都返回false,get方法返回null,若返回ture,返回对应的value。