今天补String相关知识的时候,这个问题想不通。
Set集合不是不能存放相同的值吗?可这种情况可以存,难道就是因为StringBuffer可变?
但是存元素到set集合,不是会先hashCode比较,再equals比较吗,equals比较是相同的,应该存不进去啊。
可能是因为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());
}
}
}
HashSet,它是基于 HashMap 实现的,底层采用 HashMap 来保存元素,所以add元素的时候,是先计算当前key的hash值,您这个是new了两个StringBuffer,对应的Hash值肯定不相等,因此这时候看的是两个对象的hash,而不是StringBuffer拼接的字符串
StringBuffer在执行equals时比较的是地址
只有当它转string之后再比较比较的才是值
你new了两个值是一样但是 这个两个对象实际上是不一样的