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的实现原理的更多相关文章

  1. Java中Iterator(迭代器)实现原理

    在Java中遍历List时会用到Java提供的Iterator,Iterator十分好用,原因是: 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结 ...

  2. Java集合之ArrayList和LinkedList的实现原理以及Iterator详解

    ArrayList实现可变数组的原理: 当元素超出数组内容,会产生一个新数组,将原来数组的数据复制到新数组中,再将新的元素添加到新数组中. ArrayList:是按照原数组的50%来延长,构造一个初始 ...

  3. 迭代器Iterator的底层实现原理

    第一步:没有接口的迭代器简单实现原理 package com.bjsxt.xiaofei; /** * 迭代器底层原理 * 方法: * hasNext() * next() * remove() * ...

  4. Iterator源码解读

    //继承关系 public interface Inteator { boolean hasNext(); Object next(); } public interface Iterable { I ...

  5. List、Set集合系列之剖析HashSet存储原理(HashMap底层)

    目录 List接口 1.1 List接口介绍 1.2 List接口中常用方法 List的子类 2.1 ArrayList集合 2.2 LinkedList集合 Set接口 3.1 Set接口介绍 Se ...

  6. Java | 集合(Collection)和迭代器(Iterator)

    集合(Collection) 集合就是Java中提供的一种 空器,可以用来存储多个数据. 集合和数组都是一个容器,它们有什么区别呢? 数组的长度是固定的,集合的长度是可变的. 数组中存储的是同一类型的 ...

  7. cololection

    package cn.bjsxt.col; /** * 简化迭代器原理 * hasNext * next * @author Administrator * */ public class MyArr ...

  8. 《算法》第二章部分程序 part 4

    ▶ 书中第二章部分程序,加上自己补充的代码,包括优先队列和索引优先队列 ● 优先队列 package package01; import java.util.Comparator; import ja ...

  9. java秀发入门到优雅秃头路线导航【教学视频+博客+书籍整理】

    目录 一.Java基础 二.关于JavaWeb基础 三.关于数据库 四.关于ssm框架 五.关于数据结构与算法 六.关于开发工具idea 七.关于项目管理工具Mawen.Git.SVN.Gradle. ...

随机推荐

  1. ice grid 完整部署过程

    待补充 一 理论准备 一个IceGrid集群有一个registry(注册表,用于定位)和多个node组成. IceGrid配置包括集群配置和应用配置: config.grid是集群配置,配置Regis ...

  2. window环境变量

    首先Window中有很多乱七八糟的路径变量之类的,归类下来有几类,主要是为了我们分清楚概念,以免搞的糊涂了. 1. Window系统的环境变量:顾名思义,就是系统级别的变量,或者利用我们编程的角度来讲 ...

  3. POJ3723最小生成树

    题意:从一个起点出发连接男孩子和女孩子,若是两者之间有连接的,则花费为10000-d,若是没有连接的则花费为10000 分析:很显然是一个最小生成树,但是我们希望的是d越大越好,因为d越大,10000 ...

  4. 【亲测】Python:解决方案:Python Version 2.7 required, which was not found in the registry

    好久不更新随笔了,今天因为数据可视化作业,想抓取一些人人网好友关系数据,于是开始尝试python,用到numpy模块,安装的时候提示: 'Python Version 2.7 required, wh ...

  5. UIP源码之ARP过程分析

    之前我们使用UIP实现了tcp和udp通讯今天来说说UIP的实现流程,当然,这篇文章里面只会涉及tcp和udp,暂时还没办法说DHCP,因为UIP的DHCP实现使用了协程的概念,下一章将协程之后再说D ...

  6. AppBarLayout学习笔记

    LinearLayout的子类 AppBarLayout要点: 功能:让子View(AppBar)可以选择他们自己的滚动行为. 注意:需要依赖CoordinatorLayout作为父容器,同时也要求一 ...

  7. Unable to list the users SQLSTATE =S0002

    powerdesinger mysql 反向工程时报错 解决方案: database ->change the Target DNMS 修改DBMS为mysql 的对应版本 修改后,点击确定即可 ...

  8. UVa 10716 - Evil Straw Warts Live

    题目大意:给一个字符串,判断是否能通过交换字母构成回文,如果能,计算所需的最小交换次数. 如果字符串中出现奇数次的字母的个数>1,则不能构成回文.然后...就没思路了...看网上说用贪心的思想先 ...

  9. scale等比缩放才能做到看上去能让线条以中心点展开

    .nav-menu>ul>li>a::before {  background: #333 none repeat scroll 0 0;  bottom: -2px;  conte ...

  10. 七 APPIUM Android 定位方式

    1.定位元素应用元素   1.1通过id定位元素 Android里面定位的id一般为resrouce-id: 代码可以这样写: WebElement element = driver.findElem ...