当前位置: 首页 > 知识库问答 >
问题:

为什么java没有呢。util。HashSet有get(Object o)方法吗?

田念
2023-03-14

我已经看到了关于基于索引值从Set中获取对象的其他问题,我明白为什么这是不可能的。但是我还没有找到一个很好的解释来解释为什么不允许获取对象,所以我想我会问。

HashSet由HashMap支持,因此从中获取对象应该非常简单。现在看来,我必须迭代HashSet中的每个项,并测试似乎不必要的相等性。

我可以只使用Map,但我不需要键:值对,我只需要一个Set

例如,假设我有Foo。java:

package example;

import java.io.Serializable;

public class Foo implements Serializable {

    String _id;
    String _description;

    public Foo(String id){
        this._id = id
    }

    public void setDescription(String description){
        this._description = description;
    }

    public String getDescription(){
        return this._description;
    }

    public boolean equals(Object obj) {
        //equals code, checks if id's are equal
    }

    public int hashCode() {
        //hash code calculation
    }

}

Example.java

package example;

import java.util.HashSet;

public class Example {

    public static void main(String[] args){
        HashSet<Foo> set = new HashSet<Foo>();

        Foo foo1 = new Foo("1");
        foo1.setDescription("Number 1");

        set.add(foo1);
        set.add(new Foo("2"));

        //I want to get the object stored in the Set, so I construct a object that is 'equal' to the one I want.
        Foo theFoo = set.get(new Foo("1")); //Is there a reason this is not allowed?
        System.out.println(theFoo.getDescription); //Should print Number 1
    }

}

是不是因为equals方法旨在测试“绝对”相等,而不是“逻辑”相等(在这种情况下,包含(对象o)就足够了)?

共有3个答案

诸葛皓
2023-03-14

你的最后一句话就是答案。

get(Object o)将通过哈希集运行,寻找另一个等于o的对象(使用等于(o)的方法)。因此,它确实与包含(o)相同,只是没有返回相同的结果。

贺功
2023-03-14

集合是对象的集合,它将A.equals(b)=true作为重复对象,因此尝试获取您已经拥有的相同对象是没有意义的。

如果您尝试从集合中get(Object)Map可能更合适。

你应该写的是

Map<String, String> map = new LinkedHashMap<>();

map.put("1", "Number 1");
map.put("2", null);
String description = map.get("1");

如果一个对象不在集合中(基于equals),请添加它,如果它在集合中(基于equals),请给我该对象的集合实例

在不太可能的情况下,您可以使用地图。

Map<Bar, Bar> map = // LinkedHashMap or ConcurrentHashMap

Bar bar1 = new Bar(1);
map.put(bar1, bar1);

Bar bar1a = map.get(new Bar(1));
颛孙信厚
2023-03-14

Java地图/收藏备忘单

它将只包含键/值对还是值?

1) 如果它包含对,则选择是一个映射。订单重要吗?

. 1-1)如果是,遵循插入顺序或按键排序?

. . 1-1-1)如果订购,LinkedHashMap

. . 1-1-2)如果已排序,则树形映射

. 1-2)如果顺序不重要,则HashMap

2)如果它只存储值,则选择是一个集合。它会包含重复项吗?

. 2-1)如果是,ArrayList

. 2-2)如果不包含重复项,主要任务是否搜索元素(包含/删除)?

...2-2-1)如果没有,ArrayList

. . 2-2-2)如果是,订单重要吗?

. . . 2-2-2-1)如果顺序不重要,则哈希集

...2-2-2)如果是,按照插入顺序或按值排序?

. . . . 2-2-2-2-1)如果订购,LinkedHashSet

. . . . 2-2-2-2-2)如果已排序,则树集

 类似资料:
  • 问题内容: 我已经看到了有关根据索引值从中获取对象的其他问题,并且我理解为什么这是不可能的。但是我无法找到一个很好的解释,说明为什么不允许按对象获取,所以我想问一下。 有a作为后盾,因此从中获取对象应该非常简单。现在看来,我将不得不遍历中的每个项目并测试是否相等,这似乎是不必要的。 我可以只使用a,但不需要key:value对,我只需要一个。 例如说我有: 和: 是否因为equals方法用于测试“

  • 书上说这段代码在目录被glob匹配的情况下(如node_modules/fs.stat)应该报错,但是我在本地执行没有。 下面代码实现了一个copy的功能,将source directory下的所有文件复制到destination directory。 对这段代码的几点说明: 此处的glob版本为7.2.3,最新版本的glob是基于promise的,不再支持回调。 fs-extra提供了更多的功能

  • 问题内容: 我确信这是有充分理由的,但是有人可以解释一下为什么缺少接口或任何类似方法吗? 集合似乎很适合放入东西,但我找不到从其中检索单个项目的优雅方法。 如果我知道我想要第一个项目,则可以使用,但否则似乎必须转换为数组才能在特定索引处检索项目? 从集合中检索数据的适当方法是什么?(除了使用迭代器之外) 我敢肯定,将其排除在API中这一事实意味着有充分的理由不这样做-有人可以启发我吗? 编辑: 这

  • 问题内容: Iterables提供了两种方法 但只有一个 是否存在任何破坏对称性的设计/实现原因? 问题答案: 我认为要点是,没有理由可以使用来完成此操作。Guava尽力使API保持较小,因此没有添加可以/应该以其他方式轻松完成的事情。 另一方面,还没有一种机制可以测试iterable是否为空,如果是,则返回默认值而不是第一个值。因此,。 同样,没有简单的方法来获取最后一个元素,因此和

  • 问题内容: 虽然有一种方法没有。这是为什么?文件在完成后会自动关闭吗? 谢谢! 问题答案: 该类的javadoc将类描述为: 文件和目录路径名的抽象表示。 只是路径名的一种表示形式,有一些关于文件系统(如)和目录处理的方法,但是实际的流输入和输出在其他地方完成。流可以打开和关闭,文件不能。 (我个人的看法是,不幸的是Sun后来继续创建,给命名不一致带来了很大的困惑。)

  • 当使用Java8流时,获取一个列表、从中创建一个流、处理业务并将其转换回来是很常见的。类似于: 有什么想法吗?