学习笔记使用

ArrayList特点:动态数组结构,元素有序,可重复的一个集合

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class TestForeach {public static void main(String[] args) {List<String> words = new ArrayList<>();words.add("a");words.add("b");words.add("c");words.add("c");words.add("d");words.add("e");//        方案一:通过for循环for (int i = 0;i<words.size();i++){if ("a".equals(words.get(i))){words.remove(i);}}//        方案二:通过一个迭代器Iterator<String> iterator = words.iterator();while (iterator.hasNext()){String word = iterator.next();if ("e".equals(word)){iterator.remove();}}//        通过流的方式打印输出words.stream().forEach(System.out::println);}
}运行结果:
b
c
c
d

上图代码,是for循环和迭代器删除不重复的元素,安全删除元素。


import java.util.ArrayList;
import java.util.List;public class TestForeach {public static void main(String[] args) {List<String> words = new ArrayList<>();words.add("a");words.add("b");words.add("c");words.add("c");words.add("d");words.add("e");//        方案一:通过for循环for (int i = 0;i<words.size();i++){if ("c".equals(words.get(i))){words.remove(i);}}//        通过流的方式打印输出words.stream().forEach(System.out::println);}
}运行结果:
a
b
c
d
e

上图代码,是for循环删除指定的重复元素, 但是删除不安全,运行结果还有一个C 原因是动态数组结构


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class TestForeach {public static void main(String[] args) {List<String> words = new ArrayList<>();words.add("a");words.add("b");words.add("c");words.add("c");words.add("d");words.add("e");//        方案二:通过一个迭代器Iterator<String> iterator = words.iterator();while (iterator.hasNext()){String word = iterator.next();if ("c".equals(word)){iterator.remove();}}//        通过流的方式打印输出words.stream().forEach(System.out::println);}
}运行结果:
a
b
d
e

上图代码:迭代器删除指定重复元素,安全删除


对比发现,如果使用for循环,在list集合中删除相同的元素会发现删除不干净,而对比使用迭代器可以删除相同的元素。



import java.util.ArrayList;
import java.util.List;public class TestForeach {public static void main(String[] args) {List<String> words = new ArrayList<>();words.add("a");words.add("b");words.add("c");words.add("c");words.add("d");words.add("e");//        方案三:使用增强for循环for (String word : words){if ("c".equals(word)){words.remove(word);}}//        通过流的方式打印输出words.stream().forEach(System.out::println);}
}运行结果:
Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)at java.util.ArrayList$Itr.next(ArrayList.java:859)at 经典面试题.TestForeach.main(TestForeach.java:40)

上图代码是增强for循环,删除指定的重复元素,但是抛出异常报错,

由图可知:只要modCount != expectedModCount就会抛出异常,那我们只要关心一下两个值为什么不相等,在集合对其进行添加和修改时都会修改modCount值,在遍历之前modCount值是6,一开始modCount 与expectedModCount是相等的,在循环的过程中会删除一个元素,这时modCount与expectedModCount就不相等,因此会抛出异常。


二:下面为 安全删除指定重复元素

import java.util.ArrayList;
import java.util.List;public class TestForeach {public static void main(String[] args) {List<String> words = new ArrayList<>();words.add("a");words.add("b");words.add("c");words.add("c");words.add("d");words.add("e");//        方案四:采用removeIf接口,里面传上一个lambda表达式words.removeIf(word ->word.equals("c"));//        通过流的方式打印输出words.stream().forEach(System.out::println);}
}运行结果:
a
b
d
e

上图为jdk8的优化:
Java安全删除集合元素jdk8的终极解决方案:采用removeIf接口


//倒序删除,以防因为删除中间项导致数据下标变更,使得数据出错public static void remove2(List<String> list) {for (int i = list.size() - 1; i >= 0; i--) {if (list.get(i).contains("3")) {list.remove(i);}}}

顺序list集合删除

// 顺序删除,但是对下标和索引进行了处理public static void remove3(List<String> list) {for (int i = 0, len = list.size(); i < len; i++) {if (list.get(i).contains("3")) {list.remove(i);len--;i--;}}}

总结:
安全删除元素:

顺序,倒序都能删除指定的重复元素,案例在下面的源码里(remove2,remove3方法)

使用普通for循环可以删除不相同元素
可以使用迭代器删除元素
使用jdk8推出的新接口removeIf接口
不安全删除元素:

使用普通for循环删除相同元素会删除不干净
使用增强for循环删除元素会抛出并发修改异常
注意:不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。

地址

package com.numberone.web;import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class ArrayListTest {public static void main(String[] args) {ArrayList<String> strs = new ArrayList<>();strs.add("1");strs.add("32");strs.add("3");strs.add("4");strs.add("5");strs.add("36");strs.add("3");strs.add("3");System.out.println("删除元素前"+strs.size());System.out.println("删除元素前"+strs);
//        remove1(strs);
//        remove9(strs);
//        remove2(strs);remove3(strs);
//        remove4(strs);System.out.println("删除元素后"+strs);System.out.println("删除元素后"+strs.size());//        printList(strs);
//}//使用iterator,这个是java和Android源码中经常使用到的一种方法,所以最为推荐public static void remove1(List<String> list) {Iterator<String> sListIterator = list.iterator();while (sListIterator.hasNext()) {String str = sListIterator.next();if (str.contains("3")) {sListIterator.remove();}}}//不安全public static  void remove9(List<String> list){for (int i=0;i<list.size();i++){if (list.get(i).contains("3")) {list.remove(i);}}}//倒序删除,以防因为删除中间项导致数据下标变更,使得数据出错public static void remove2(List<String> list) {for (int i = list.size() - 1; i >= 0; i--) {if (list.get(i).contains("3")) {list.remove(i);}}}// 顺序删除,但是对下标和索引进行了处理public static void remove3(List<String> list) {for (int i = 0, len = list.size(); i < len; i++) {if (list.get(i).contains("3")) {list.remove(i);len--;i--;}}}// 在遍历过程中不直接操作原listpublic static void remove4(List<String> list) {List<String> temp = new ArrayList<>();for (String str : list) {if (str.contains("3")) {temp.add(str);}}list.removeAll(temp);}public static void printList(List<String> list) {for (String str : list) {System.out.println(str);}}
}

contains循环遍历

利用 List 的 contains 方法循环遍历, 重新排序, 只添加一次数据, 避免重复:

package com.jpa.demo.model;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class NumTest {public static void main(String[] args) {ArrayList<String> numbersList = new ArrayList<String>(Arrays.asList("1","1","2","2","66"));//排序  sort在对 int类型排序正常,如果另一种逆序 需要重写他底层一个 compare啥的方法  才能逆序//Collections.sort 在对list  为String类型 数字排序的时候 会出现不准!!对string类型 字母排序是正确, 对int 类型的数字 排序是正确的Collections.sort(numbersList);
System.out.println(removeDuplicate(numbersList));}private static List<String> removeDuplicate(List<String> list) {List<String> result = new ArrayList<String>(list.size());for (String str : list) {if (!result.contains(str)) {result.add(str);}}list.clear();list.addAll(result);return result;}
}

[ArrayList删除元素] 你需要了解的ArrayList如何安全的删除重复元素/ list去重相关推荐

  1. python添加重复元素_在Python 3.6中添加迭代时重复元素

    我正在尝试编写一部分代码,该代码从两个不同的列表中获取元素并进行匹配,如下所示,但是由于某种原因,我一直在输出列表中重复获取元素. def assign_tasks(operators, reques ...

  2. java arraylist 删除回车符_2种Java删除ArrayList中的重复元素的方法

    这篇文章将给出两种从ArrayList中删除重复元素的方法,分别是使用HashSet和LinkedHashSet. ArrayList是Java中最常用的集合类型之一.它允许灵活添加多个null元素, ...

  3. Java删除ArrayList中的重复元素的2种方法

    ArrayList是Java中最常用的集合类型之一.它允许灵活添加多个null元素,重复的元素,并保持元素的插入顺序.在编码时我们经常会遇到那种必须从已建成的ArrayList中删除重复元素的要求.这 ...

  4. Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历

    Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...

  5. 去除有序数组/链表的重复元素--双指针原地修改

    去除有序数组的重复元素–双指针原地修改 文章目录 去除有序数组的重复元素--双指针原地修改 一.题目描述 二.分析 三.代码:数组 四.代码:链表 一.题目描述 二.分析 显然,由于数组已经排序,所以 ...

  6. [Python] set()函数 创建一个无序不重复元素集

    Python set()函数 创建一个无序不重复元素集 功能: set()函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并集等. 语法: class set([it ...

  7. java中去除数组中重复元素的方法

    题目 请设计一个方法,将一个int数组arr中重复的元素去除,并且返回新数组newArr. 解法一 保留重复数字中的第一次出现的元素 首先建立一个与原数组等长的标记数组flag[],它的下标与原数组下 ...

  8. python 如何从列表中剔除(去除)重复元素?set()

    方法1:用内置函数set() 方法2:遍历去除元素 参考文章:python中如何去除列表中重复元素?

  9. python重复元素判定_20段极简Python代码:这些小技巧你都Get了么

    ↑↑↑ 点击上方蓝字,关注极客猴 如果你喜欢极客猴,可以把我置顶或星标~ 选自 | towardsdatascience转自 | 机器之心 Python 是机器学习最广泛采用的编程语言,它最重要的优势 ...

  10. C语言数组中找到第一个重复元素的算法(附完整源码)

    C语言数组中找到第一个重复元素的算法 C语言数组中找到第一个重复元素的算法完整源码(定义,实现,main函数测试) C语言数组中找到第一个重复元素的算法完整源码(定义,实现,main函数测试) #in ...

最新文章

  1. 只要有热情和方法就能学好Linux
  2. spring中aop设计与实现
  3. 《几何与代数导引》习题1.38
  4. ContentProvider再探——Document Provider
  5. 中国男子足球运动员及男足国家队的评价
  6. mac安装和卸载mysql_小白自学MySQL笔记(一):Mac环境的安装和启动
  7. Java GridBagLayout 简单使用
  8. python爬虫从入门到放弃-python 爬虫《从入门到放弃》
  9. golang fmt.printf()
  10. oracle中如何测试,Oracle数据库中如何正确的查看sql
  11. 《趣谈网络协议》课程学习笔记
  12. 流程图中的实线_绘制工艺流程图就这么简单(附工艺流程图常见符号)
  13. 中文分词(上)——获取和Word2Vec模型构建
  14. VVC/JEM代码学习26:m_pcTrQuant-transformN*N
  15. Ubuntu磁盘分区
  16. docker-compose(二):SpringBoot + Docker Compose
  17. 电机磁链和反电动势系数辨识
  18. R语言:R2OpenBUGS
  19. === 和 == 的区别
  20. 解决安装rpm包依赖关系的烦恼 - yum工具介绍及本地源配置方法

热门文章

  1. Adobe 系列软件中英文版本的切换
  2. 发json请求,报415错误。POST http://localhost:8080/ 415
  3. 统计学(五):几种常见的假设检验
  4. 基于学习的编码(六):DRNLF
  5. matlab axis坐标轴相关设置详解
  6. Python学习之re.compile与findall
  7. cmd 下登陆ftp及相关操作
  8. 正则(?=)(?:)
  9. spark sql 之 collect_set collect_list 后WrappedArray 取值
  10. 基于VUE-CLI实现待办事项功能