一、基本介绍
List.retainAll(Collection c)方法是Java集合框架中List接口的一种实现,用于保留此列表中那些也出现在指定集合中的元素。换句话说,该方法会从原列表中删除不在指定集合中的元素。
该方法的返回值为boolean类型,如果列表发生了变化,即至少有一个元素被删除,返回true。如果列表没有发生变化,即没有元素被删除,返回false。
二、基本使用
下面是该方法的基本使用示例:
Listlist1 = new ArrayList<>(); list1.add("apple"); list1.add("banana"); list1.add("orange"); List list2 = new ArrayList<>(); list2.add("banana"); list2.add("grape"); boolean result = list1.retainAll(list2); System.out.println(result); //output: true System.out.println(list1); //output: [banana]
在上述示例中,list1包含3个元素:apple、banana、orange;list2包含2个元素:banana、grape。通过list1.retainAll(list2)方法,原列表list1中不在list2中的元素apple和orange被删除,只剩下一个元素banana,返回值为true。
三、效率比较
在实际代码运行中,我们往往需要关注方法的效率。在List.retainAll()方法中,效率与列表大小和集合大小有关。具体来说,如果列表和集合大小都比较小,该方法的效率非常高;如果列表和集合大小都比较大,该方法的效率非常低。
下面是比较两个列表中共同元素的代码:
Listlist1 = new ArrayList<>(); List list2 = new ArrayList<>(); for(int i=0; i<10000; i++){ list1.add(i); list2.add(i+1); } long start1 = System.currentTimeMillis(); list1.retainAll(list2); long end1 = System.currentTimeMillis(); System.out.println("方法1耗时:" + (end1 - start1)); List list3 = new ArrayList<>(); List list4 = new ArrayList<>(); for(int i=0; i<1000; i++){ list3.add(i); list4.add(i+1); } long start2 = System.currentTimeMillis(); List result = new ArrayList<>(); for(Integer num : list3){ if(list4.contains(num)){ result.add(num); } } long end2 = System.currentTimeMillis(); System.out.println("方法2耗时:" + (end2 - start2));
在上述示例中,方法1使用List.retainAll()方法获取两个列表中共同元素;方法2使用循环和contains()方法获取两个列表中共同元素。我们通过改变列表大小,比较两种方法的效率。
当列表大小为10000时,方法1的耗时约为10ms,方法2的耗时约为1100ms,效率相差约100倍;当列表大小为1000时,方法1的耗时约为1ms,方法2的耗时约为12ms,效率相差约10倍。可以看出,当列表比较大时,List.retainAll()方法的效率要远高于循环和contains()方法。
四、注意事项
在使用List.retainAll()方法时,需要注意以下几点:
- 该方法会修改原列表,应该保存原列表的备份以避免数据丢失;
- 该方法只能对可编辑的列表进行操作,即对不可编辑的列表,如Arrays.asList()方法返回的列表,无法使用该方法;
- 该方法中集合参数c不能为null,否则会抛出空指针异常。
五、结语
通过以上对List.retainAll()方法的详细阐述,我们了解了该方法的基本使用、效率比较以及需要注意的事项,为我们日后的编程实践提供了一些参考和帮助。