增强型for循环与集合
2018-07-24 07:53:15来源:博客园 阅读 ()
在python中对可迭代对象实现了__iter__方法。只要一个对象实现了__iter__方法,并返回一个迭代器,这个对象就是可迭代对象,就可以用for对其迭代。每次迭代的时候会调用迭代器__next__方法。在python中写如下代码
class A: def __iter__(self): print('.....iter........') return (i for i in ['1',2,4,'python','java',"c"] if type(i)==str) a = A() for i in a: print(i)
观察运行结果
会看到先输出了.....iter........,这是因为遇到for时python解释器会自动调用对象的__iter__方法,因此会看到该行输出
在java中是否有相同的概念?先看这一段代码
在代码中for语句加上断点。运行跟踪代码,执行到断点时发现果然跳到了LinkedList父类里面的iterator方法里面,在父类AbstractSequentialList方法里有调用了listIterator方法,接着到了LinkedList的自己中的listIterator方法
这样看来java中也有相同的概念,遇到for时jvm自动调用对象的iterator方法,该方法返回一个迭代器,每一次迭代都会调用该迭代器的next方法。
在LinkedList的listIterator方法中返回的是一个ListItr对象,这个对象其父类是一个ListIterator,ListIterator又继承 Iterator接口,因此ListItr是一个迭代器对象会有next方法。
查看iterator接口时发现这个接口没有iterator方法,那遇到for时jvm自动调用的谁itorator方法?查看LinkedList的一系列父类最终发现其超父类Collection里面有一个itorator方法
而Collection又继承了Iterable接口。
因此一个对象要能进行迭代必须实现Iterable接口,重写iterator方法,并且在该方法返回一个Iterator
package cn.itcast.jdk15; import java.util.Iterator; //自定一个类使用增强for循环 class MyList implements Iterable<String>{ Object[] arr = new Object[10]; int index = 0 ; //当前的指针 public void add(Object o){ arr[index++] = o; // 1 } public int size(){ return index; } @Override public Iterator<String> iterator() { return new Iterator<String>() { int cursor = 0; @Override public boolean hasNext() { return cursor<index; } @Override public String next() { return (String) arr[cursor++]; } @Override public void remove() { } }; } } public class Demo3 { public static void main(String[] args) { MyList list = new MyList(); list.add("张三"); list.add("李四"); list.add("王五"); for(String item :list){ System.out.println(item); } } }
在遍历HashMap的时候你想过为什么不能直接写这样的代码吗?
原因就是map和其超父类没有任何一个与Iterable接口有关系,map是不可直接迭代的,因为其本身或其超父类都没有实现或继承Iterable接口
到这你可以写一个类继承HashMap同时让这个类继承java.util.Iterable接口,改写HashMap,使其能够直接迭代,代码如下
public class MyHashMap<K,V> extends HashMap<K,V> implements Iterable { @Override public Iterator iterator() { return entrySet().iterator(); // return getIterator(); } // private Iterator getIterator(){ // return new mapIterator(); // } /** * 很多属性由于是默认访问权限,子类获取不到,因此该方式不可行 * */ // private final class mapIterator<E> implements Iterator<E>{ // Entry<K,V> next; // next entry to return // int expectedModCount; // For fast-fail // int index; // current slot // Entry<K,V> current; // current entry // // mapIterator() { // expectedModCount = modCount; // if (size > 0) { // advance to first entry // Entry[] t = table; // while (index < t.length && (next = t[index++]) == null) // ; // } // } // // public final boolean hasNext() { // return next != null; // } // // final Entry<K,V> nextEntry() { // if (modCount != expectedModCount) // throw new ConcurrentModificationException(); // Entry<K,V> e = next; // if (e == null) // throw new NoSuchElementException(); // // if ((next = e.next) == null) { // Entry[] t = table; // while (index < t.length && (next = t[index++]) == null) // ; // } // current = e; // return e; // } // // } public static void main(String[]args){ MyHashMap<String,String> map = new MyHashMap<>(); map.put("aa","a"); map.put("bb","b"); System.out.println(map.get("aa")); for(Object obj:map){ Map.Entry<String,String> e= (Map.Entry<String,String>)(obj); System.out.println(e.getKey()+":"+e.getValue()); } } }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 你说研究过Spring里面的源码,循环依赖你会么? 2020-06-09
- Spire.Cloud.SDK for Java 合并、拆分Excel单元格 2020-06-09
- switch循环所支持的数据类型 2020-06-07
- 500 ZuulException: Forwarding error 2020-06-01
- 第六章第三十七题(格式化整数)(Format an integer) - 编程 2020-05-26
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash