老师能再讲一下删除花花为什么要报错

老师能再讲一下删除花花为什么要报错

老师能再讲一下删除花花为什么要报错,删除花花二代不报错吗?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,同学描述的是否是ConcurrentModificationException异常。如下图所示:

http://img1.sycdn.imooc.com//climg/5e6462e009eba6a304970163.jpg

因为花花二代是集合遍历时最后一个遍历到的数据,删除花花二代以后,集合也就遍历结束了,这样是没有问题的。但是如果删除花花,因为不是集合最后遍历的数据,之后循环会继续执行,这时候就会发生错误。因为删除数据后,集合的存储结构就发生变化了,再遍历肯定要出错。

如果不是建议同学重新描述一下问题。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

提问者 视线模糊 2020-03-07 21:27:10

package com.imooc.set;


import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;


public class CatTest {


public static void main(String[] args) {

// 定义宠物猫对象

Cat huahua = new Cat("花花", 12, "英国短毛猫");

Cat fanfan = new Cat("凡凡", 3, "中华田园猫");

// 将宠物猫对象放入HashSet中

Set<Cat> set = new HashSet<Cat>();

set.add(huahua);

set.add(fanfan);

// 显示宠物猫信息

Iterator<Cat> it = set.iterator();

while (it.hasNext()) {

System.out.println(it.next());

}


// 再添加一个与花花属性一样的猫

Cat huahua01 = new Cat("花花", 12, "英国短毛猫");

set.add(huahua01);

System.out.println("**********************************");

System.out.println("添加重复数据后的宠物猫信息:");

it = set.iterator();

while (it.hasNext()) {

System.out.println(it.next());

}


System.out.println("**********************************");

// 重新插入一个新宠物猫

Cat huahua02 = new Cat("花花二代", 2, "英国短毛猫");

set.add(huahua02);

System.out.println("添加花花二代后的宠物猫信息:");

it = set.iterator();

while (it.hasNext()) {

System.out.println(it.next());

}


System.out.println("**********************************");

// 在集合中查找花花的信息并输出

if (set.contains(huahua)) {

System.out.println("花花找到了!");

System.out.println(huahua);

} else {

System.out.println("花花没找到!");

}

// 在集合中使用名字查找花花的信息

System.out.println("**********************************");

System.out.println("通过名字查找花花信息");

boolean flag = false;

Cat c = null;

it = set.iterator();

while (it.hasNext()) {

c = it.next();

if (c.getName().equals("花花")) {

flag = true;// 找到了

break;

}

}

if (flag) {

System.out.println("花花找到了");

System.out.println(c);

} else {

System.out.println("花花没找到");

}


// 删除花花二代的信息并重新输出

for (Cat cat : set) {

if ("花花".equals(cat.getName())) {

set.remove(cat);

break;

}

}

System.out.println("**********************************");


System.out.println("删除花花二代后的数据");

for (Cat cat : set) {

System.out.println(cat);

}

// 删除集合中的所有宠物猫信息

System.out.println("**********************************");

boolean flag1 = set.removeAll(set);

if (set.isEmpty()) {

System.out.println("猫都不见了。。。");

} else {

System.out.println("猫还在。。。");

}

}

}

为什么我的运行没有报错?

  • 提问者 视线模糊 #1
    package com.imooc.set; public class Cat { private String name; //名字 private int month; //年龄 private String species;//品种 //构造方法 public Cat(String name, int month, String species) { super(); this.name = name; this.month = month; this.species = species; } //getter与setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } public String getSpecies() { return species; } public void setSpecies(String species) { this.species = species; } @Override public String toString() { return "[姓名:" + name + ", 年龄:" + month + ", 品种:" + species + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + month; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((species == null) ? 0 : species.hashCode()); return result; } @Override public boolean equals(Object obj) { //判断对象是否相等,相等则返回true,不用继续比较属性了 if(this==obj) return true; //判断obj是否是Cat类的对象 if(obj.getClass()==Cat.class){ Cat cat=(Cat)obj; return cat.getName().equals(name)&&(cat.getMonth()==month)&&(cat.getSpecies().equals(species)); } return false; } }
    2020-03-07 21:27:58
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师