谁可以告诉我为什么代码这样写,最终list没有被替换掉public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("f");
list.add("e");
list.add("f");
System.out.println(list);
Set<String> set = new HashSet<>();
set.addAll(list);
System.out.println(set);
list.retainAll(set);
System.out.println(list);
}
}

解决方案 »

  1.   

    因为有重复的两个“f”呀,list匹配set的时候,这两个“f”都可以匹配到set里面的那一个“f”
      

  2.   

    那为什么我把 set.addAll(list); 这个段代码改成 set.add("a");set.add("b");set.add("c");set.add("f");set.add("e");就会结果就是 list的值和set值一样,set.addAll,和set,add不都是最后set值是一样的,那为什么最后操作retainAll不一样。
      

  3.   

    那为什么我把 set.addAll(list); 这个段代码改成 set.add("a");set.add("b");set.add("c");set.add("f");set.add("e");就会结果就是 list的值和set值一样,set.addAll,和set,add不都是最后set值是一样的,那为什么最后操作retainAll不一样。
    好像我测试的结果是一样的哦
      

  4.   

    public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("f");
            list.add("e");
            list.add("f");
            System.out.println(list);
            Set<String> set = new HashSet<String>();
            set.add("a");
            set.add("b");
            set.add("c");
            set.add("f");
            set.add("e");
            //set.addAll(list);
            System.out.println(set);
            list.retainAll(set);
            System.out.println(list);
    }这个结果是:
    [a, b, c, f, e, f]
    [f, e, b, c, a]
    [a, b, c, f, e, f]
     public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("f");
            list.add("e");
            list.add("f");
            System.out.println(list);
            Set<String> set = new HashSet<String>();
    //        set.add("a");
    //        set.add("b");
    //        set.add("c");
    //        set.add("f");
    //        set.add("e");
            set.addAll(list);
            System.out.println(set);
            list.retainAll(set);
            System.out.println(list);
    }这个结果是:
    [a, b, c, f, e, f]
    [f, e, b, c, a]
    [a, b, c, f, e, f]
      

  5.   

    那为什么我把 set.addAll(list); 这个段代码改成 set.add("a");set.add("b");set.add("c");set.add("f");set.add("e");就会结果就是 list的值和set值一样,set.addAll,和set,add不都是最后set值是一样的,那为什么最后操作retainAll不一样。
    好像我测试的结果是一样的哦结果是一样的呀
      

  6.   

    首先明白List和Set的区别,List中的元素可重复,Set中相同元素只会存一个, set.addAll(list);
    这句代码将list中的元素全部添加进set,而这个过程中会自动将相同元素只保留一个
     list.retainAll(set);
    看看API中对于retainAll的解释:仅保留此列表中包含在指定集合中的元素。 换句话说,从此列表中删除其中不包含在指定集合中的所有元素。 
    也就是说list还是[a, b, c, f, e, f],set是[a, b, c, e, f];现在从list中删除不在set中的所有元素,结果显然,没有,所以该函数返回值为false
    boolean al = list.retainAll(set);
    System.out.println(al);亲测