欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門(mén)教程網(wǎng)!

Java

當(dāng)前位置:主頁(yè) > 軟件編程 > Java >

如何實(shí)現(xiàn)java Iterator迭代器功能

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:Java|點(diǎn)擊: 次

這篇文章主要介紹了如何實(shí)現(xiàn)java Iterator迭代器功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

今天躺在床上忽然想到一個(gè)問(wèn)題,迭代器的代碼是如何實(shí)現(xiàn)的?
于是乎不由自主的爬起來(lái)敲兩行代碼。

List<String> list=new ArrayList<>(2);
    list.add("java");
    list.add("C#");
    Iterator<String> iterator=list.iterator();
    while (iterator.hasNext()){
      System.out.println(iterator.next());
    }

上面的代碼是java中很常見(jiàn)的一個(gè)迭代的功能。

于是自己也想要寫(xiě)一個(gè)泛型類(lèi),然后支持這種迭代的功能。

于是乎寫(xiě)了一個(gè)類(lèi)似ArrayList的動(dòng)態(tài)數(shù)組功能。

package a;

import javax.swing.text.html.HTMLDocument;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;

public class Gys<T>{
  private final static int default_capacity =10;
  private int endIndex =0;
  private Object[] elemts;

  public Gys() {
    this.elemts = new Object[default_capacity];
  }

  public T[] add(T t){
    if(elemts.length-1< endIndex){
      int newCapcti= default_capacity *2;
      elemts= Arrays.copyOf(elemts,newCapcti);
    }
    elemts[endIndex++]=t;
    return (T[])elemts;
  }

  public int size(){
    return endIndex;
  }

  public T get(int i){
    if(i< endIndex){
      return (T) elemts[i];
    }
    throw new RuntimeException("索引超出界限");
  }


  public static void main(String[] args) {
    Gys<Integer> gys=new Gys<>();
    gys.add(5);
    gys.add(45);
    System.out.println(gys.get(0));
    System.out.println(gys.get(1));    
  }
}

上面的代碼怎么都沒(méi)辦法實(shí)現(xiàn)Iterator的功能,在idea下怎么都點(diǎn)不出來(lái)Iterator的提示;
于是只能去翻閱jdk原碼。在ArrayList中看到如下的代碼。

在ArrayList中申明一個(gè)內(nèi)部類(lèi)Itr,并且繼承Iterator<E>這個(gè)接口,然后實(shí)現(xiàn)hasNext()和next()方法。
在定義一個(gè)方法專(zhuān)門(mén)獲取迭代器實(shí)例。

public Iterator<E> iterator() { return new Itr(); }

這才明白如何實(shí)現(xiàn)迭代器功能;

所以對(duì)上面的泛型代碼進(jìn)行改造。

package a;

import java.util.Arrays;
import java.util.Iterator;

public class Gys<T>{
  private final static int default_capacity =10;
  private int endIndex =0;
  private Object[] elemts;

  public Gys() {
    this.elemts = new Object[default_capacity];
  }

  public T[] add(T t){
    if(elemts.length-1< endIndex){
      int newCapcti= default_capacity *2;
      elemts= Arrays.copyOf(elemts,newCapcti);
    }
    elemts[endIndex++]=t;
    return (T[])elemts;
  }

  public int size(){
    return endIndex;
  }

  class Itr implements Iterator<T>{

    private int point;
    private int len;

    public Itr() {
      this.point=0;
      this.len=endIndex;
    }

    @Override
    public boolean hasNext() {
      return point<endIndex?true:false;
    }

    @Override
    public T next() {
      return (T) elemts[point++];
    }
  }

  public Iterator<T> iterator(){
    return new Itr();
  } 

  public T get(int i){
    if(i< endIndex){
      return (T) elemts[i];
    }
    throw new RuntimeException("索引超出界限");
  }


  public static void main(String[] args) {
    Gys<Integer> gys=new Gys<>();
    gys.add(5);
    gys.add(45);
    /*System.out.println(gys.get(0));
    System.out.println(gys.get(1));*/
    Iterator iterator= gys.iterator();
    while (iterator.hasNext()){
      System.out.println(iterator.next());
    }
  }
}

怎么樣、這個(gè)時(shí)候就可以對(duì)自己的泛型類(lèi)Gys實(shí)現(xiàn)迭代的功能了。

同時(shí)另一個(gè)疑問(wèn)也來(lái)了,和Iterator長(zhǎng)得異常相似的接口Iterable是干什么的?他和Iterator又是什么關(guān)系?

既然實(shí)現(xiàn)了迭代的功能,那么為什么foreach的語(yǔ)法無(wú)法實(shí)現(xiàn)了。

翻開(kāi)源碼看看。

源碼中可以看出Iterable接口提供了一個(gè)獲取迭代器的接口方法。那么又有哪些類(lèi)實(shí)現(xiàn)了接口呢?
使用idea的ctrl+h快捷鍵調(diào)出查看類(lèi)的全部繼承關(guān)系。

我們看到熟悉的Collection接口。

看到Colllection接口中并沒(méi)有實(shí)現(xiàn)這個(gè)接口,依然是一個(gè)接口方法。繼續(xù)向下追蹤

看到我們熟悉的ArrayList這個(gè)類(lèi)型實(shí)現(xiàn)了iterator方法。

從這個(gè)角度來(lái)看ArrayList中的iterator()方法不是空穴來(lái)風(fēng)的,他是通過(guò)繼承collection和Iterable這些接口而來(lái)的。
雖然我們上面的泛型類(lèi)實(shí)現(xiàn)了迭代的功能,但是學(xué)習(xí)了新知識(shí)后總要練練手,于是這個(gè)時(shí)候畫(huà)蛇添足的對(duì)上面的代碼繼續(xù)改造。

package a;

import java.util.Arrays;
import java.util.Iterator;

public class Gys<T> implements Iterable<T>{
  private final static int default_capacity =10;
  private int endIndex =0;
  private Object[] elemts;

  public Gys() {
    this.elemts = new Object[default_capacity];
  }

  public T[] add(T t){
    if(elemts.length-1< endIndex){
      int newCapcti= default_capacity *2;
      elemts= Arrays.copyOf(elemts,newCapcti);
    }
    elemts[endIndex++]=t;
    return (T[])elemts;
  }

  public int size(){
    return endIndex;
  }

  class Itr implements Iterator<T>{

    private int point;
    private int len;

    public Itr() {
      this.point=0;
      this.len=endIndex;
    }

    @Override
    public boolean hasNext() {
      return point<endIndex?true:false;
    }

    @Override
    public T next() {
      return (T) elemts[point++];
    }
  }  
  @Override
  public Iterator<T> iterator(){
    return new Itr();
  }


  public T get(int i){
    if(i< endIndex){
      return (T) elemts[i];
    }
    throw new RuntimeException("索引超出界限");
  }


  public static void main(String[] args) {
    Gys<Integer> gys=new Gys<>();
    gys.add(5);
    gys.add(45);
    /*System.out.println(gys.get(0));
    System.out.println(gys.get(1));*/
    Iterator iterator= gys.iterator();
    while (iterator.hasNext()){
      System.out.println(iterator.next());
    }
  }
}

實(shí)現(xiàn)了Iterable接口的類(lèi),都可以實(shí)現(xiàn)forEach功能。

其實(shí)forEache的寫(xiě)法最終還是會(huì)編譯成成迭代器的寫(xiě)法。

寫(xiě)到這想起來(lái)之前<<java編程的邏輯>>這本書(shū)上說(shuō)的對(duì)于接口的描述:

接口是用于給實(shí)現(xiàn)類(lèi)提供某種能力。

從這個(gè)例子中可以很清晰的理解這結(jié)論的準(zhǔn)確性:

  • Iterable:給實(shí)現(xiàn)類(lèi)提供一個(gè)獲取迭代器的能力。
  • Iterator:給實(shí)現(xiàn)類(lèi)提供迭代的能力。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

上一篇:Java返回分頁(yè)結(jié)果集的封裝代碼實(shí)例

欄    目:Java

下一篇:spring如何使用命名空間p簡(jiǎn)化bean的配置

本文標(biāo)題:如何實(shí)現(xiàn)java Iterator迭代器功能

本文地址:http://mengdiqiu.com.cn/a1/Java/8740.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有