为什么你可以拥有该类对象的HashSet

时间:2017-07-16 08:09:08

标签: java

我正在努力理解为什么这是可能的。我是一个java新手,并且不了解你如何拥有类型为Example的任何类型(列表或集合)的集合。我正在努力了解这个的递归性质以及使用它的原因。

class Example {
    private Set<Example> setExample;
    //....
}

3 个答案:

答案 0 :(得分:9)

对象可以包含对同一类的其他对象的引用。它甚至可以包含对自身的引用(尽管在某些情况下可能会导致问题)。

至于为何使用它 - 现实生活中的物体可以(通常是)与同类型的其他物体相关。一个人与其他人(他们的家庭成员)有关,一个网页可以参考与其相关的其他网页等...

数据结构中此类引用的常见用法是节点/链接,用于实现链接列表和树。除了对与当前节点/链路相关的一个或多个其他节点/链路的引用之外,每个节点/链路还保存一些数据。

class TreeNode<T> {
    T data;
    private List<TreeNode<T>> children;
}

答案 1 :(得分:3)

这是可能的,因为Example类型的变量只是对此类型对象的引用。 Java试图隐藏其他语言所谓的指针。

答案 2 :(得分:3)

这个问题是否可能取决于你的其余代码。例如

class Example {
    private Set<Example> setExample;

    public Example() {
        setExample = new HashSet<Example>();
}

将创建可容纳Example个对象的新空容器。它没有任何问题。然而

class Example {
    private Set<Example> setExample;

    public Example() {
        setExample = new HashSet<Example>();
        setExample.add(new Example());
}

将创建一些无限循环,您将得到OutOfMemoryError,因为Example的每次创建都会创建另一个Example实例,依此类推。但是,这不是递归。