在面向对象思想里,数据结构被认为是一种容器(container)或者容器对象(container object)
是一个能够存储其他对象的对象,这里的其他对象被称为数据或者元素。
java集合框架
线性表、向量、栈、队列、优先队列、规则集和映射都是java里的数据结构,通常被称为java集合框架(java collections framework)
- 支持以下两种类型的容器
- 一种是为了存储一个元素集合,称为集合(collection)
- 一种是为了存储键/值对,称为映射(map)
集合
set:用于存储一组不重复的元素
List:用于存储一个有序元素,可重复的集合
Stack:用于存储采用先进后出方式处理的对象
Queue:用于存储采用先进先出方式处理的对象
PriorityQueue:用于存储按照优先级顺序处理的对象
List
- ArrayList:用数组存储元素,动态创建数组,当需要通过下标随机访问元素,而不会在线性表起始位置插入或者删除元素,是最高效的
- LinkedList:用链表存储元素,在线性表起始位置插入或者删除元素,是最高效的
Vector和Stack
- Vector:除了包含用于访问和修改向量的同步方法之外,Vector类和ArrayList类是一样的,如果不需要同步,最好使用ArrayList,因为ArrayList比使用Vector效率更高。
同步方法用于防止两个或多个线程同时访问某个向量时引起数据损坏 - Stack:栈类Stack是作为Vector类扩展来实现的
Queue
- LinkedList:继承了Deque(双端队列,double-ended queue)接口,而Deque接口又继承了Queue接口,很适合用于进行队列操作,因为它可以高效地在列表的两端插入和移除元素
- PriorityQueue:优先队列,默认情况下,使用Comparable以元素的自然顺序进行排序,拥有最小数值的元素被赋予最高优先级,最先从队列中删除,具有相同优先级的元素,会任意选择一个
规则集和映射
规则集(Set)
规则集是一个用于存储和处理无重复元素的高效数据结构,在一个规则集中,不存在元素e1和e2,使得e1.equals(e2)的返回值为true。测试一个元素是否存在集合中,规则集比线性表更加高效
- HashSet:散列类,是无序的,默认情况下,初始容量为16,负载系数是0.75
- LinkedHashSet:链式散列集,用一个链表实现来扩展Hashset类,支持规则集内的元素顺序,保持了元素插入时的顺序。如果不需要维护顺序,应该使用HashSet,比LinkedHashSet更加高效
- TreeSet:树形集,可以确保规则集中的元素是有序的。
负载系数(load factor)测量该规则集允许填充多满,当元素超过了容量和负载系数的乘积,容量就会自动翻倍。
比较高的负载系数会降低空间开销,但是会增加查找时间,
映射(Map)
映射提供了使用键值快速查询以获取值的功能,提供了通过键快速获取、删除、更新键/值对的功能,映射中不能有重复的键,每个键都对应一个值。一个键和它的对应值构成一个条目并保存在映射中。
- HashMap:对于定位一个值、插入一个条目以及删除一个条目来说是高效的
- LinkedHashMap:扩展HashMap,支持映射中条目的排序
- TreeMap:遍历排好顺序的键时是很高效的