为什么StringBuffer或者StringBuilder不能用作HashMap的key值

前言:一般开发人员,基本上在使用hashMap的时候,大体上都会使用String作为HashMap的key值,很少使用引用对象。
那为什么呢,大概我们都会说String是final的,底层也是final数组,这样的话key不变,才能作为HashMap的key。
其实,这样的说法也是对的,但究其原因,结论1:String复写了hashCode和equals方法。
那现在我来看两个有意思的例子:
为什么StringBuffer或者StringBuilder不能用作HashMap的key值
很简单的一个例子,最终输出的结果,也许你认为应该是map size=2,那么实际呢
为什么StringBuffer或者StringBuilder不能用作HashMap的key值
我们会错误的认为结果是{a=test1}{ab=test2};那么这种结果是怎么造成的呢,我们简单的分析下:
1)首先,我们很明确Stringbuilder是可变的,区别于String
2)其次Stringbuilder并没有复写hashcode和equals,还是继承于Object
所以这时候,我们能很快的反应过来,虽然在代码中我们两次往map插入了Stringbuilder 元素key;但其实因为Stringbuilder并没有复写hashCode和Equals方法,所以两次put的Stringbuilder ,在内存上地址其实都是一样的,等效往同一个key上更新了value值。
如果我们改变一下上述put的key,那么结果如何呢?
为什么StringBuffer或者StringBuilder不能用作HashMap的key值
很显然,我们能很快的明白正确的结果,因为在put时,Stringbuilder 调用了toString方法,此时key值不再是Stringbuilder ,而是String;而且两次String是不同的。
在这里,只是简单说明了一下StringBuilder不能作为HashMap Key的个人见解,希望有更好解释的小伙伴,能够提供给我,而且针对这种问题,最好是从源码的角度去分析解决。