前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java-iterable和iterator的区别

java-iterable和iterator的区别

原创
作者头像
cg错过
修改于 2020-11-26 10:15:38
修改于 2020-11-26 10:15:38
58600
代码可运行
举报
文章被收录于专栏:程序笔记程序笔记
运行总次数:0
代码可运行

Iterable: 可迭代

Iterator: 迭代器

Iterable中包含Iterator

如部分源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Iterable<T> {
    /**
     * Returns an iterator over elements of type {@code T}.
     *
     * @return an Iterator.
     */
    Iterator<T> iterator();
    
    ...

而我目前遇到个问题就是需要将list转换成Iterable

代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.cgspace.tool;

import com.alibaba.fastjson.JSON;
import io.netty.handler.codec.http.cookie.Cookie;
import io.netty.handler.codec.http.cookie.DefaultCookie;
import org.junit.Test;

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Author: cg
 * Date: 2020/4/29 18:38
 */
public class DoTest {

	@Test
	public void doRun(){

		List<TCookie> tCookies = new ArrayList<>();
		tCookies.add(new TCookie(1, 2002));
		tCookies.add(new TCookie(2, 2004));
		tCookies.add(new TCookie(3, 2006));

		IterableCookie iterableCookie = new IterableCookie(tCookies);
		Iterator<TCookie> tCookieIter = iterableCookie.iterator();
		while(tCookieIter.hasNext()){
			TCookie tCookie = tCookieIter.next();
			System.out.println("MSG: " + JSON.toJSONString(tCookie, true));
		}
	}
}

class IterableCookie implements Iterable<TCookie>{

	private int length = 0;
	private List<TCookie> cookies = null;

	public IterableCookie(List<TCookie> cookies){
		this.cookies = cookies;
		this.length = cookies.size();
	}

	@Override
	public Iterator<TCookie> iterator() {
		return new Iter();
	}

	private class Iter implements Iterator<TCookie>{

		// 游标
		private int cursor = 0;

		private int lastRet = -1;

		@Override
		public boolean hasNext() {
			return cursor != length;
		}

		@Override
		public TCookie next() {
			int i = cursor;
			TCookie cookie = cookies.get(i);
			lastRet = i;
			cursor = i + 1;
			return cookie;
		}

		public void remove(){
			if(lastRet < 0){
				return;
			}
			if(lastRet < cursor){
				cursor --;
			}
			lastRet = -1;
		}
	}
}


class TCookie{

	public TCookie(int id, int code){
		this.id = id;
		this.code = code;
	}

	private int id;
	private int code;

	public int getId() {
		return id;
	}

	public int getCode() {
		return code;
	}

	public void setId(int id) {
		this.id = id;
	}

	public void setCode(int code) {
		this.code = code;
	}
}

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MSG: {
	"code":2002,
	"id":1
}
MSG: {
	"code":2004,
	"id":2
}
MSG: {
	"code":2006,
	"id":3
}

至于代码意思, 这里就不写了, 浪费时间

我的原则是, 不必要给未来的我写太多的注解, 因为未来的我不可能比现在的我差


网上解释

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Iterable

一个集合对象要表明自己支持迭代,能有使用foreach语句的特权,就必须实现Iterable接口,表明我是可迭代的!然而实现Iterable接口,就必需为foreach语句提供一个迭代器。
这个迭代器是用接口定义的 iterator方法提供的。也就是iterator方法需要返回一个Iterator对象。


Iterator

 包含3个方法: hasNext ,  next , remove。remove按需求实现,一般它很少用到,以至于Eclipse接口方法自动补全时,都忽略了remove放方法。

1、每次在迭代前   ,先调用hasNext()探测是否迭代到终点(本次还能再迭代吗?)。
2、next方法不仅要返回当前元素,还要后移游标cursor
3、remove()方法用来删除最近一次已经迭代出的元素
4、迭代出的元素是原集合中元素的拷贝(重要)
5、配合foreach使用


文章首发来自公众号: 程序员品

欢迎关注
欢迎关注

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java ConcurrentModificationException异常原因和解决方法
Boy类: public class Boy { // private String ID; private String name; private String age; public Boy() { } public Boy(String ID, String name, String age) { this.ID = ID; this.name = name; this.age = a
小小明童鞋
2018/06/13
2.4K0
Iterator 和 Iterable 差别和联系「建议收藏」
        Iterator模式是用于遍历集合类的标准訪问方法。它能够把訪问逻辑从不同类型的集合类中抽象出来,从而避免向client暴露集合的内部结构。
全栈程序员站长
2022/01/25
3350
海康威视一面:Iterator与Iterable有什么区别?
那天,小二去海康威视面试,面试官老王一上来就甩给了他一道面试题:请问 Iterator与Iterable有什么区别?小二差点笑出声,因为一年前,也就是 2021 年,他在《Java 程序员进阶之路》专栏上看到过这题😆。 PS:星标这种事,只能求,不求没效果,come on。《Java 程序员进阶之路》在 GitHub 上已经收获了 426 枚星标,小伙伴们赶紧去点点了,冲 500! https://github.com/itwanger/toBeBetterJavaer ---- 在 Java 中,我们对
沉默王二
2021/10/26
4190
海康威视一面:Iterator与Iterable有什么区别?
Java容器源码攻坚战--第一战:Iterator
基于java10.1 零、前言 如果想读读源码测试功力,或读读源码修养身心,或读读源码满足自虐倾向,我建议第一个类是:ArrayList 第一、常用----所以用法比较熟悉,看完源码你也会更明白如何去用 第二、相对简单----1595行代码,刨去注释的一大堆也没有太多,还是hold的住的 第三、还没想好 这篇并不是讲ArrayList,而是Iterator,它是容器以及映射中非常重要的一环 一、迭代器模式 提起设计模式,总是有种只知其形,难达其意的感觉,用三个字说就是高大上 迭代器模
张风捷特烈
2018/10/08
3950
Java容器源码攻坚战--第一战:Iterator
Java Iterator(迭代器)小笔记
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList和 HashSet 等集合。Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。
joshua317
2022/03/29
5890
Java Iterator(迭代器)小笔记
行为型-Iterator
迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。
acc8226
2022/05/17
6490
行为型-Iterator
Java迭代器
  Java集合框架的集合类,我们有时候称之为容器。容器的种类有很多种,比如ArrayList、LinkedList、HashSet...,每种容器都有自己的特点,ArrayList底层维护的是一个数组;LinkedList是链表结构的;HashSet依赖的是哈希表,每种容器都有自己特有的数据结构。
用户7353950
2022/05/10
5320
JDK源码解析之java.util.Iterator和java.lang.Iterable
iterator通过hasNext(),next()两个方法定义了对集合迭代访问的方法,而具体的实现方式依赖于不同的实现类,具体的集合类实现Iterator接口中的方法以实现迭代。
栗筝i
2022/12/01
5630
JDK源码解析之java.util.Iterator和java.lang.Iterable
Java迭代器Iterator
 之前我们实现了迭代器模式,很多编程语言实际上已经内置了迭代器类,比如Java就为我们实现了迭代器Iterator。我们首先来看Iterator中的源码。 通过JDK源码我们发现Iterator是一个接口,包含三个方法:hasNext、next、remove。 1 package java.util; 2 3 public interface Iterator<E> { 4 5 /** 6 *如果迭代器中还有元素则返回true 7 */ 8 boolean
用户1148394
2018/01/09
8760
Java迭代器Iterator
Java Iterable 与 Iterator
但实际中,我们不需要这么麻烦,因为所有collection都有一个iterator()方法,在JDK1.4之前这个方法定义在collection接口中的,因此所有collection都有这个方法。
desperate633
2018/08/22
3590
详解设计模式:迭代器模式
迭代器模式(Iterator Pattern)也被称为游标模式(Cursor Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。是一种最简单也最常见的设计模式。
栗筝i
2022/12/05
5300
详解设计模式:迭代器模式
Iterator在ArrayList中的源码实现
获取迭代器 List<LinkedHashMap> list = new ArrayList<>(); Iterator iterator = list.iterator(); iterator()方法实现 public Iterator<E> iterator() { return new Itr(); } Itr 源码 /** * An optimized version of AbstractList.Itr */ private class Itr imp
小小明童鞋
2018/06/13
1.1K0
16.迭代器模式设计思想
容器的种类有很多种,比如ArrayList、LinkedList、HashSet...
杨充
2024/11/25
1170
JDK1.8源码(五)——java.util.ArrayList 类
  关于 JDK 的集合类的整体介绍可以看这张图,本篇博客我们不系统的介绍整个集合的构造,重点是介绍 ArrayList 类是如何实现的。 1、ArrayList 定义 ArrayList 是一个用
IT可乐
2018/03/30
1.1K0
JDK1.8源码(五)——java.util.ArrayList 类
Java 迭代器Iterator的详解
为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator).
用户7886150
2021/04/23
6950
List中remove()方法的陷阱,被坑惨了!
Java的List在删除元素时,一般会用list.remove(o)/remove(i)方法。在使用时,容易触碰陷阱,得到意想不到的结果。总结以往经验,记录下来与大家分享。
好好学java
2021/10/09
6400
Java|如何正确地在遍历 List 时删除元素
最近在一个 Android 项目里遇到一个偶现的 java.util.ConcurrentModificationException 异常导致的崩溃,经过排查,导致异常的代码大概是这样的:
mzlogin
2024/04/30
3100
Java的Iterator迭代器类
迭代对于我们搞 Java 的来说绝对不陌生。我们常常使用 JDK 提供的迭代接口进行 Java 集合的迭代。
JavaEdge
2021/02/22
4800
并发修改异常ConcurrentModificationException详解
在多线程编程中,相信很多小伙伴都遇到过并发修改异常ConcurrentModificationException,本篇文章我们就来讲解并发修改异常的现象以及分析一下它是如何产生的。
终有救赎
2023/10/22
7740
并发修改异常ConcurrentModificationException详解
设计模式 | 行为型 | 迭代器模式
能在不暴露集合底层表现形式(数组、链表、树、图、跳表等)的情况下遍历集合中所有的元素。
被水淹没
2023/02/25
2760
设计模式 | 行为型 | 迭代器模式
相关推荐
Java ConcurrentModificationException异常原因和解决方法
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档