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]

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

阅读 749
评论 2019-10-11 提问
    3 个回答
    _TNT_
    • 3.3k

    反序列化没带类型参数,可能默认反序列化成了 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); // 这里报错
            }
    评论 赞赏