Set中出现可以重复添加元素的情况

简化代码测试如下:

public class Test {
    public static void main(String[] args) {
        Set<Long> set = new HashSet<>();
        set.add(1L);
        System.out.println(set);
        String setStr = JsonUtil.serialize(set);
        set = JsonUtil.deserialize(setStr);
        set.add(1L);
        System.out.println(set);
    }
}

JsonUtil.java

public class JsonUtil<T> {
    /**
     * 序列化
     *
     * @param object 序列化对象
     * @return
     */
    public static String serialize(Object object) {
        return JSON.toJSONString(object);
    }

    /**
     * Set反序列化
     *
     * @param jsonStr 序列化结果
     * @return
     */
    public static Set deserialize(String jsonStr) {
        return JSON.parseObject(jsonStr, Set.class);
    }
}

测试结果:

[1]
[1, 1]

出现这种情况的原因是什么

阅读 4.6k
3 个回答

反序列化没带类型参数,可能默认反序列化成了 Integer,再放一个 Long 进去,并不冲突,于是可以放两个
Long遍历一下这个set就会报ClassCastException

        HashSet<Long> longs = new HashSet<>();
        longs.add(1L);

        System.out.println(longs); // [1]

        Set anything = longs;
        anything.add(1);

        System.out.println(longs);  // [1, 1]

        for (Long aLong : longs) {
            System.out.println(aLong); // 这里报错
        }

序列化之前
clipboard.png

序列化之后
clipboard.png

Integer和Long两个变量的hashCode不相等

set 为什么 不指定类型 ???(不指定就是 Object 了,转回来的时候)

创建集合最好显示指定类型。

推荐问题