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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (78)

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

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

我可以使用HashMap,但我不需要key:value对,我只需要一个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方法是为了测试“absolute”平等而不是“logical”平等(在这种情况下包含(Object o)就足够了)?

提问于
用户回答回答于

一个集合是对象的集合,它被视为a.equals(b) == true重复对象,因此尝试获取已有的同一对象是没有意义的。

如果你想从一个集合中获取(Object),一个Map可能更合适。

你应该写的是

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

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

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

万一你需要这个,你可以使用一个Map。

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

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

Bar bar1a = map.get(new Bar(1));
用户回答回答于

Java地图/收集备忘单

它是否只包含键/值对或值?

1)如果它包含对,则选择是一张地图。订单重要吗? 。1-1)如果是,请按照插入顺序或按键排序?

。。1-1-1)如果命令,LinkedHashMap

。。1-1-2)如果排序,TreeMap

。1-2)如果顺序是不重要的是,HashMap的

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

。2-1)如果是,ArrayList

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

。。2-2-1)否,ArrayList

。。2-2-2)如果是,订单是否重要?

。。。2-2-2-1)如果顺序是不重要,HashSet的

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

。。。。2-2-2-2-1)如果命令,LinkedHashSet

。。。。2-2-2-2-2)如果排序,TreeSet

扫码关注云+社区