有关Set集合的一个小问题

先看两段代码:

    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不了

posted @ 2017-08-07 16:24  Goxcheer  阅读(397)  评论(0编辑  收藏  举报