List中的retainALL方法求组解答

macjor_90 2018-04-17 09:21:41
谁可以告诉我为什么代码这样写,最终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);
}
}
...全文
1053 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
自由自在_Yu 2018-04-19
  • 打赏
  • 举报
回复
引用 3 楼 lye2000000_super 的回复:
[quote=引用 2 楼 macjor_90 的回复:] [quote=引用 1 楼 yuxiangaaaaa 的回复:] 因为有重复的两个“f”呀,list匹配set的时候,这两个“f”都可以匹配到set里面的那一个“f”
那为什么我把 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不一样。[/quote] 好像我测试的结果是一样的哦[/quote] 结果是一样的呀
自由自在_Yu 2018-04-19
  • 打赏
  • 举报
回复
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]
Tony__Java 2018-04-19
  • 打赏
  • 举报
回复
首先明白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);
亲测
自由自在_Yu 2018-04-18
  • 打赏
  • 举报
回复
因为有重复的两个“f”呀,list匹配set的时候,这两个“f”都可以匹配到set里面的那一个“f”
  • 打赏
  • 举报
回复
引用 2 楼 macjor_90 的回复:
[quote=引用 1 楼 yuxiangaaaaa 的回复:] 因为有重复的两个“f”呀,list匹配set的时候,这两个“f”都可以匹配到set里面的那一个“f”
那为什么我把 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不一样。[/quote] 好像我测试的结果是一样的哦
macjor_90 2018-04-18
  • 打赏
  • 举报
回复
引用 1 楼 yuxiangaaaaa 的回复:
因为有重复的两个“f”呀,list匹配set的时候,这两个“f”都可以匹配到set里面的那一个“f”
那为什么我把 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不一样。

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧