有关set接口的两道习题

129 阅读1分钟

习题一:在List内去除重复数字值,要求尽量简单

public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new Integer(1));
        list.add(new Integer(2));
        list.add(new Integer(2));
        list.add(new Integer(4));
        list.add(new Integer(4));
        List list1 = duplicateList(list);
        for (Object o : list1) {
            System.out.println(o);
        }
    }

    public static List duplicateList(List list) {
        HashSet set = new HashSet();
        set.addAll(list);
        return new ArrayList(set);
    }

习题二:判断输出值

public static void main(String[] args) {
        HashSet set = new HashSet();
        Person p1 = new Person(1001, "AA");
        Person p2 = new Person(1002, "BB");

        set.add(p1);
        set.add(p2);
        p1.name = "CC";
        set.remove(p1);
        System.out.println(set);
        /**
         * 输出为:[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}]
         * 原因:在set中是使用哈希值来存放数据删除数据的,
         * 在最开始时,存放1001,AA的哈希值
         * 与更改为CC后的哈希值不一致,所以删除时寻找的更改后的哈希值位置
         * 而此时的位置上没有数据,所以没有删除
         */
        set.add(new Person(1001, "CC"));
        System.out.println(set);
        /**
         * 输出为:[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}]
         * 原因:上一处的1001,CC存放的位置并不是其真实值的哈希值对应的位置
         *      因此,真实值的哈希值对应的位置为空,可以添加
         */
        set.add(new Person(1001, "AA"));
        System.out.println(set);
        /**
         * 输出为:[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}, Person{id=1001, name='AA'}]
         * 原因:此时,1001,AA的哈希值对应的位置上有数据1001,CC
         *      然后进行equals()比较,两者不同,1001,AA数据加入
         */
    }