当前位置: 首页 > 面试题库 >

Java HashSet与HashMap

陶俊晤
2023-03-14
问题内容

我了解这HashSet是基于HashMap实现的,但是在您需要唯一的元素集时使用。那么,为什么在下一个代码中将相同的对象放入地图并进行设置时,两个集合的大小都等于1?地图大小不应该为2吗?因为如果两个集合的大小相等,那么使用这两个集合不会有任何区别。

    Set testSet = new HashSet<SimpleObject>();
    Map testMap = new HashMap<Integer, SimpleObject>();

    SimpleObject simpleObject1 = new SimpleObject("Igor", 1);
    SimpleObject simplObject2 = new SimpleObject("Igor", 1);
    testSet.add(simpleObject1);
    testSet.add(simplObject2);


    Integer key = new Integer(10);

    testMap.put(key, simpleObject1);
    testMap.put(key, simplObject2);

    System.out.println(testSet.size());
    System.out.println(testMap.size());

输出为1和1。

SimpleObject code

public class SimpleObject {

private String dataField1;
private int dataField2;

public SimpleObject(){}

public SimpleObject(String data1, int data2){
    this.dataField1 = data1;
    this.dataField2 = data2;
}

public String getDataField1() {
    return dataField1;
}

public int getDataField2() {
    return dataField2;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result
            + ((dataField1 == null) ? 0 : dataField1.hashCode());
    result = prime * result + dataField2;
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    SimpleObject other = (SimpleObject) obj;
    if (dataField1 == null) {
        if (other.dataField1 != null)
            return false;
    } else if (!dataField1.equals(other.dataField1))
        return false;
    if (dataField2 != other.dataField2)
        return false;
    return true;
 }
}

问题答案:

该地图拥有唯一键。当您put使用映射中存在的键进行调用时,该键下的对象将被新对象替换。因此大小为1。

两者之间的区别应该很明显:

  • Map您存储键值对
  • Set您只存储密钥

实际上,a
HashSet具有一个HashMap字段,并且每当add(obj)被调用时,该put方法就会在基础地图上被调用map.put(obj, DUMMY)-其中的伪对象是a private static final Object DUMMY = new Object()。因此,将使用对象作为键填充地图,并且该值无用。



 类似资料:
  • 问题内容: 我可以想到以下几个原因,为什么带有整数键的s 比s 要好得多: 的Android文档说:“通常比传统的要慢”。 如果您使用s而不是s 编写代码,那么您的代码将与Map的其他实现一起使用,并且将能够使用所有为Maps设计的Java API。 如果您使用而不是s 编写代码,则您的代码将在非Android项目中运行。 地图会覆盖,而不会覆盖。 但是,每当我尝试在Android项目中使用带有整

  • 问题内容: 我有一个Java类,将servlet属性设置为HashMap对象: 其中是HttpServletRequest对象,并返回HashMap对象。 有没有一种方法可以使用c:foreach或其他JSTL标签浏览HashMap集合? 我刚在想: 或者,如果无法完成,那么如何制作自定义标签来处理呢? 在我的JSP页面中诉诸Java代码是我的最后选择,我想知道JSTL是否可以实现。 谢谢,乔纳斯

  • 在C语言中,假设每个算法被赋予完全相同的一组进程,那么先到先得、最短作业优先和循环之间的周转时间是否相等?还是调度算法不同?

  • 问题内容: 我想知道Java HashMap与JSONObject的性能。 似乎JSONObject使用HashMap在内部存储数据。但是与HashMap相比,JSONObject可能会有额外的开销。 有没有人知道Java JSONObject与HashMap相比的性能? 谢谢! 问题答案: 就像您说的那样,它由支持。 因此,性能几乎相同。 添加一个空检查,如果找不到密钥,将引发异常。 只是打电话

  • 问题内容: 为了为 HTML5 Doctype 定义字符集,我应该使用哪种表示法? 短: 长: 问题答案: 在HTML5中,它们是等效的。使用较短的一个,更容易记住和键入。浏览器支持很好,因为它是为向后兼容而设计的。

  • 连接的多个输入都相当于Yes的时候才会输出Yes。 用法 Your browser does not support the video tag. 案例:小闹钟 功能:今天15:10:00,响起猫叫声小闹钟 工作原理 当所有的输入都是Yes的时候,与节点才输出Yes。