Java Set集合什么情况可以存放相同的值(key相同)

今天补String相关知识的时候,这个问题想不通。
Set集合不是不能存放相同的值吗?可这种情况可以存,难道就是因为StringBuffer可变?
但是存元素到set集合,不是会先hashCode比较,再equals比较吗,equals比较是相同的,应该存不进去啊。

img

可能是因为StringBuffer对象str和str2的hashcode()不一样导致的,测试代码如下:

import java.util.HashSet;
import java.util.Iterator;

public class HashSetAddStringBuffer {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        StringBuffer str = new StringBuffer("aaa");
        StringBuffer str2 = new StringBuffer("aaabbb");
        HashSet set = new HashSet();
        
        
        set.add(str2);
        System.out.println("str2.hashCode():"+str2.hashCode());
        str.append("bbb");
        set.add(str);
        System.out.println("str.hashCode():"+str.hashCode());
        
        
        Iterator it = set.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }

}


img

HashSet,它是基于 HashMap 实现的,底层采用 HashMap 来保存元素,所以add元素的时候,是先计算当前key的hash值,您这个是new了两个StringBuffer,对应的Hash值肯定不相等,因此这时候看的是两个对象的hash,而不是StringBuffer拼接的字符串

StringBuffer在执行equals时比较的是地址
只有当它转string之后再比较比较的才是值

你new了两个值是一样但是 这个两个对象实际上是不一样的