铭誉摄影网站,做中介卖房子开哪个网站,专业的网站建设服务交易平台,阿里云 虚拟主机 wordpress目录 1.0 集合的并发修改问题 1.1 如何解决集合的并发修改问题 2.0 Collcetions 工具类的说明 1.0 集合的并发修改问题 我们可以简单的认为#xff0c;就是使用迭代器遍历集合时#xff0c;又同时在删除集合中的数据#xff0c;程序就会出现并发修改异常的错误。
代码如下就是使用迭代器遍历集合时又同时在删除集合中的数据程序就会出现并发修改异常的错误。
代码如下 import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class Abnormal {public static void main(String[] args) {//创建对象再添加数据ListString list new ArrayList();list.add(张三);list.add(陈七);list.add(李麻子);list.add(李四);list.add(王五);//利用迭代器进行遍历,先创建迭代器IteratorString iterator list.iterator();while (iterator.hasNext()){String a iterator.next();if (a.contains(李)){list.remove(a);}}System.out.println(list);}
}运行结果如下 像以上情况一边遍历的时候去删除数据直接会报错原因是因为集合是一个可变的容器每删一个数据容器的大小都会改变那么数据存放的位置也会相应的改变。迭代器遍历可能不好理解我们就换成普通的 for 循环但是两者的出现的 Bug 是一样的。
代码如下 import java.util.ArrayList;
import java.util.List;public class Text_For {public static void main(String[] args) {//创建对象再添加数据ListString list new ArrayList();list.add(张三);list.add(陈七);list.add(李麻子);list.add(李四);list.add(王五);for (int i 0; i list.size(); i) {String a list.get(i);if (a.contains(李)){list.remove(a);}}System.out.println(list);}
} 运行结果如下 发现用 for 循环竟然不报错原因可能是没有用迭代器遍历严谨吧以上的两种代码的效果都是一样的会出现 Bug ,就是本来要删除带 ”李“ 的名字但是发现名字还有一个”李四“没有被删除那是什么原因呢 直接会把 ”李四“ 忽略掉这就是这出现 Bug 的地方。 1.1 如何解决集合的并发修改问题 对于用普通的 for 循环来遍历的代码来说可以有两种方法第一个方法就是每一次删除数据的时候都要进行 i--; 第二方法就是从尾开始遍历。
代码如下 第一种方法 import java.util.ArrayList;
import java.util.List;public class Text_For {public static void main(String[] args) {//创建对象再添加数据ListString list new ArrayList();list.add(张三);list.add(陈七);list.add(李麻子);list.add(李四);list.add(王五);for (int i 0; i list.size(); i) {String a list.get(i);if (a.contains(李)){list.remove(a);i--;}}System.out.println(list);}
} 运行结果如下 成功把”李四“也删除掉了。 第二种方法 import java.util.ArrayList;
import java.util.List;public class Text_For {public static void main(String[] args) {//创建对象再添加数据ListString list new ArrayList();list.add(张三);list.add(陈七);list.add(李麻子);list.add(李四);list.add(王五);for (int i list.size() - 1; i 0; i--) {String a list.get(i);if (a.contains(李)){list.remove(a);}}System.out.println(list);}
} 运行结果如下 一样也可以把”李四“删除掉。 对于用迭代器来遍历的代码来说只能把集合对象.remove(String str) 换成迭代器对象.remove() 。
代码如下 import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class Abnormal {public static void main(String[] args) {//创建对象再添加数据ListString list new ArrayList();list.add(张三);list.add(陈七);list.add(李麻子);list.add(李四);list.add(王五);//利用迭代器进行遍历,先创建迭代器IteratorString iterator list.iterator();while (iterator.hasNext()){String a iterator.next();if (a.contains(李)){iterator.remove();}}System.out.println(list);}
} 运行结果如下 也是可以的。 对于增强 for 循环还有利用 Lambda 表达式的循环都不可以用来一边遍历集合一边删除数据无法解决集合的并发修改异常。 2.0 Collcetions 工具类的说明 是一个用来操作集合的工具类。
以代码为例来介绍具体的静态方法 import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class Text_Collections {public static void main(String[] args) {String s1 李四;String s2 张三;String s3 王五;String s4 张麻子;ListString list new ArrayList();//1. addAll() 为集合批量添加数据Collections.addAll(list,s1,s2,s3,s4);System.out.println(list);//输出结果为[李四, 张三, 王五, 张麻子]//2. shuffle() 打乱list集合中的元素顺序Collections.shuffle(list);System.out.println(list);//输出结果为[王五, 张麻子, 李四, 张三]//3. sort() 对list集合的元素进行升序排序Collections.sort(list);System.out.println(list);//输出结果为[张三, 张麻子, 李四, 王五]}
} 运行结果如下 补充第三种方法如果对自定的对象进行排序的话默认的 sort 是会报错的所以得自定义比较创建一个比较器。
代码如下 import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class Text_Collections {public static void main(String[] args) {Student s1 new Student(张三,19);Student s2 new Student(李四,33);Student s3 new Student(王五,21);ListStudent list new ArrayList();Collections.addAll(list,s1,s2,s3);//自定义根据年龄进行排序Collections.sort(list, new ComparatorStudent() {Overridepublic int compare(Student o1, Student o2) {return o1.getAge()- o2.getAge();}});System.out.println(list);}
} 运行结果如下