关于集合SET的一个有关问题

关于集合SET的一个问题。

public class TestMain {

public static void main(String[] args) {
Set<Integer> set = new HashSet<Integer>();
Integer i1 = 45;
Integer i2 = 46;
set.add(i1);
set.add(i2);
System.out.println(set.size());//
set.remove(i1);
System.out.println(set.size());//
for (Integer integer : set) {
System.out.println("i2 = " + integer); //
}
i2 = 47;
set.remove(i2);
for (Integer integer : set) {
System.out.println("i2 = " + integer);
}
System.out.println(set.size());//
}
}

输出结果分别是
2
1
i2 = 46
i2 = 46
1
麻烦高人解释下这后面四个输出结果,i2在后面改变为47, 但set取出的仍是46,使用了remove方法后set的size仍是1.说明存放的不是i2对象??可是为什么remove(i1)方法后 原本的i1 = 45就不在了。 我绕迷糊了。麻烦指点
------解决方案--------------------
你的写法等同于下面的

        Set<Integer> set = new HashSet<Integer>();
//        Integer i1 = 45;
//        Integer i2 = 46;
        set.add(45);
        set.add(46);
        System.out.println(set.size());//
        set.remove(45);
        System.out.println(set.size());//
        for (Integer integer : set) {
            System.out.println("i2 = " + integer); //
        }
//        i2 = 47;
        set.remove(47);
        for (Integer integer : set) {
            System.out.println("i2 = " + integer);
        }
        System.out.println(set.size());//

------解决方案--------------------
嗯,同上。
主要问题在后面的i2= 47,Integer 是基本数据类型。是值传递,所以变量改变,值是不会变的。removed也是removed的值
------解决方案--------------------
你虽然给i2变量重新赋值47,但是你没有add到set集合中,set集合是面的值还是46,你remove(47),但set中没有这个值,所以两次for循环输出的都是46
------解决方案--------------------
你的i2 = 47;不会改变原先的值,而是new了一个新的Integer。

LZ可以自定义一个数值类:
class MyInteger{
  public int value;
}

然后再i2.value = 47;
应该可以实现你的效果。
------解决方案--------------------
public static void main(String[] args) {
        Set<Integer> set = new HashSet<Integer>();
        Integer i1 = 45;
        Integer i2 = 46;
        set.add(i1);//加入45
        set.add(i2);//加入46
        System.out.println(set.size());//集合中有45,46  size = 2
        set.remove(i1);//移除46
        System.out.println(set.size());//集合中只有46了   size =1
        for (Integer integer : set) {//
            System.out.println("i2 = " + integer); //
        }
        i2 = 47;//变量赋值47
        set.remove(i2);//移除47 ,集合中不存在,
        for (Integer integer : set) {//由于新的i2变量值没有加入集合,所以集合还是 46
            System.out.println("i2 = " + integer);
        }
        System.out.println(set.size());//集合中还是46  size =1
    }
------解决方案--------------------
简而言之,基本类型和其对应的引用类型外加字符串String 这17种在Java中是值传递的而非引用传递
------解决方案--------------------
只是把值47传给了i2 并没有修改set中的值(引用)。
------解决方案--------------------
详细看这篇文章就可以了:http://blog.****.net/enson16855/article/details/8753639


------解决方案--------------------
引用:
详细看这篇文章就可以了:http://blog.****.net/enson16855/article/details/8753639
你要明白HashSet的底层其实是HashTable实现的。。还有hashcode和equals方法,文章说的比较详细,看源码就知道了的~关于集合SET的一个有关问题