Java(7-2)

来源:互联网 发布:apl原油库存最新数据 编辑:程序博客网 时间:2024/06/06 08:38

Part1:集合框架中的接口。
这里写图片描述

在图中(看不见的可能是空间图片无法上传,加我2923370475),我们可以看见,集合有两个基本接口:Collection和Map。

由于Collection,我们可以用以下方法在集合插入元素:boolean add(E element)
不过,由于映射包含键/值对,所以要用put方法来插入:V put(K key,V value)
要从集合读取元素,可以用迭代器访问元素,但是如果从映射中读取值,就要使用get方法

V get(K key)

在集合中,我们可以看见,List是一个有序集合,元素会增加到容器中的特定位置。我们可以采用两种方式访问元素:1.迭代器2.使用一个整数索引。后一种称为因为可以按照任意顺序访问元素而称为随机访问。和他相反,迭代器必须顺序地访问元素。

List接口中定义了多个用于随机访问的方法:

void add(int index,E element);void remove(int index);E get(int index);E set(int index,E element);

ListIterator接口是Iterator的一个子接口。它定义了一个方法用于在迭代器位置前面增加一个元素。void add(E element)

建议数组使用整数索引来访问,而链表使用迭代器访问。

Set接口等同于Collection接口,不过其方法的行为有更严谨的定义。集(Set)的add方法不!允!许!增加重复的元素! 要适当的定义集的equals方法:只要两个集包含同样的元素就认为是相等的,而不要求这些元素具有同样的顺序。hashcode方法的定义要保证包含相同元素的两个集会得到相同的散列码。

SortedSet 和 SortMap接口都会提供用于排序的比较器对象,这两个接口定义了可以得到集合子集的方法。

最后在Java6中引入了NavigableSet和NavigableMap,其中包含一些用于搜索和遍历有序集和映射的方法。

Part2:下面介绍下Java库中的具体的集合。

  1. ArrayList 一种可以动态增长和缩减的索引序列
  2. LinkedList 一种可以在任何位置进行高效地插入和删除操作的有序序列
  3. ArrayDeque 一种用循环数组实现的双端队列
  4. HashSet 一种没有重复元素的无序集合
  5. TreeSet 一种有序集
  6. EnumSet 一种包含枚举类型值的集
  7. LinkedHashSet 一种可以记住元素插入次序的集
  8. PriorityQueue 一种允许高效删除最小元素的集合
  9. HashMap 一种存储建/值关联的数据结构
  10. TreeMap 一种键值有序排列的映射表
  11. EnumMap 一种键值属于枚举类型的映射表
  12. LinkedHashMap 一种可以记住键/值项添加次序的映射表
  13. WeakHashMap 一种其值无用处之火可以被垃圾回收的映射表
  14. IdentityHashMap 一种用==而不是equals比较键值的映射表

Part3:我们接下来将会具体介绍下LinkedList,HashSet,TreeSet,PriorityQueue等集!

LinkList:
在Java中,所有链表都是双向链表,链表有属于他的迭代器,ListIterator。LinkedList的add方法将对象添加到链表的尾部,当然,让的迭代器,ListIterator也包含add方法,另外这个ListIterator接口有两个方法,可以用来反响遍历列

E previous()boolean hasPrevious()

和next方法一样,previous方法返回越过的对象。还有迭代器的remove方法,需要说明的是add方法只依赖于迭代器的位置,而remove方法依赖与迭代器的状态。最后ser方法用于用一个新元素取代调用next或previous方法返回的上一个元素。Tip:可以根据需要给容器附加许多的迭代器,但是这些迭代器只能读取列表。另外,再单独附加一个既能读又能写的迭代器。

列表迭代器接口还有一个方法,可以告知当前位置的索引。nextIndex方法返回下一次调用next方法时返回元素的整数索引;previousIndex方法发牛下一次调用previous时返回元素的整数索引。最后说明一下,如果有一个整数索引n,list.listIterator(n)将返回一个迭代器,这个迭代器指向索引为n的元素前面的位置。

散列集,HashSet:

链表和数组可以按照人们的一员排列元素的次序。但是如果想查看某个指定的元素,却又忘了他的位置,就需要访问所有元素,直到找到为止。HashSet就是能够快速查找的数据结构,却低啊是无法控制元素出现的顺序。

这里开始说的是hashtable,也就是散列表,散裂集是基于散列表!
有一种众所周知的数据结构,可以快速地查找所需要的对象,这就是散列表(hashtable)。散列表为每个对象计算一个整数,称为散列码。散列码是由对象的实例域产生的一个整数,更准确地说,具有不同数据域的对象将产生不同的散列码。(如果自定义了类,就要自己实现这个类的hashcode方法,并且,自己的hashcode方法应该与equals方法兼容,就是说如果a.equals(b)为true,那a和b必须有相同的散列码!

再说的细致一些,在Java中散列表用链表数组实现。每个列表被称为桶。要想查找表中对象的位置,就要先计算他的散列码,然后与痛的总数求余,所得到的结果就是保存这个元素桶的索引。例如,如果某个对象的散列码是76268,并且有128个桶,因为76268除以128余108,所以对象应该保存在108号桶中。

散列表,也就是hashtable可以用于实现几个重要的数据结构。其中最简单的是set类型。
Java的集合类库提供了一个HashSet类,它实现了基于散列表的集。可以用add方法添加元素。contains方法已经被重新定义,用来快速地查看某个元素已经出现在集中。它只在某个桶中查找元素,而不必查看集合中所有元素。散列集迭代器将一次访问所有的桶,并且访问的顺序是随机的。

树集,TreeSet:
树集是一个有序集合。可以任何顺序将元素插入到集合中。对集合进行遍历时,每个值自动的按照排序后的顺序呈现。要使用树集,必须能够比较元素。这些元素必须实现Comparable接口,或者构造集时必须提供一个Compartor

队列和双端队列,优先级队列:

大家都知道,队列可以让人们有效地在尾部添加一个元素,在头部删除一个元素。有两个端头的队列,称为双端队列,可以让人们有效地在头部和尾部同时添加或者删除元素。在Java6中引入了Deque接口,并由ArrayDeque和LinkedList类来实现(这里只需要注意一下双端队列的API即可,书上就有)。

优先级队列,就是说其中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索。也就是说,无论什么时候调用remove方法,总会获得当前优先级队列中最小的元素。和Tree一样,一个优先级队列既可以保存实现了Compartorable接口的类对象,也可以保存在构造器中提供的Comprator对象

原创粉丝点击