how2j.cn

本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



4分43秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器



关键字 简介 示例代码
for
用for循环遍历
示例代码
iterator
迭代器遍历
示例代码
for:
用增强型for循环
示例代码
练习-删除ArrayList中的数据
示例代码
答案-删除ArrayList中的数据
示例代码
步骤 1 : 用for循环遍历   
步骤 2 : 迭代器遍历   
步骤 3 : 用增强型for循环   
步骤 4 : 练习-删除ArrayList中的数据   
步骤 5 : 答案-删除ArrayList中的数据   

步骤 1 :

用for循环遍历

edit
通过前面的学习,知道了可以用size()和get()分别得到大小,和获取指定位置的元素,结合for循环就可以遍历出ArrayList的内容
用for循环遍历
package collection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import charactor.Hero; public class TestCollection { public static void main(String[] args) { List<Hero> heros = new ArrayList<Hero>(); // 放5个Hero进入容器 for (int i = 0; i < 5; i++) { heros.add(new Hero("hero name " + i)); } // 第一种遍历 for循环 System.out.println("--------for 循环-------"); for (int i = 0; i < heros.size(); i++) { Hero h = heros.get(i); System.out.println(h); } } }
使用迭代器Iterator遍历集合中的元素
迭代器遍历
package collection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import charactor.Hero; public class TestCollection { public static void main(String[] args) { List<Hero> heros = new ArrayList<Hero>(); //放5个Hero进入容器 for (int i = 0; i < 5; i++) { heros.add(new Hero("hero name " +i)); } //第二种遍历,使用迭代器 System.out.println("--------使用while的iterator-------"); Iterator<Hero> it= heros.iterator(); //从最开始的位置判断"下一个"位置是否有数据 //如果有就通过next取出来,并且把指针向下移动 //直到"下一个"位置没有数据 while(it.hasNext()){ Hero h = it.next(); System.out.println(h); } //迭代器的for写法 System.out.println("--------使用for的iterator-------"); for (Iterator<Hero> iterator = heros.iterator(); iterator.hasNext();) { Hero hero = (Hero) iterator.next(); System.out.println(hero); } } }
步骤 3 :

用增强型for循环

edit
使用增强型for循环可以非常方便的遍历ArrayList中的元素,这是很多开发人员的首选。

不过增强型for循环也有不足:
无法用来进行ArrayList的初始化
无法得知当前是第几个元素了,当需要只打印单数元素的时候,就做不到了。 必须再自定下标变量。
用增强型for循环
package collection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import charactor.Hero; public class TestCollection { public static void main(String[] args) { List<Hero> heros = new ArrayList<Hero>(); // 放5个Hero进入容器 for (int i = 0; i < 5; i++) { heros.add(new Hero("hero name " + i)); } // 第三种,增强型for循环 System.out.println("--------增强型for循环-------"); for (Hero h : heros) { System.out.println(h); } } }
步骤 4 :

练习-删除ArrayList中的数据

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
首先初始化一个Hero集合,里面放100个Hero对象,名称分别是从
hero 0
hero 1
hero 2
...
hero 99.

通过遍历的手段,删除掉名字编号是8的倍数的对象
步骤 5 :

答案-删除ArrayList中的数据

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

5分22秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


这个练习的考点是,不能够在使用Iterator和增强for循环遍历数据的同时,删除数据,否则会抛出ConcurrentModificationException

解决办法,是准备一个临时容器,专门用来保存需要删除的对象。 然后再删掉
package collection; import java.util.ArrayList; import java.util.List; import charactor.Hero; public class TestCollection { public static void main(String[] args) { List<Hero> heros = new ArrayList<Hero>(); // 放100个Hero进入容器 for (int i = 0; i < 100; i++) { heros.add(new Hero("hero name " + i)); } //准备一个容器,专门用来装要删除的对象 List<Hero> deletingHeros = new ArrayList<>(); for (Hero h : heros) { int id = Integer.parseInt(h.name.substring(10)); if (0 == id % 8) deletingHeros.add(h); } for (Hero h : deletingHeros) { heros.remove(h); } // heros.removeAll(deletingHeros); //直接通过removeAll删除多个Hero对象 System.out.println(heros); } }


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2024-07-07 三种遍历方法删除指定的对象
虚心求学




新的思路: 1.解决了使用迭代器迭代集合元素改变导致报错的问题; 2.解决了for删除下标左移的问题;不用考虑下标问题,也不用下标来删除元素。 遍历方法: 1.for 遍历 2.foreach/for增强 遍历 3.迭代器遍历
加载中
	public static void main(String[]args)
	{
		printList(foreachMetho1(getHeroList(100)));
		printList(foreachMetho2(getHeroList(100)));
		printList(foreachMetho3(getHeroList(100)));
		printList(foreachMetho3_1(getHeroList(100)));
	}
	public static List<Hero> getHeroList(int num)
	{
		List<Hero> heros = new ArrayList<>();
		for (int i = 0; i < num; i++) {
			heros.add(new Hero("H"+i,i));
		}
		return heros;
	}
	public static void printList(List<Hero>heros)
	{
		int i  = 0;
		for (Hero hero : heros) {
			if(i%10==0&&i>0)
				System.out.println();
			System.out.print(String.format("%-3s ", hero.name));

			i++;
		}
		System.out.println();
	}
	public static List<Hero> foreachMetho1(List<Hero>heros)
	{
		System.out.println("\r\nfor():");
		for (int i = 0; i < heros.size(); i++) {
			Hero hero = heros.get(i);
			int id = Integer.parseInt(hero.name.replace("H", ""));
			if(id%8==0)
			{
				heros.remove(hero);
			}
		}
		
		return heros;
	}
	public static List<Hero> foreachMetho2(List<Hero>heros)
	{
		System.out.println("\r\nforeach():");
		Hero[] arr = heros.toArray(new Hero[]{});
		for (Hero hero : arr) {
			int id = Integer.parseInt(hero.name.replace("H", ""));
			if(id%8==0)
			{
				heros.remove(hero);
			}
		}
		return heros;
	}
	public static List<Hero> foreachMetho3(List<Hero>heros)
	{
		List<Hero>copy = new ArrayList<>();
		copy.addAll(heros);
		System.out.println("\r\nwhile (iter.hasNext()):");
		Iterator<Hero> iter =  copy.iterator();
		while (iter.hasNext()) {
			Hero hero = iter.next();
			int id = Integer.parseInt(hero.name.replace("H", ""));
			if(id%8==0)
			{
				heros.remove(hero);
			}
		}
		return heros;
	}
	public static List<Hero> foreachMetho3_1(List<Hero>heros)
	{
		System.out.println("\r\nfor (Iterator<Hero> iter =  heros.iterator(); iter.hasNext(); ):");
		List<Hero>copy = new ArrayList<>();
		copy.addAll(heros);
		for (Iterator<Hero> iter =  copy.iterator(); iter.hasNext(); ) {
			Hero hero = iter.next();
			int id = Integer.parseInt(hero.name.replace("H", ""));
			if(id%8==0)
			{
				heros.remove(hero);
			}
		}
		return heros;
	}

							


2 个答案

木宇
答案时间:2024-07-09
打卡

虚心求学
答案时间:2024-07-07
测试10万数组长度,比较这几种遍历方法的性能。 数组长度:100,000,防止卡顿只打印前30个元素 for(): Spend time is 3625 ms H1 H2 H3 H4 H5 H6 H7 H9 H10 H11 H12 H13 H14 H15 H17 H18 H19 H20 H21 H22 H23 H25 H26 H27 H28 H29 H30 H31 H33 H34 foreach(): Spend time is 3266 ms H1 H2 H3 H4 H5 H6 H7 H9 H10 H11 H12 H13 H14 H15 H17 H18 H19 H20 H21 H22 H23 H25 H26 H27 H28 H29 H30 H31 H33 H34 while (iter.hasNext()): Spend time is 3345 ms H1 H2 H3 H4 H5 H6 H7 H9 H10 H11 H12 H13 H14 H15 H17 H18 H19 H20 H21 H22 H23 H25 H26 H27 H28 H29 H30 H31 H33 H34 for (Iterator<Hero> iter = heros.iterator(); iter.hasNext(); ): Spend time is 6466 ms H1 H2 H3 H4 H5 H6 H7 H9 H10 H11 H12 H13 H14 H15 H17 H18 H19 H20 H21 H22 H23 H25 H26 H27 H28 H29 H30 H31 H33 H34 结论:增强for效率最高



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2023-10-30 倒序遍历
279844782abc




倒序遍历删除,就不用担心下标左移的问题了
 //倒序遍历删除,就不用担心下标左移的问题了
    public static void DelList(){
        List<Hero> heros = new ArrayList<>();
        for(int i = 0;i<17;i++){
            heros.add(new Hero("hero"+i));
        }
        System.out.println("-----for循环-----");
        for (int i = heros.size()-1;i>=0;i--){
            if(i%8==0&i!=0){
                heros.remove(heros.get(i));
            }
        }
        System.out.println(heros);
    }

							


2 个答案

晚安嘛
答案时间:2024-03-26
倒序遍历的你真是个天才!

wr123
答案时间:2023-11-23
package collection; import java.util.ArrayList; import charactor.Hero; public class TestCollection { public static void main(String[] args) { ArrayList heros = new ArrayList(); // 初始化5个对象 for (int i = 0; i < 100; i++) { heros.add(new Hero("hero " + i)); } for (int i =heros.size(); i >=0; i--) { if(i%8==0){ heros.remove(i); } } System.out.println("ArrayList heros:\t" + heros); } }



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2022-11-18 用while,parseint,split
2022-07-15 给Hero类增加一个ID属性也可以实现
2022-05-31 所以为什么要一直纠结在用for上面呢,用while更方便


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 73 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 中级-集合框架-遍历 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图