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

2022-08-31 15:42:27

我见过关于根据索引值从 中获取对象的其他问题,我理解为什么这是不可能的。但是我无法找到一个很好的解释来解释为什么不允许使用get by对象,所以我想我会问。Set

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

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

例如,假设我有: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
    }

}

是因为等式方法是为了测试“绝对”相等性而不是“逻辑”相等性(在这种情况下就足够了)吗?contains(Object o)


答案 1

Java 地图/集合备忘单

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

1)如果它包含,则选择是地图。顺序重要吗?

.1-1) 如果,请遵循广告订单或按键排序?

..1-1-1) 如果已订购,则链接哈希映射

..1-1-2) 如果排序,树状图

.1-2) 如果顺序重要,则哈希映射

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

.2-1) 如果则数组列表

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

..2-2-1) 如果不是,则数组列表

..2-2-2) 如果是,顺序重要吗?

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

. . .2-2-2-2) 如果,请遵循广告订单或按值排序?

. . . .2-2-2-2-1) 如果已订购则链接哈希集

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


答案 2

A 是一个将对象视为重复对象的对象,因此尝试获取已有的相同对象是没有意义的。SetCollectiona.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),则添加它,如果它在集合中(基于eall),则给我该对象的集合实例

万一您需要它,您可以使用.Map

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

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

Bar bar1a = map.get(new Bar(1));

推荐