我的Java之旅 第五课 JAVA 语言语法 集合
JAVA集合只能存放引用类型的的数据,不能存放基本数据类型,int 可以用 Integer代替。
一、集合接口
1、 Iterable<E> 实现这个接口允许对象成为 "foreach" 语句的目标。
2、 Collection<E> 接口扩展了Iterable 接口。该接口是Collection 层次结构中的根接口。
集合类的基本接口 是Collection 接口,该接口有两个基本方法 : add (向集合添加元素) 和 iterator ( 返回一个实现了Iterator 接口的 对象)。
还有很多有用的方法,如size、isEmpty、contains 等等。而为了能够让实现者更容易地实现这个接口,java类库提供了一个类 AbstractCollection。它将基础方法size和iterator抽象化了,但是在此提供了例行方法。
3、 Iterator<E> 接口。对 collection 进行迭代的迭代器。替代了 Enumeration接口。包含三个方法:
next 、
hasNext 调用next方法前应该先执行hasNext方法判断是否还有下一个元素
remove 删除上次调用next方法时返回的元素。
二、具体的集合
以上以Map结尾的实现了Map接口,其它全部实现了Collection接口。
★ArrayList 数组列表 实现了List接口
另一个动态数组类 Vector类 ,此类的所有方法是同步的,而ArrayList中的方法不是同步的。当不需要同步时使用ArrayList,以节省资源。
数组和数组列表从中间位置删除一个元素要付出很大代价,原因是数组中处于被删除元素之后的所有元素都要向数组的前端移动。插入一个元素也是如此。下边的链表解决了这个问题。
★ LinkedList 链表 实现了List接口
java中所有链表实际上都是双向链接的,即每个结点还存放着指向前驱结点的引用。这样从链表删除一个元素时只需要对被删除元素附近的结点更新一下即可。
链表与泛型一个重要区别。链表是有序集合,每个对象的位置十分重要。
链表不支持快速地随机访问。如果要查看链表中第n个元素,必须从头开始,越过n-1个元素。因此,当需要采用整数索引访问元素时,通常不选用链表。尽管如此,LinkedList类还是提供了一个get方法,用来获取第n个元素,效率当然不高。
★散列集 (HashSet)
散列表可以快速地查找所需要的对象,散列表为每个对象计算一个整数,称为散列码。
在java中散列表用链表数组实现。
散列表可以用于实现几个重要的数据结构。其中最简单的是set类型。set类型是没有重复元素的元素集合。(保证无重复:当添加元素时如果此 set 没有包含满足 (e==null ? e2==null : e.equals(e2)) 的元素 e2,则向该 set 中添加指定的元素 e。如果此 set 已经包含该元素,则该调用不改变此 set 并返回 false。结合构造方法上的限制,这就可以确保 set 永远不包含重复的元素。)
java集合类库提供了一个HashSet类,实现set接口,实现了基于散列表的集。当不关心集合中元素的顺序时才应该使用HashSet。
★ 树集 (TreeSet)
TreeSet类与散列集十分类似,不过,树集是一个有序集合。排序是用树结构完成的。
每次添加元素时,都被放置在正确的位置上。因此,添加到树中比添加到散列表中慢。
关于对象的比较 传递Comparator对象给TreeSet 构造器。
与散列集比较,当不需要排序时用散列集,需要时用树集,以节省开销。
★ 队列与双端队列
队列可以让人们有效地在尾部添加一个元素,在头部删除一个元素。
双端队列即两个端头,可以有效地在头部和尾部同时添加或删除元素。不支持在中间添加元素。
Deque接口,由ArrayDeque和LinkedList类实现,这两个类都提供了双端队列。而且必要时可以增加队列的长度。
优先级队列(PriotiryQueue)
优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索。也就是说无论何时调用remove方法,总会获得优先级队列中最小的元素。 优先级队列使用数据结构为堆(heap)。堆是一个可以自我调整的二叉树,对树执行添加和删除操作,可以让最小的元素移动到根,而不必花费时间对元素进行排序。d而迭代并不是按照元素的排列顺序访问的。
使用优先级队列的典型示例是任务调度。
★ 映射表
映射表存放键/值对。
映射表数据结构实现通过某些键查找与之对应的元素的需求。
Java类库中两个通用的实现:HashMap和TreeMap。这两个类实现了Map接口。与集一样,如果不需要排序,就选择散列HashMap。
集合框架没有将映射表本身视为一个集合,而是提供了映射表的视图,这是一组实现了Collection接口对象,或者它的子接口的视图。
这三个视图为:键集(keySet)、值集合(values)和键/值对集(entrySet)。
★ 专用集与映射表集
1 弱散列映射集。 负责从长期存活的映射表中删除无用的值。
WeakHashMap 类
2 链接散列集和链接映射表。用来记住插入元素项的顺序。
LinkedHashSet类和 LinkedHashMap类
链接散列映射表用访问顺序而不是插入顺序对映射表条目进行迭代。访问顺序对实现高速缓存的“最近最少使用"原则十分重要。
3 枚举集和映射表
EnumSet是一个枚举类型元素集的高效实现。 可以使用Set接口的常用方法修改EnumSet。
EnumMap是一个键类型为枚举类型的映射表。它可以直接且高效地用一个值数组实现。
4 标识散列映射表
IdentityHashMap。不同的键对象,即使内容相同,也被视为不同的对象。这个特性可以用来跟踪每个对象的遍历状况。
★ 集合框架
集合有两个基本的接口:Collection 和 Map。
List接口是一个有序集合。
RandomAccess接口。没有任何方法,但可以用来检测一个特定的集合是否支持高效的随机访问。
ListIterator接口定义了一个方法,用于将一个元素添加到迭代器所处位置的前面。
Set接口与Collection接口是一样的,只是其方法的行为有着更严谨的定义。(Set拒绝添加重复元素)。
SortedSet和SortedMap接口暴露了用于排序的比较器对象,并且定义的方法可以获得集合的子集视图。
最后,Java SE 6 引入了接口NavigableSet和NavigableMap,其中包含了几个用于在有序集和映射表中查找和遍历的方法。TreeSet和TreeMap类实现了这几个接口。
★ 遗留的集合
1 Hashtable类
与HashMap作用一样。
2 枚举
Enumeration接口对元素序列进行遍历。有两个方法hasMoreElements和nextElement 类似于Iterator接口的hasNext方法和next方法。
3 属性映射表
一个类型非常特殊的映射表结构。3个特性:键与值都是字符串;表可以保存到一个文件中,也可以从文件中加载;使用一个默认的辅助表。
4 栈
Stack类。Stack类扩展为Vector类
5 位集
BitSet类