java - (Java) 使用 map 时,键和值具有相同的类型是否有意义?

标签 java dictionary hashmap

举个简单的例子,考虑一个Place类:

public class Place {

    //fields
    private String name;

    private String state;

    private int population;

    private int squareMileage;

    private int elevation;

    //constructors
    public Place() {    
    }

    public Place(String name, String state) {
        this.name = name;
        this.state = state;
    }

    public Place(String name, String state, int population, int squareMileage, 
                    int elevation) {
        this.name = name;
        this.state = state;
        this.population = population;
        this.squareMileage = squareMileage;
        this.elevation = elevation;
    }

    //getters and setters
    public String getName() {
        return this.name;
    }

    public String getState() {
        return this.state;
    }
    //... (other getters and setters omitted)

    //do stuff
}

还有一个 Places 类(一个 Place 对象的 HashMap):

import java.util.*;

public class Places {
    private Map searchablePlaces;

    public Places() {
        searchablePlaces = new HashMap();
    }

    public void add(Place value) {
        Place key = new Place(value.getName(), value.getState());
        searchablePlaces.put(key, value);
    }

    public Place find(Place key) {
        return searchablePlaces.get(key);
    }

    //override hashCode, equals

    //do stuff
}

本质上,我的问题是:

  1. HashMap 中搜索 key 与直接搜索 value 相比,比方说,a排序 ArrayList?
  2. 如果 key 的类型 String 等于 name + state(或类型 String[2])?

最佳答案

恕我直言,这令人困惑。我会定义一个 PlaceKey 类,只包含一个名称和一个状态,并定义 hashCode 和 equals。一个地方将拥有一个 PlaceKey 和其他属性。我会使用 Map<PlaceKey, Place> .

请注意,在您的示例中,需要 equals 和 hashCode 的是 Place 类,而不是 Places 类。

现在,回答您的 2 个问题:

  1. HashMap 的复杂度为 O(1),而列表的复杂度为 O(n)。因此, map 通常会更快(除非 n 值非常小)
  2. 连接几乎总是一个坏主意。您可以让 name1 = aa、state1 = a、name2 = a 和 state2 = aa,这会导致冲突。数组不会在内容方面覆盖 equals 和 hashCode,因此不是合适的映射键类。

关于java - (Java) 使用 map 时,键和值具有相同的类型是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5412787/

相关文章:

用于反序列化具有可变小数秒数的日期的 Java 日期模式?

java - Android 中的 "Cannot make a static reference to a non-static method"

java - 读取 XLSX 工作簿时 Apache POI 抛出 IOException

Python:字典初始化的顺序

java - 从 JSP 页面中的 HashMap 获取 URL 值(使用 Struts2)

java - 使用 HashMap 的数字的最大频率。替代方法

java - android - 从 AsyncTask doInBackground() 线程更新 ListView

Python 3.6 - 将包含类型 'bytes' 的字典保存到文件

arrays - 为什么在 swift 中无法在数组中添加 json 键值

javascript - 在 JavaScript 中使用对象作为字典的时间复杂度