黑马程序员技术交流社区
标题:
看视频有感而发的小程序
[打印本页]
作者:
贾联国
时间:
2012-4-28 04:32
标题:
看视频有感而发的小程序
看视频的时候看到一个有意思的事,感觉很容易被忽略,就写了个小程序,大家分析一下原因吧~
import java.util.*;
public class TestSet
{
public static void main(String[] args)
{
Set<Short> s=new HashSet<Short>();
for(short i=0;i<10;i++)
{
s.add(i);
s.remove(i-1);
}
System.out.println("size of s:"+s.size());
}
}
复制代码
运行结果 size of s:10
作者:
罗旭维
时间:
2012-4-28 09:09
哈希集合操作元素时是通过元素的哈希值来索引的,
元素的哈希值是通过调用元素的hashcode得到的,
而除非自己重新定义这个方法否则默认是调用object的实现,
object的hashcode方法返回的哈希值是跟对象内存地址相关的,所以不同的对象的哈希值必然不同。
在楼主的代码里,调用add和remove时传入的是short基础类型的值,通过自动装箱,会产生一个新的Short类的对象,
而虽然对象的逻辑值相等但他们的哈希值不相等也被集合视为两个不同的元素,所以remove时传入的是通过自动装箱产生的新对象,
与add时传入的那个逻辑值相等的对象的哈希值不同所以一个都没有删除掉,所以最后size是10.
另外,如果集合元素类型是Integer,add和remove时传入的是int类型的值结果会不一样,最后size是1,
remove能删除成功是因为int类型的值在装箱成Integer对象时如果数值在一个字节的范围之内(-128~127)之间时,会先把对象缓存起来,
当下次又要把一个数值装成Integer对象时,会先去缓存的对象中去找如果有会直接把它拿来用不会产生一个新对象。
作者:
褚代江
时间:
2012-4-28 09:29
1楼的哥们。我也受教了
作者:
蒋亮
时间:
2012-4-28 09:52
在你的这段代码中,add()往集合中加入的是Short类型的数据,remove()删除的却是Integer类型的数据,所以才会出现最终打印结果为10,short类型的变量在运算过程中会自动提升类型为int,你在i-1前面进行强制类型转换,就可以成功remove掉i-1了,将s.remove(i-1)改为s.remove((short)(i-1))就行了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2