1.13 为什么java.util.HashSet没有get(Object o)方法? | Java Debug 笔记

389 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

Debug 笔记 <为什么java.util.HashSet没有get(Object o)方法?>

提问

我已经看到了有关Set根据索引值从中获取对象的其他问题,并且我理解为什么这是不可能的。但是我无法找到一个很好的解释,说明为什么不允许按对象获取,我想问一下。

HashSetHashMap作为后盾,因此从中获取对象应该非常简单。现在,看来我必须遍历中的每个项目HashSet并测试是否相等,这似乎是不必要的。

我可以只使用Map但不需要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方法用于测试“绝对”相等而不是“逻辑”相等

(在这种情况下contains(Object o)就足够了)?

回答:

Set是被视为重复Collection对象的对象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");

如果对象不在集合中(基于等值),请将其添加(如果对象在集合中(基于等值)),请给我该对象的集合实例。 万一您需要使用此功能,可以使用Map

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

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

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

文章翻译自Stack Overflow :stackoverflow.com/questions/1…