Iterator和LlistIterator迭代器的使用及底层原理:

1, Iterator:
(1). 使用
hasNext();返回一个boolearn值,判断有没有下一个
next();返回游标当前的指向对象,并且将游标指向下一个对象
remove();删除游标左面的元素,在next执行完之后该操作只能执行一次
注意点:
remove()使用之前必须要调用next()方法,而且remove()方法不能连续出现

//使用while实现迭代集合
Iterator<Integer> itea =list.iterator(); //获取得带器对象;
while (itea.hasNext()) {
    Integer value =itea.next();
    System.out.print(value+" ");
}
//使用for循环实现迭代
for( Iterator iter=list.iterator();iter.hasNext();) {
	String str1=(String)iter.next();
	System.out.println(str1);
}

注意点二:遍历Map稍有不同; 在获取迭代器对象时有些不同

//使用迭代器遍历map
Iterator iter=map.entrySet().iterator();
while(iter.hasNext()) {
	 Map.Entry e=(Entry) iter.next();
	 Object k=  e.getKey();
	 Object v=e.getValue();
	 System.out.println(k+"---"+ v);	
}

(2),主要方法分析:
boolean hasNext() 是否还有下一个元素

 public boolean hasNext() {
            return cursor != size;
        }

E next() 返回当前游标指向的元素,并将游标指向下一个元素

 public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

void remove() 删除当前游标指向元素左边的元素 (只能和next()方法配合使用)

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 ConcurrentModificationException();
            }
        }

(3)要点问题:
1,,解决并发异常的方法: checkForComodification()
集合会追踪修改(增删改查)的次数(modCount 又称版本号),每一个迭代器会单独立维护自己的计数器,在每次操作,检查版本号是否发生改变,如果个改变,就会抛出ConcurrentModificationException() 异常;
《java核心技术卷一 587页详解》
2 ,使用foreach遍历集合,实际上底层也是调用了迭代器

2, ListIterator:
(1) 使用:
注意点:
因为listinteator是继承iterator接口的,和Iterator相同。但是listiteator可以从后往前遍历集合,所以此类多了一些方法;
(2)特有方法:

 listIterator(int index)  //构造器,可以从指定下标处开始遍历
void add(E newelement)   //往当前位置的前面添加元素 
void set(E newelement)   //用新元素取代前面next()或者previous()返回的元素;
boolean hasPrevious()    //同hasNext(),判断是否有前一个元素
E previous()  //用法和next相同,返回当前元素,并把游标指向下一个元素
int previousIndex()  // 和previous()用法相同,只不过返回的是的该元素的下标
int nextIndsx()  //和next()用法相同,只不过返回的是的该元素的下标

(3)主要方法分析:
同iterator,原理相同;

迭代器总结:
迭代器使用于专门遍历集合,iteatore 实现的是iteator接口,listiterator实现的是 listinteator接口,但是listinteator接口又是继承与iterator的,所以两者有公用的方法,但是listiteator可是实现从后往前遍历以及添加元素和修改元素等操作,所以独有的方法,在使用中,遍历set和ArrayList的操作是相同的,遍历Map有一些不同而已,同时,在多线程方面,为了防止并发异常的发生,在操作前校验版本号(每个迭代器独立计数的修改次数),避免发生异常。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
string的迭代器实际实现原理如下: string的迭代器是一种随机访问迭代器,它是一个类似指针的对象,可以通过迭代器来访问string中的每个字符。string的迭代器实际上是一个指向char类型的指针,它重载了运算符,使得它可以像指针一样进行加减运算、比较运算等操作。 具体实现方式如下: 1. string的迭代器类型定义 ```c++ typedef char* iterator; typedef const char* const_iterator; ``` 2. string的迭代器实现 ```c++ iterator begin() noexcept { return &*data(); } const_iterator begin() const noexcept { return &*data(); } iterator end() noexcept { return begin() + size(); } const_iterator end() const noexcept { return begin() + size(); } ``` 其中,begin()函数返回一个指向string第一个字符的迭代器,end()函数返回一个指向string最后一个字符的下一个位置的迭代器。这里使用了指针运算符*和&,将string转换为char类型的指针,然后再进行运算。 3. string的迭代器操作 string的迭代器支持以下操作: - 迭代器加法和减法运算:迭代器可以进行加法和减法运算,例如it+1、it-1,表示迭代器向前或向后移动一个位置。 - 迭代器比较运算:迭代器可以进行比较运算,例如it1==it2、it1<it2,表示两个迭代器指向的位置是否相同,或者一个迭代器是否在另一个迭代器之前。 - 迭代器解引用运算:迭代器可以进行解引用运算,例如*it,表示获取迭代器指向的位置的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值