为什么Java Collections API没有树实现

为什么Java Collections API没有树实现,java,data-structures,collections,Java,Data Structures,Collections,出于好奇,我最近不得不为我的一个程序使用一棵树,我不得不自己构建一棵二叉树,但是为什么Collections API没有树(甚至是二叉树)的默认实现呢 我认为他们决定不将其包括在collections API中应该有很强的理由。

出于好奇,我最近不得不为我的一个程序使用一棵树,我不得不自己构建一棵二叉树,但是为什么Collections API没有树(甚至是二叉树)的默认实现呢


我认为他们决定不将其包括在collections API中应该有很强的理由。

理论上,树不是一种集合,它只是一种实现。我的意思是有一些抽象集合,比如Set(无序的条目集)、List(有序的条目集)、Map(两组条目之间有关系),还有它们的实现:array、List(例如ArrayList和LinkedList)、HashSet等,它们都有各自的优缺点。因此,树只是一种实现(例如,对于列表),它可以让您(大致上)比数组更快地进行搜索,但不能通过索引进行访问

顺便说一句,Java中有TreeMap(“基于红黑树的NavigableMap实现”)和TreeSet(“基于TreeMap的NavigableSet实现”)类

我认为他们决定不将其包括在CollectionsAPI中应该有一些强有力的理由

我认为原因是没有人能为树提供一个好的API,这两者兼而有之

  • 通用性足以覆盖广泛的用例,以及
  • 非常有用,足以补偿常规的性能开销
(你在哪里停?树?二叉树?N元树?DAG?图?)

值得注意的是,Apache Commons Collections和Google Collections(又名Guava)都没有树API。然而,在这个话题上有一个活跃的番石榴问题——显然,至少有些人同意你的观点

更新

从15.0版开始,Guava现在以
TreeTraverser
BinaryTreeTraverser
类的形式提供了树支持。但这可能不是你所期望的。事实上,这些类实际上并没有实现树数据结构。相反,您必须在泛型类型参数中执行此操作。除此之外,
Traverser
类甚至避免对节点类型的API进行假设。它们是抽象类,需要具体的遍历器子类型来实现查询树的操作;e、 g.获取节点的子节点



FWIW、
TreeMap
TreeSet
不是“树API”。它们是
Map
Set
api的基于树的实现。公共API完全隐藏了树的特性,使得这两个类完全不适合作为通用树使用。

TreeSet和TreeMap是由二叉树支持的两个集合。我不仅仅谈论二叉树,为什么我们不使用一个通用的树实现,一个树接口呢?有很多外部库,它提供了这种功能,相反,它可以包含在Collections API中,我的问题是为什么它没有作为java的Collections API中的通用数据结构包含。你需要问问James Gosling。这里没有人能以任何权威回答你的问题。任何人要说的话都只是猜测和意见。@BrianRoach而不是James gosling。我们需要问Joshua Bloch:)我知道TreeMap是存在的,但它是一种更具体的树数据结构形式,为什么我们不像List和Set那样有一个更通用的树实现呢。为什么集合API的创建者决定不给出树的一般形式。?也许他们可以给出一个接口树及其实现,如BinaryTree、AVLTree、RedBlackTree?我同意Artem Zh的回答。树只是一种特定形式的数据结构,用于保存实体的“集合”。集合不是由它们的数据结构定义的,而是它们在插入、删除和查找方面的性能承诺。实现的细节应该是无关紧要的,您可以根据您的使用需求来选择容器。例如,如果您需要一个容器,其中元素总是被排序的,并且查找应该是O(logn),那么您需要一个Set或SortedMap。实现如何满足性能保证并不重要,我不同意。集合由其合同定义
Set
s不保证顺序(因此没有索引访问),但保证不重复<代码>列表s担保顺序,但允许重复<代码>映射s包括元素之间的关系。事实上,您可以使用树来实现其中的一些(全部?)是不相关的。例如,您可以使用
列表
来实现
(例如
LinkedHashSet
)。实现树的方法也不止一种。