先看两段代码:
Demo1:
Set<Short>s=new HashSet<>(); for(Short i=0;i<100;i++){ s.add(i); s.remove(i-1); } System.out.println(s.size());
Demo2:
Set<Integer>s=new HashSet<>(); for(int i=0;i<100;i++){ s.add(i); s.remove(i-1); } System.out.println(s.size());
可以尝试先思考这两段代码的输出结果。
答案是:Demo1输出100,Demo2输出1.
因为这里存在一个(i-1),自动将short类型转化为int类型,
再看看Set集合的add(),remove()方法
boolean add(E e); boolean remove(Object o);
也就是说Set集合的存放的是Object类型,会自动将short,int数值自动装箱为Short,Integer的对象
Short,Integer不是同一种Object,自然Demo1里面的值remove不了,而Demo2会remove至只剩一个Object对象
如结果所示。
下面再以一段代码证:
Set<Short>s=new HashSet<>(); short i=1; s.add(i); int j=1; s.remove(j); System.out.println(i==j); System.out.println(s);
输出结果:true [1]
也证实了这点:基本类型下虽然可以自动转换,但是对Set集合中来说,进行自动装箱后Object是完全不同的,自然remove不了