前言
for循环是开发中常用的,但是使用for循环仍然有很多有需要注意的地方。今天我们就来细说for循环带了的坑。
- for循环问题一,遍历list集合出现死循环。
今天,同事遇到了一个奇怪的问题,问题是这样的,他遍历向一个集合添加数据,结果发现for循环变成了死循环。大致代码如下。
//学生类
class Student{
private String name;//性命
private int age;//年龄
//有参构造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//无参构造方法
public Student() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//测试程序
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
//添加几条测试数据
students.add(new Student("张三",23));
students.add(new Student("李四",24));
students.add(new Student("王五",25));
students.add(new Student("赵六",26));
for(int i=0;i<students.size();i++){
Student student = students.get(i);
if(i==2){
student.setName("哈斯奇");
}
students.add(student);
}
}
好了,运行一下测试程序,你会发现程序变成了死循环,集合的size在不断增加,最终可能卡死你的终端。
- 问题:
造成死循环,studens.size()会一直增加
分析一下原因,这是为什么了。其实,出现这种问题,归根结底,就是基础不够扎实,或者做事太粗心,原因很简单。
- 发生问题的原因:
每次循环后,又添加了这个对象到数组中,增加了数组的长度,而且list里面是允许存储先通过对象的。进而导致了一list的增加,造成了死循环。其实添加对象属性就可以了,对象本身还在list里面的。
- 解决办法:
知道问题产生的原因,那就很好解决了,因为我们只是改变对象的属性值,而不是新增一个新的对象,因此,只需要做一下改变即可。
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
//添加测试数据
students.add(new Student("张三",23));
students.add(new Student("李四",24));
students.add(new Student("王五",25));
students.add(new Student("赵六",26));
for(int i=0;i<students.size();i++){
Student student = students.get(i);
if(i==2){
student.setName("哈斯奇");
}
// students.add(student);//去掉这句代码即可
}
}
总结:
通过,这个简单的列子,我们需要实时吸取教训,凡事多总结。
- 平时一定要注意基本功,只有基本功扎实才会必秒因为基础不扎实出现本不该出现的问题。
- 不管做什么事情,一定要细心。
- 在使用list集合遍历并操作自身时,一定要注意位置是变化的,size 是移动的。
虽然很基础,希望大家遇到类似的问题不要范湖,一定注意要仔细,如果你觉得帮助了您,麻烦给个小红心吧,接下来我会继续讲解for循环,以及高效循环算法。