iterator的实现原理
1.iterator遍历linkedlist集合
Iterator li = list.iterator();
while(li.hasNext()){
System.out.println(li.next());
}
这里可以看见Iterator li = list.iterator();
public Iterator<E> iterator() {
return new Itr();
}
那么这个iterator()方法是在它的抽象父类中,通过new Itr();去实例化这个Iterator对象。
public boolean hasNext() {
return cursor != size();
}
这里cursor初始化值为0;
当cursor等于size的时候,hasNext返回false;
public E next() {
checkForComodification();
try {
int i = cursor;
E next = get(i);
lastRet = i;
cursor = i + 1;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
那么这里可以一个很关键的一点它使用的还是get方法。
Node<E> node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
那我们现在看看get()方法是怎么遍历Node的无论无论这个index是多少?它都从first开始,或者last,取决于index < (size >> 1),这是个很巧妙的设计。看看index是不是超过size的一般,选择从后first还是last,这时我们也可以找到链表结构查询慢的根本原因,在于无论这个size有多大它都需要从first后last开始查询。远远慢于使用索引的arraylist。
2.iterator遍历ArrayList集合
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
事实上iterator();是在Arraylist和linkedlist的共同抽象父类abstractList中,唯有get();实现不同,所以Arraylist查询的速度要远远高于LinkedList.
2.iterator遍历hushmap集合
add();
Iterator<String> map = map.keySet().iterator();
while(map.hasNext()){
System.out.println(map.next());
}
那么这里就是遍历key一种方法,map.keySet().iterator();下面来看keyset()方法
public Set<K> keySet() {
Set<K> ks;
return (ks = keySet) == null ? (keySet = new KeySet()) : ks;
}
这里是通过keysett对象这里来看keySet类的iterator()方法
public final Iterator<K> iterator() { return new KeyIterator(); }
这里就通过KeyIterator()方法实现了这个Iterator接口,这时候我们看KeyIterator()是如何重写这个next()方法的。
public final K next() { return nextNode().key; }
}
那么这里返回nextNode().key;现在来看nextNode()
final Node<K,V> nextNode() {
Node<K,V>[] t;
Node<K,V> e = next;
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
if (e == null)
throw new NoSuchElementException();
if ((next = (current = e).next) == null && (t = table) != null) {
do {} while (index < t.length && (next = t[index++]) == null);
}
return e;
}
这里就是遍历的核心内容,因为hashtable的关系,它的遍历需要判断table数组的链表中是否没有数据,如果没有数据而且table还没有到最大值,这时候我们的table数组下标加以1,开始遍历下一个数组,因为我们put一个对象时,它的存储方式完全根据对象的hashcode来存储的,本身它的取值是有顺序的,但是存储的时候是无序,所以取出来的数据也就没有顺序可言了。
map.values.iterator();
这里就很简单了,nextnode.key变成nextnode.value;
网上有人说遍历key和value的性能不一样,不知道为什么,看到这里,我认为性能是没有区别的。
关于hashSet的遍历
参照map.keyset().iterator();
iterator的实现原理的更多相关文章
- Java中Iterator(迭代器)实现原理
在Java中遍历List时会用到Java提供的Iterator,Iterator十分好用,原因是: 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结 ...
- Java集合之ArrayList和LinkedList的实现原理以及Iterator详解
ArrayList实现可变数组的原理: 当元素超出数组内容,会产生一个新数组,将原来数组的数据复制到新数组中,再将新的元素添加到新数组中. ArrayList:是按照原数组的50%来延长,构造一个初始 ...
- 迭代器Iterator的底层实现原理
第一步:没有接口的迭代器简单实现原理 package com.bjsxt.xiaofei; /** * 迭代器底层原理 * 方法: * hasNext() * next() * remove() * ...
- Iterator源码解读
//继承关系 public interface Inteator { boolean hasNext(); Object next(); } public interface Iterable { I ...
- List、Set集合系列之剖析HashSet存储原理(HashMap底层)
目录 List接口 1.1 List接口介绍 1.2 List接口中常用方法 List的子类 2.1 ArrayList集合 2.2 LinkedList集合 Set接口 3.1 Set接口介绍 Se ...
- Java | 集合(Collection)和迭代器(Iterator)
集合(Collection) 集合就是Java中提供的一种 空器,可以用来存储多个数据. 集合和数组都是一个容器,它们有什么区别呢? 数组的长度是固定的,集合的长度是可变的. 数组中存储的是同一类型的 ...
- cololection
package cn.bjsxt.col; /** * 简化迭代器原理 * hasNext * next * @author Administrator * */ public class MyArr ...
- 《算法》第二章部分程序 part 4
▶ 书中第二章部分程序,加上自己补充的代码,包括优先队列和索引优先队列 ● 优先队列 package package01; import java.util.Comparator; import ja ...
- java秀发入门到优雅秃头路线导航【教学视频+博客+书籍整理】
目录 一.Java基础 二.关于JavaWeb基础 三.关于数据库 四.关于ssm框架 五.关于数据结构与算法 六.关于开发工具idea 七.关于项目管理工具Mawen.Git.SVN.Gradle. ...
随机推荐
- Spring自学教程-ssh整合(六)
以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址 感谢您支持我的博客,我的动力是您的支持和关注!如若转载和使用请注明转载地址 ...
- mysql----ERROR 1040 (HY000): Too many connections
http://gwokae.mewggle.com/wordpress/index.php/archives/683 查看最大链接 mysql -h alg-db14 -u bfdroot -pqia ...
- 用OpenSSL生成自签名证书在IIS上搭建Https站点(用于iOS的https访问)
前提: 先安装openssl,安装有两种方式,第一种直接下载安装包,装上就可运行:第二种可以自己下载源码,自己编译.这里推荐第一种. 安装包:http://slproweb.com/products/ ...
- leetcode--011 copy list with random pointer
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA3UAAABjCAIAAACzC75sAAAMTElEQVR4nO3cyYHivBYG0D8n0nIojo ...
- VB.NET中网络编程的另一种方案----system.net中的HttpWebRequest类的使用
VB.NET中网络编程的另一种方案---- system.net中的HttpWebRequest类的使用 在VB.net中进行网络编程,除了我之前写的随笔中的使用WinHttp组件进行编程,还有另一种 ...
- 关于学习方法的借鉴和有关C语言学习的调查
专长的高超技能获取的成功经验 在游戏方面,我相对于大多数人来说可能更为出色.首先是我投入了大量的时间进行游戏:其次,我几乎每天都会看一会教学视频来模仿:最后应该还是跟个人的天赋有点关系. 如果把这个类 ...
- Zookeeper的基本概念
Reference: http://mp.weixin.qq.com/s?src=3×tamp=1477979201&ver=1&signature=bBZqNrN ...
- Django form模块使用心得
最近用Django 写了一个网站,现在来分享一下对Django form 的一些心得. 一,创建一个表单 创建一个Form表单有两种方式: 第一种方式是继承于forms.Form,的一个子类,通过在f ...
- java 读写excle
2014-04-16 20:38:20 java读写excel 晚上打算研究如何c来编写
- MySQL数据库面试
1. MySql的存储引擎的不同 特点 Myisam BDB Memory InnoDB Archive 存储限制 没有 没有 有 64TB 没有 事务安全 支持 支持 锁机制 表锁 页锁 ...