ArrayList封装了一个动态再分配的对象数组,但Vector类也能实现该功能
但Vector类的所有方法都是同步的,是线程安全的,而ArrayList方法不是同步的,即非线程安全
若是单线程访问则推荐使用ArrayList类,因为相比之下,ArrayList更快
有一种众所周知的数据结构,可以快速查找所需的对象,这既是散列表(hash table)
散列表为每个对象计算一个整数,称为散列码(hash code)
具有不同数据域的对象将产生不用的散列码
在Java中,散列表使用链表数组实现
Java集合类库中,提供了一个HashSet类,它实现了基于散列表的值,用add方法添加元素
contains方法快速地查看是否某个元素已经出现在集合中
散列集迭代器将依次访问所有的桶
由于散列将元素分散在表的各个位置,所以访问它们的顺序几乎是随机的
当不关心集合中的元素顺序时才应该使用HashSet
TreeSet与散列集十分相似,不过,它比散列集有所改进
树集是一个有序集合
可以以任意顺序插入到集合中。在对集合进行遍历时,每个值将自动按照排序后的顺序呈现
每个值将按照顺序打印出来:Amy Bob Carl。
TreeSet的排序是用树结构完成的,当前实现用的是红黑树
红黑树本身就是一个二叉排序树,即每次放入一个元素时,该元素都会被放置在正确的位置上
要使用树集,树集中的元素必须要能够相互比较
队列:可以在尾部添加元素,在头部删除元素
有两个端头的队列,即双端队列,可以在头部和尾部用时进行插入或者删除元素
优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索
也就是说,无论何时调用remove方法,总会获得当前优先级队列中最小的元素
优先级队列使用了堆(最小堆)这一数据结构来实现
三.映射 1.基本映射操作映射用来存放键值对。如果提供了键,就能找到值
Java中提供了两个映射的通用实现:HashMap和TreeMap。这两者都实现了Map接口
HashMap对键进行散列
TreeMap是用键的整体顺序对元素进行排序,并将其组织成搜索树
集合框架不认为映射本身是一个集合
不过,可以得到映射的视图——这是实现了Collection接口或者某个子接口的对象
对应的映射视图有:
上述的三个方法会分别返回键集、值集合以及键/值对集
于是,可以得到我们Map的对应的遍历方法
HashTable类
HashTable类与HashMap类的作用一样
实际上它们拥有相同的接口
与Vector类一样,HashTable也是同步的
如果对同步性或者遗留代码的兼容性没有任何要求,就应该使用HashMap
如果需要并发访问,则要使用ConcurrentHashMap
枚举
遗留集合使用Enumeration接口对元素顺序进行遍历。
该接口有两个方法:hasMoreElements和nextElement。
属性映射
属性映射(property map)是一个类型非常特殊的映射结构。
键与值都是字符串
表可以保存得到一个文件中,也可以从文件中加载
使用一个默认的辅助表
实现属性映射的Java平台类称为Properties
属性映射通常用于程序的特殊配置选项
栈
从1.0版本开始,标准类库中就包含了Stack类,有push和pop方法
还有peek方法,返回栈顶元素却不弹出
位集
Java的BitSet类用于存放一个位序列。
如果需要高效地存储位序列(例如,标志)就可以使用位集。