如何在使用 toString 方法将 HashMap 转换为 String 时覆盖 = 符号?

How to override = symbol while converting HashMap to String using toString method?

下面是部分代码,其中地图初始化为:
Map<Integer,Integer> map = new HashMap<>();
我要修改输出的行是

System.out.println("Price and items "+map.toString());
当前输出在哪里
{100=10,200=5}

我要展示
{100:10,200:5}

由于地图是整数整数,您可以使用 toString() 方法并替换不需要的字符...

进行字符串替换:)

map.toString().replace("=",":");

您不能直接覆盖 toString() 方法中的符号。

虽然您可以将 String.replace 用于键和值不能包含 = 的映射(如 Integers),但您必须在一般。

如果您查看 AbstractMap.toString():

的来源,您会发现这并不难做到
public String toString() {
    Iterator<Entry<K,V>> i = entrySet().iterator();
    if (! i.hasNext())
        return "{}";

    StringBuilder sb = new StringBuilder();
    sb.append('{');
    for (;;) {
        Entry<K,V> e = i.next();
        K key = e.getKey();
        V value = e.getValue();
        sb.append(key   == this ? "(this Map)" : key);
        sb.append('=');
        sb.append(value == this ? "(this Map)" : value);
        if (! i.hasNext())
            return sb.append('}').toString();
        sb.append(", ");
    }
}

您只需将 = 更改为 :

不要依赖方法 toString(),因为 它是一个实现细节,可能会从 Java 的一个版本更改为另一个版本,您应该而是实现自己的方法。

假设您使用Java 8,它可能是:

public static <K, V> String mapToString(Map<K, V> map) {
    return map.entrySet()
        .stream()
        .map(entry -> entry.getKey() + ":" + entry.getValue())
        .collect(Collectors.joining(", ", "{", "}"));
}

如果您想要AbstractMap#toString()完全相同的实现来检查键或值是否为当前映射,则代码为:

public static <K, V> String mapToString(Map<K, V> map) {
    return map.entrySet()
        .stream()
        .map(
            entry -> (entry.getKey() == map ? "(this Map)" : entry.getKey())
                    + ":"
                    + (entry.getValue() == map ? "(this Map)" : entry.getValue()))
        .collect(Collectors.joining(", ", "{", "}"));
}