哈希集合操作元素时是通过元素的哈希值来索引的,
元素的哈希值是通过调用元素的hashcode得到的,
而除非自己重新定义这个方法否则默认是调用object的实现,
object的hashcode方法返回的哈希值是跟对象内存地址相关的,所以不同的对象的哈希值必然不同。
在楼主的代码里,调用add和remove时传入的是short基础类型的值,通过自动装箱,会产生一个新的Short类的对象,
而虽然对象的逻辑值相等但他们的哈希值不相等也被集合视为两个不同的元素,所以remove时传入的是通过自动装箱产生的新对象,
与add时传入的那个逻辑值相等的对象的哈希值不同所以一个都没有删除掉,所以最后size是10.
另外,如果集合元素类型是Integer,add和remove时传入的是int类型的值结果会不一样,最后size是1,
remove能删除成功是因为int类型的值在装箱成Integer对象时如果数值在一个字节的范围之内(-128~127)之间时,会先把对象缓存起来,
当下次又要把一个数值装成Integer对象时,会先去缓存的对象中去找如果有会直接把它拿来用不会产生一个新对象。 |