JAVA学习笔记-容器

来源:互联网 发布:冲淘宝客 编辑:程序博客网 时间:2024/04/29 17:20

Collection接口定义了存取对象的方法,其子接口分别定义了存储方式。
Collection接口:允许重复
Set接口:没有顺序并且不可以重复
List接口:有顺序可以重复,支持随机存取

List接口实现:

ArrayList:支持真正的随机存取,读快改慢,非线程安全,如果要实现同步,可以使用Vector。

LinkedList:支持随机访问,但是效率较低,要从头开始遍历,如果查找的位置大于size()/2,则从尾部开始查找,因为LinkedList是双向链表。LinkedList不仅实现了List接口,还实现了Queue,Deque接口。可以用作栈(stack),队列(Queue),双端队列(Deque)。

 

Set接口实现:

散列表

①散列表/哈希表是一种不在意元素顺序的数据结构,散列表为每个元素计算一个整数,称为散列码hashcode。

②散列表用链表数组实现,每个链表称为桶,要查找表中对象的位置,先计算它的散列码,然后和桶数(从0开始)相除,余数就是保存这个元素的桶的索引。

③散列表如果太满,就需要再散列,装填因子决定何时对散列表进行再散列,如果装填因子为0.75,而表中超过75%的位置已经填入元素,散列表就会用双倍的桶数自动地进行再散列。

④Set就是用散列表实现的集,不是集合。

 

HashSet:HashSet的存储顺序是不确定的。

TreeSetTreeSet会自动地对存入的对象进行排序,前提是存入的对象实现了comparable接口,该接口中有compareTo方法。TreeSet是用红黑树实现的,实现了SortedSet接口。将一个元素存入TreeSet要比存入HashSet中慢,因为它要查找新元素的正确位置,假如树中包含了n个元素,平均需要比较log2(n)次。

LinkedHashSet:跟HashSet的区别是元素之间根据存入的顺序建立了链表关系,所以遍历的顺序和存入的顺序相同。

 

Queue和Deque实现:

PriorityQueue:优先级队列,使用了堆作为数据结构,堆是一个可以自我调整的二叉树,对数执行add/remove操作可以让最小的元素移动到根,每次从优先级队列中取元素,取得的元素总是最小的,如果要实现自定义顺序,就要提供自己的comparator。

ArrayDeque:双端队列,可以从头或者尾插入元素或者取元素。LinkedList也实现了Deque。

 

Map实现

HashMap、TreeMap、LinkedHashMap:散列映射表对键进行散列,树映射表用键的整体顺序对元素进行排序,并将其组织成搜索树,链接散列映射表根据插入的顺序保存元素。

 

映射表有3个视图:

键集:Set<K> keySet( );

值集合(不是集):Collection<K> values( );

键/值对集:Set<Map.Entry<K,V>> entrySet( );

可以从视图中同步删除元素,但是不可以添加元素。 

 

集合和数组之间的转换:

集合转换为数组:String[] has=staff.toArray(new String[0]);

数组转换为集合:ArrayList al=new ArrayList(Arrays.asList(a));

 

在集合中查找元素可以用Collections.binarySearch(c,element)/(c,element,comparator).

如果传入的集合支持随机访问,即实现了RandomAccess接口,则采用二分查找,否则用线性查找。如果要查找的元素不存在,返回i,则该元素可插入的正确位置为-i-1.

 

其他集合:

Properties:属性映射表

Stack:栈

Vector:从Stack扩展来的

BitSet:位集

 

0 0