堆栈是“后进先出”(LIFO)集合。它有时被称为叠加栈(pushdown stack),因为最后“压入”(push)栈的元素,第一个被“弹出”(pop)栈。经常用来类比栈的事物是带有弹簧支架的自助餐厅托盘。最后装入的托盘总是最先拿出来使用的。
Java 1.0 中附带了一个 Stack 类,结果设计得很糟糕(为了向后兼容,永远坚持 Java 中的旧设计错误)。
Java 6 添加了 ArrayDeque ,其中包含直接实现堆栈功能的方法.
即使它是作为一个堆栈在使用,我们仍然必须将其声明为 Deque 。有时一个名为 Stack 的类更能把事情讲清楚:
基本上,这个类是在声明“我们在定义一个可以持有 T 类型对象的 Stack 。” Stack 是使用 ArrayDeque 实现的,而 ArrayDeque 也被告知它将持有 T 类型对象。
- push()接受类型为 T 的对象
-
peek()和pop()返回类型为 T 的对象
- peek()方法将返回栈顶元素,但并不将其从栈顶删除
- pop()删除并返回顶部元素
如果只需要栈的行为,使用继承是不合适的,因为这将产生一个具有 ArrayDeque 的其它所有方法的类(Java 1.0 设计者在创建 java.util.Stack 时,就犯了这个错误)。 使用组合,可以选择要公开的方法以及如何命名它们。
尽管已经有了 java.util.Stack ,但是 ArrayDeque 可以产生更好的 Stack ,因此更可取。 可以使用显式导入来控制对“首选” Stack 实现的选择:
import com.javaedge.Stack;
现在,任何对 Stack 的引用都将选择 onjava 版本,而在选择 java.util.Stack 时,必须使用全限定名称.
SetSet 不保存重复的元素.Set 最常见的用途是测试归属性,可以很轻松地询问某个对象是否在一个 Set 中。因此,查找通常是 Set 最重要的操作,因此通常会选择 HashSet 实现,该实现针对快速查找进行了优化。
Set 与 Collection 拥有相同接口,因此无任何额外功能,不像前面两种不同类型的 List 。实际上, Set 就是一个 Collection ,只是行为不同。
这是继承和多态思想的典型应用:表现不同的行为.
Set 根据对象的“值”确定归属性.
早期 Java 版本中的 HashSet 产生的输出没有可辨别的顺序。这是因为出于对速度的追求, HashSet 使用了散列。由 HashSet 维护的顺序与 TreeSet 或 LinkedHashSet 不同,因为它们的实现具有不同的元素存储方式。 TreeSet 将元素存储在红-黑树数据结构中,而 HashSet 使用散列函数。
LinkedHashSet也使用了散列,使用了链表来维护元素的插入顺序。看起来散列算法好像已经改变了,现在 Integer 按顺序排序。
要对结果进行排序,一种方法是使用 TreeSet 而不是 HashSet :
最常见的操作之一是使用contains()测试成员归属性,但也有一些其它操作
能够产生每个元素都唯一的列表是相当有用的功能。 排序是按字典顺序(lexicographically)完成的,因此大写和小写字母位于不同的组中。如果想按字母顺序(alphabetically)对其进行排序,可以向 TreeSet 构造器传入 String.CASE_INSENSITIVE_ORDER 比较器.
Map将对象映射到其他对象。
Map 与数组和其他的 Collection 一样,可以轻松地扩展到多个维度,只需要创建一个值为 Map 的 Map(这些 Map 的值可以是其他集合,甚至是其他 Map)。因此,能够很容易地将集合组合起来以快速生成强大的数据结构。 例如,假设你正在追踪有多个宠物的人,只需要一个 Map\


微信扫码登录