您当前的位置: 首页 >  Java

Java8编程思想精粹(十)-容器持有对象(下)

发布时间:2020-05-25 22:58:02 ,浏览量:0

栈Stack

堆栈是“后进先出”(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 时,必须使用全限定名称.

Set

Set 不保存重复的元素.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\

关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    115984博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0549s