Java 为什么HashMap允许重复,而StringBuilder不能正确反转?

Java 为什么HashMap允许重复,而StringBuilder不能正确反转?,java,hashmap,stringbuilder,Java,Hashmap,Stringbuilder,HashMap不允许重复,而StringBuilder.reverse不能正常工作。为什么? String s = "abba"; static int myMethod(String s) { int counter = 0; Map<StringBuilder, StringBuilder> map = new HashMap<>(); for (int j = 0; j <= s.length

HashMap不允许重复,而StringBuilder.reverse不能正常工作。为什么?

String s = "abba";
static int myMethod(String s) {
        int counter = 0;
        Map<StringBuilder, StringBuilder> map = new HashMap<>();
        for (int j = 0; j <= s.length(); j++) {
            for (int i = j + 1; i <= s.length(); i++) {
                StringBuilder sb = new StringBuilder(s.substring(j, i));
                map.put(sb, sb.reverse());
            }
        }
        System.out.println("map " + map);
        return counter;
    }
输出:

map {abb=bba, bb=bb, bba=abb, a=a, ab=ba, b=b, abba=abba, ba=ab}
map{bba=bba,ba=ba,b=b,a=a,a=a,ab=ab,abb=abb,abba=abba,b=b,bb=bb}

您不应该将StringBuilder存储在HashMap中,因为与String不同,StringBuilder不会基于其内容实现equals和hashCode方法,而是从Object继承它们。StringBuilder的两个不同实例永远不可能相等。为了使程序正常运行并防止重复,请改为存储字符串:

您不应该将StringBuilder存储在HashMap中,因为与String不同,StringBuilder不会基于其内容实现equals和hashCode方法,而是从对象继承它们。StringBuilder的两个不同实例永远不可能相等。为了使程序正常运行并防止重复,请改为存储字符串:

HashMap不允许重复。但问题是如何确定这些复制品,以及为什么你会认为它是这样

它使用hashCode和equals来确定两件事是否相同。StringBuilder两者都不重写,因此使用基于标识的对象实现。因此,StringBuilder的两个不同实例(与内部缓冲区的内容无关)是不相等的

反转是将StringBuilder反转到位。因此,sb和sb.reverse是同一个StringBuilder

显然,同一个实例只能有单个顺序中的字符。您在这里看到的是,您将反向字符串存储为键和值。

HashMap不允许重复。但问题是如何确定这些复制品,以及为什么你会认为它是这样

它使用hashCode和equals来确定两件事是否相同。StringBuilder两者都不重写,因此使用基于标识的对象实现。因此,StringBuilder的两个不同实例(与内部缓冲区的内容无关)是不相等的

反转是将StringBuilder反转到位。因此,sb和sb.reverse是同一个StringBuilder


显然,同一个实例只能有单个顺序中的字符。您在这里看到的是,您正在将反向字符串存储为键和值。

在本例中,在地图中使用可变对象作为键是个坏主意StringBuilder如果这些对象发生更改,您可能无法从地图中检索存储的值。在本例中,在地图中使用可变对象作为键是个坏主意StringBuilder如果这些对象发生更改,则可能无法从地图中检索存储的值。
map {abb=bba, bb=bb, bba=abb, a=a, ab=ba, b=b, abba=abba, ba=ab}