Java 为什么HashMap允许重复,而StringBuilder不能正确反转?
HashMap不允许重复,而StringBuilder.reverse不能正常工作。为什么?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
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}