當前位置:首頁 » 操作系統 » iterator源碼

iterator源碼

發布時間: 2022-05-08 18:47:06

『壹』 java iterator循環遍歷集合(比如HashSet)的原理

Iterator<String> it = set.iterator() 這時得到一個迭代器,它的指針位於第一個元素之前。
然後我們不停地 hasNext() 再 next 得到值,當hasNext 為 false 時當然就不能去 next 了。

這背後的位置索引是在迭代器內部記錄著的,我們不能直接改它的值,只能 next 去下一個。
不過像 ListIterator 則是雙向的,可以 previous。遞增遞減都是由 next / previous 方法來操作的。

『貳』 為什麼iterator這個借口在while循環中可以直接調方法

這里是從你使用的集合里產生的Iterator對象,一般集合類型的對象都會有個實現了Iterator介面的內部類,

至於為什麼可以在循環哩直接調用。。。。iterator就是遍歷器,設計的就是要在循環中獲取集合中的元素用的。所以可以在循環哩直接調用。

自己多看看源碼

『叄』 java的collection介面中的iterator方法問題。

感覺上你對Collection介面和Iterator介面理解上很模糊,你實現了Iterator介面中方法,而你用Collection的介面對象C調用c.add(object)方法添加了Name對象,那麼你在調用c.iterator()方法的時候實際上在運行的時候是Name對象在調用iterator()方法,返回值當然是Name對象了。至於你說的使用iterator介面引用name對象,我不知道你為什麼要這么做?能不能詳細點 或者是把你想實現的功能說下?

『肆』 在編程中,迭代和循環得區別!

public interface Iterator<E>

對集合進行迭代的迭代器。
迭代器代替了 Java Collections Framework 中的 Enumeration 。迭代器與枚舉有兩點不同:

1.迭代器允許調用方利用定義良好的語義在迭代期間從迭代器所指向的集合移除元素。

2.方法名稱得到了改進.

簡單來說.就是迭代器做了一層封裝.讓操作集合更加方便.以下兩段源碼可以看出區別:
List <String> sl=new ArrayList<String>();

sl.add("aa");

sl.add("bb");

sl.add("cc");

sl.add("dd");

for(String s : sl){

System.out.println(s);

sl.remove(s);

}
在運行的過程中,會拋出 java.util. ,也就是說,在循環的過程中,是不允許刪除 Collaction 中的元素的。

要在迭代的過程中,刪除某些元素,則必須按照下面的寫法:
for(Iterator it=sl.iterator();it.hasNext();){

System.out.println(it.next());

it.remove();

}

『伍』 java iterator方法

iterator方法是JDK提供的迭代介面進行Java集合的迭代。

Iterator iterator = list.iterator();
while(iterator.hasNext()){
String string = iterator.next();
//do something
}

迭代其實我們可以簡單地理解為遍歷,是一個標准化遍歷各類容器裡面的所有對象的方法類,它是一個很典型的設計模式。Iterator模式是用於遍歷集合類的標准訪問方法。它可以把訪問邏輯從不同類型的集合類中抽象出來,從而避免向客戶端暴露集合的內部結構。 在沒有迭代器時我們都是這么進行處理的。如下:
對於數組我們是使用下標來進行處理的:

int[] arrays = new int[10];
for(int i = 0 ; i < arrays.length ; i++){
int a = arrays[i];
//do something
}

對於ArrayList是這么處理的:

List<String> list = new ArrayList<String>();
for(int i = 0 ; i < list.size() ; i++){
String string = list.get(i);
//do something
}

對於這兩種方式,我們總是都事先知道集合的內部結構,訪問代碼和集合本身是緊密耦合的,無法將訪問邏輯從集合類和客戶端代碼中分離出來。同時每一種集合對應一種遍歷方法,客戶端代碼無法復用。 在實際應用中如何需要將上面將兩個集合進行整合是相當麻煩的。所以為了解決以上問題,Iterator模式騰空出世,它總是用同一種邏輯來遍歷集合。使得客戶端自身不需要來維護集合的內部結構,所有的內部狀態都由Iterator來維護。客戶端從不直接和集合類打交道,它總是控制Iterator,向它發送"向前","向後","取當前元素"的命令,就可以間接遍歷整個集合。
上面只是對Iterator模式進行簡單的說明,下面我們看看Java中Iterator介面,看他是如何來進行實現的。
一、java.util.Iterator
在Java中Iterator為一個介面,它只提供了迭代了基本規則,在JDK中他是這樣定義的:對 collection 進行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration。迭代器與枚舉有兩點不同:
1、迭代器允許調用者利用定義良好的語義在迭代期間從迭代器所指向的 collection 移除元素。
2、方法名稱得到了改進。
其介面定義如下:
public interface Iterator {
boolean hasNext();
Object next();
void remove();
}

其中:
Object next():返回迭代器剛越過的元素的引用,返回值是Object,需要強制轉換成自己需要的類型
boolean hasNext():判斷容器內是否還有可供訪問的元素
void remove():刪除迭代器剛越過的元素
對於我們而言,我們只一般只需使用next()、hasNext()兩個方法即可完成迭代。如下:
for(Iterator it = c.iterator(); it.hasNext(); ) {
Object o = it.next();
//do something
}

前面闡述了Iterator有一個很大的優點,就是我們不必知道集合的內部結果,集合的內部結構、狀態由Iterator來維持,通過統一的方法hasNext()、next()來判斷、獲取下一個元素,至於具體的內部實現我們就不用關心了。但是作為一個合格的程序員我們非常有必要來弄清楚Iterator的實現。下面就ArrayList的源碼進行分析分析。
二、各個集合的Iterator的實現
下面就ArrayList的Iterator實現來分析,其實如果我們理解了ArrayList、Hashset、TreeSet的數據結構,內部實現,對於他們是如何實現Iterator也會胸有成竹的。因為ArrayList的內部實現採用數組,所以我們只需要記錄相應位置的索引即可,其方法的實現比較簡單。
2.1、ArrayList的Iterator實現
在ArrayList內部首先是定義一個內部類Itr,該內部類實現Iterator介面,如下:
private class Itr implements Iterator<E> {
//do something
}

而ArrayList的iterator()方法實現:
public Iterator<E> iterator() {
return new Itr();
}

所以通過使用ArrayList.iterator()方法返回的是Itr()內部類,所以現在我們需要關心的就是Itr()內部類的實現:
在Itr內部定義了三個int型的變數:cursor、lastRet、expectedModCount。其中cursor表示下一個元素的索引位置,lastRet表示上一個元素的索引位置
int cursor;
int lastRet = -1;
int expectedModCount = modCount;

從cursor、lastRet定義可以看出,lastRet一直比cursor少一所以hasNext()實現方法異常簡單,只需要判斷cursor和lastRet是否相等即可。
public boolean hasNext() {
return cursor != size;
}

對於next()實現其實也是比較簡單的,只要返回cursor索引位置處的元素即可,然後修改cursor、lastRet即可,

public E next() {
checkForComodification();
int i = cursor; //記錄索引位置
if (i >= size) //如果獲取元素大於集合元素個數,則拋出異常
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ();
cursor = i + 1; //cursor + 1
return (E) elementData[lastRet = i]; //lastRet + 1 且返回cursor處元素
}

checkForComodification()主要用來判斷集合的修改次數是否合法,即用來判斷遍歷過程中集合是否被修改過。在java提高篇(二一)-----ArrayList中已經闡述了。modCount用於記錄ArrayList集合的修改次數,初始化為0,,每當集合被修改一次(結構上面的修改,內部update不算),如add、remove等方法,modCount + 1,所以如果modCount不變,則表示集合內容沒有被修改。該機制主要是用於實現ArrayList集合的快速失敗機制,在Java的集合中,較大一部分集合是存在快速失敗機制的,這里就不多說,後面會講到。所以要保證在遍歷過程中不出錯誤,我們就應該保證在遍歷過程中不會對集合產生結構上的修改(當然remove方法除外),出現了異常錯誤,我們就應該認真檢查程序是否出錯而不是catch後不做處理。
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ();
}

對於remove()方法的是實現,它是調用ArrayList本身的remove()方法刪除lastRet位置元素,然後修改modCount即可。

public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();

try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ();
}
}

這里就對ArrayList的Iterator實現講解到這里,對於Hashset、TreeSet等集合的Iterator實現,各位如果感興趣可以繼續研究,個人認為在研究這些集合的源碼之前,有必要對該集合的數據結構有清晰的認識,這樣會達到事半功倍的效果!!!!

『陸』 java Iterator<E>的問題

java.util包里關於List有很多的對應的實現,Iterator是為了滿足遍歷的需求寫的一個介面。因為相關的內容很多,而且大體都是一個模式,所以我舉例說明。

在你這里採用了ArrayList來實例化一個List,所以對應的Iterator介面是在ArrayList里實現的。
我們可以找一下jdk源代碼:
public class ArrayList<E> extends AbstractList<E>
AbstractList<E> extends AbstractCollection<E>
AbstractCollection<E> implements Collection<E>
Collection<E> extends Iterable<E>

終於找到了這個,我們確定了,ArrayList對於Iterable的實現是在AbstractCollection這一層實現了Iterable介面。而這個介面的內容是:public interface Iterable<T> {

/**
* Returns an iterator over a set of elements of type T.
*
* @return an Iterator.
*/
Iterator<T> iterator();
}
具體的實現在ArrayList這個類里,
private class Itr implements Iterator<E>
你可以找源代碼看一下,這個內部類實現了Iterator的所有內容。

到這里,你肯定已經明白了,實際上並不是沒有實現,只是實現的過程比較曲折了一些。

這里,JDK在實現上採用了Iterator模式,這個模式的大體意義是讓被遍歷體與遍歷的具體實現分離,只要實現Iterable介面即可通過得到一個Iterator來完成遍歷。具體的內容你可以上網再搜搜看。

『柒』 我想查看iterator這個類的源代碼,在java的eclipse中如何實現,還有system

Iterator的源碼就在src.zip里.

『捌』 對c++ 中Iterator的疑惑

Iterator是訪問器,類似與指針,具有指針相似的功能,訪問器最重要的是給所有容器提供了一個通用的訪問方法,Iterator是模板類,比如有個vector
std::vector<int> vec;
//元素操作之類的
std::vector<int>::iterator it=vec.begin();
while(it!=vec.end())
{//do something}
STL可以得到源代碼,比如VC中有部分源代碼,GCC代碼實現比較好閱讀,還有STL port項目之類的

『玖』 JSP中s:iterator這個標簽每頁顯示的數量 怎麼定義

給你段 我自己用的代碼,參考下,希望能幫到你。

public class SqaInfoMgtAction extends ActionSupport {
// Pager
private Pager pager = new Pager();
// 介面
private SqaDao ;
// 列表
private List<Sqa> list;
// 記錄總數
private Long total;
// 查詢對象
private String schname;
// 查詢值
private String schvalue;
// 新增
private String canNew;
// 查看
private String canView;
// 修改
private String canUpdate;
// 刪除
private String canDelete;

public String execute() throws Exception {
int iUserSize;
iUserSize = 0;
int offset;
offset = 0;

// ---------------------------------------------------------------------------------------
// 許可權校驗
String rightcodestr = "";
canNew = "0";
canView = "0";
canUpdate = "0";
canDelete = "0";

rightcodestr = ActionContext.getContext().getSession().get("rightcodestr").toString();
//log.info(rightcodestr);
// 新增
if(rightcodestr.indexOf("$" + "06*03*01" + "$") >= 0) {
canNew = "1";
}

// 查看
if(rightcodestr.indexOf("$" + "06*03*02" + "$") >= 0) {
canView = "1";
}

// 修改
if(rightcodestr.indexOf("$" + "06*03*03" + "$") >= 0) {
canUpdate = "1";
}

// 刪除
if(rightcodestr.indexOf("$" + "06*03*04" + "$") >= 0) {
canDelete = "1";
}
// ----------------------------------------------------------------------

if (schname == null && schvalue == null) {
schname = "";
schvalue = "";
}
else if (schname != null && !schname.equals("") && schvalue == null) {
schname = schname.trim();
schvalue = ActionContext.getContext().getSession().get("schvalue").toString();
}
else if (schname != null && schvalue != null) {
schname = schname.trim();
schvalue = schvalue.trim();
ActionContext.getContext().getSession().put("schvalue", schvalue);
}
else {
schname = "";
schvalue = "";
}

SchVo schvo = new SchVo();
schvo.setSchname(schname);
schvo.setSchvalue(schvalue);

offset = pager.getOffset();
list = .query(offset, 20, schvo);
total = .findCount(schvo);
return "success";
}

public Pager getPager() {
return pager;
}

public void setPager(Pager pager) {
this.pager = pager;
}

public SqaDao getDao() {
return ;
}

public void setDao(SqaDao ) {
this. = ;
}

public List<Sqa> getList() {
return list;
}

public void setList(List<Sqa> list) {
this.list = list;
}

public Long getTotal() {
return total;
}

public void setTotal(Long total) {
this.total = total;
}

public String getSchname() {
return schname;
}

public void setSchname(String schname) {
this.schname = schname;
}

public String getSchvalue() {
return schvalue;
}

public void setSchvalue(String schvalue) {
this.schvalue = schvalue;
}

public String getCanNew() {
return canNew;
}

public void setCanNew(String canNew) {
this.canNew = canNew;
}

public String getCanView() {
return canView;
}

public void setCanView(String canView) {
this.canView = canView;
}

public String getCanUpdate() {
return canUpdate;
}

public void setCanUpdate(String canUpdate) {
this.canUpdate = canUpdate;
}

public String getCanDelete() {
return canDelete;
}

public void setCanDelete(String canDelete) {
this.canDelete = canDelete;
}
}

<%@ page contentType="text/html; charset=gbk"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg"%>
<s:iterator value="list" id="vi" status="st">
<tr bgcolor="<s:if test="#st.molus(2)==0">#C0D9E6</s:if><s:else>#F8F8F8</s:else>">
<td width="20" height="20" align="left" class="txt_black">
<img src="../img/small.gif"><s:property value="#st.count"/>
</td>
<td width="100" height="20" align="left" class="txt_black">
<s:property value="sqaquestion"/>
</td>
<td width="100" height="20" align="left" class="txt_black">
<s:property value="sqakeyvalue"/>
</td>
<td width="40" height="20" align="left" class="txt_black">
<s:if test='canUpdate=="1"'>
<input type="button" name="btnmodify" value="<s:text name="button.modify"></s:text>" class="button_css" onclick="modifyEntry('<s:property value="sqaid"/>');">
</s:if>
</td>
<td width="40" height="20" align="left" class="txt_black">
<s:if test='canDelete=="1"'>
<input type="button" name="btndelete" value="<s:text name="button.delete"></s:text>" class="button_css" onclick="deleteEntry('<s:property value="sqaid"/>');">
</s:if>
</td>
</tr>
</s:iterator>
<tr bgcolor="#FFFFFF">
<td colspan="8" height="16" align="center" valign="top" bgcolor="#FFFFFF">
<!-- 分頁導航條begin -->
<pg:pager url="sqaInfoMgt.action" items="${total}" export="currentPageNumber=pageNumber" maxPageItems="20">
<pg:param name="schname" value="${schname}"/>
<pg:index export="pageCount,itemCount">
<span class="txt_black"><s:text name="page.text.no"></s:text><font color="red">${currentPageNumber}</font>/${pageCount}<s:text name="page.text.page"></s:text>
<s:text name="page.text.count"></s:text>${total}<s:text name="page.text.record"></s:text></span>
<pg:first export="firstPageUrl=pageUrl" unless="current">
<a href="<%= firstPageUrl%>"><img src="../img/btn_first.gif" border="0" title="<s:text name="page.text.first"></s:text>"></a>
</pg:first>
<pg:skip export="skipBackPageUrl=pageUrl" pages="<%= -20 %>">
<a href="<%= skipBackPageUrl%>"><img src="../img/btn_skipback.gif" border="0" title="<s:text name="page.text.back"></s:text>"></a>
</pg:skip>
<pg:prev export="prevPageUrl=pageUrl">
<a href="<%= prevPageUrl%>"><img src="../img/btn_prevpage.gif" border="0" title="<s:text name="page.text.previos"></s:text>"></a>
</pg:prev>
<pg:pages>
<span class="txt_black">
<%if (pageNumber == currentPageNumber) { %>
<b><%= pageNumber %> </b>
<%} else { %>
<a href="<%= pageUrl%>"><%= pageNumber %> </a>
<%} %>
</span>
</pg:pages>
<pg:next export="nextPageUrl=pageUrl">
<a href="<%= nextPageUrl%>"><img src="../img/btn_nextpage.gif" border="0" title="<s:text name="page.text.next"></s:text>"></a>
</pg:next>
<pg:skip export="skipForwardPageUrl=pageUrl" pages="<%= 20 %>">
<a href="<%= skipForwardPageUrl%>"><img src="../img/btn_skipforward.gif" border="0" title="<s:text name="page.text.forward"></s:text>"></a>
</pg:skip>
<pg:last export="lastPageUrl=pageUrl" unless="current">
<s:if test="%{total>0}">
<a href="<%= lastPageUrl%>"><img src="../img/btn_last.gif" border="0" title="<s:text name="page.text.last"></s:text>"></a>
</s:if>
</pg:last>
</pg:index>
</pg:pager>
<!-- 分頁導航條end -->
</td>
</tr>
</table>

『拾』 ostream_iterator<int>(cout, " ")這個語句裡面cout的源代碼是什麼怎樣實現輸出的

ostream_iterator是流迭代器。
流迭代器是標准模板庫中的。因此是類模板。
ostream_iterator<int>
指定了類型,就是迭代器讀寫的類型。
通過這個流迭代器可以把你要輸入的寫入到指定的流中。
cout就是指定的流。就是標准輸出。
可以改成一個輸出流就可以,比如一個文件。
通俗的一點說,你把它看成一個指向輸出流的指針。通過這個指針你可以把東西寫的輸出流中。
(v.begin(),v.end(),output);
這個意思就是說,把向量V中的數據放到cout輸出流中,通過流迭代器output.
ostream_iterator<int> output(cout ,"*");
這個的意思說,放到輸出流的時候,沒放一個整數,就末尾添加一個*.

熱點內容
db2資料庫別名 發布:2024-10-08 08:19:02 瀏覽:238
如何更換安卓系統時鍾 發布:2024-10-08 08:12:54 瀏覽:395
電腦創建伺服器軟體 發布:2024-10-08 08:12:47 瀏覽:475
如何防微信惡意找回密碼 發布:2024-10-08 08:01:58 瀏覽:812
aspnet存儲過程分頁 發布:2024-10-08 08:01:47 瀏覽:459
王者安卓怎麼拍高清視頻教程 發布:2024-10-08 07:57:04 瀏覽:262
酒吧燈光編程 發布:2024-10-08 07:52:42 瀏覽:7
別克英朗買15哪個配置好 發布:2024-10-08 07:43:38 瀏覽:236
android安裝sdk 發布:2024-10-08 07:42:41 瀏覽:328
qq空間音樂緩存 發布:2024-10-08 07:05:49 瀏覽:738