集合的其他内容1

Iterator

  • Iterator专门为遍历集合而生,集合没有提供专门遍历的方法。
  • Iterator实际上是迭代器设计模式的实现。
  • Iterator的常用方法:
    1.boolean hasNext():判断是否存在另一个可访问的元素。
    2.Object next():返回要访问的下一个元素。
    3.void remove():删除上次访问返回的对象。
  • 哪些集合可以使用Iterator遍历:
    1.层次1:Collection、List、Set可以,Map不可以。
    2.层次2:提供iterator()方法的就可以将元素交给Iterator。
    3.层次3:实现Iterator接口的集合类都可以使用迭代器遍历。
  • for-each循环和Iterator的联系:
    1.for-each循环遍历集合时,底层使用的是Iterator。
    2.凡是可以使用for-each循环遍历的,也可以使用Iterator遍历。
  • for-each循环和Iterator的区别:
    1.for-each还能遍历数组,Iterator只能遍历集合。
    2.使用for-each循环遍历集合元素时,不能删除元素,会抛出异常ConcurrentModificationException;使用Iterator遍历集合时能删除元素。
  • Iterator是一个接口,它的实现类在哪里?
    在相应的集合实现类中,比如ArrayList中存在一个内部Itr implemens Iterator
  • 为什么Iterator不设计成一个类,而是一个接口?
    不同的集合类,底层接口不同,迭代的方式不同,所以提供一个接口,让相应的实现类来实现。
package com.bjsxt.iterator;

import java.util.ArrayList;
import java.util.Iterator;

public class TestIterator {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("JavaSE");
        list.add("JavaEE");
        list.add("MySQL");

        //Exception in thread "main" java.util.ConcurrentModificationException
//        for (String elem:list
//             ) {
//            if (elem.equals("JavaSE")) {
//                list.remove(elem);
//            }
//        }
        System.out.println(list);
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String elem= it.next();
            if ("JavaSE".equals(elem)) {
//                list.remove(elem);
                it.remove();//用来删除当前遍历的元素
            }
        }
        System.out.println(list);
    }
}

  • Iterator到底是怎么工作的?
    不同集合的遍历有Iterator的不同的实现类完成,以Iterator遍历ArrayList为例进行说明:
public Iterator<E> iterator() {
    return new Itr();
}
private class Itr implements Iterator<E> {
    int cursor;      
    int lastRet = -1;   
    public boolean hasNext() {
        return cursor != size;
    }
    public E next() {
       int i = cursor;
       Object[] elementData = ArrayList.this.elementData;
       cursor = i + 1;
        return (E) elementData[lastRet = i];
    }
}

在这里插入图片描述

ListIterator

  • ListIterator和Iterator的关系:
    1.public interface ListIterator<> extends Iterator<>
    2.都可以遍历List
  • ListIterator和Iterator的区别:
    1.使用范围不同:
    (1)Iterator可以应用更多集合,Set、List和这些集合的子类型。
    (2)ListIterator只能用于List及其子类型。
    2.遍历顺序不同:
    (1)Iterator只能从前往后遍历,而ListIterator还可以逆序向前遍历。
    (2)Iterator可以在遍历的过程中remove();ListIterator可以在遍历的过程中remove()、add()、set()。
    3.ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
package com.bjsxt.iterator;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

public class TestListIterator {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("JavaSE");
        list.add("JavaEE");
        list.add("MySQL");

        ListIterator<String> it = list.listIterator();
        while (it.hasNext()) {
            String elem = it.next();
            System.out.println(elem+" "+it.nextIndex()+" "+it.previousIndex());
        }
        System.out.println("===========================================");
        while (it.hasPrevious()) {
            String elem=it.previous();
            System.out.println(elem+" "+it.nextIndex()+" "+it.previousIndex());
        }
    }
}

Collections工具类

  • 关于集合操作的工具类,好比Arrays,Math。
  • 唯一的构造方法private,不允许在类的外部创建对象。
  • 提供了大量的static方法,可以通过类名直接调用。
示例:使用Collections简化集合操作
package com.bjsxt.collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestCollections {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList();
        List<Integer> list1 = new ArrayList();
        System.out.println(list);
        Collections.addAll(list, 32, 22, 55, 66);
        System.out.println(list);

        //排序
        Collections.sort(list);
        System.out.println(list);

        //查找:必须自然有序
        int index = Collections.binarySearch(list, 32);
        System.out.println(index);

        //最大值 最小值
        int max = Collections.max(list);
        int min = Collections.min(list);
        System.out.println(max+" "+min);

        //填充
//        Collections.fill(list,100);//[100, 100, 100, 100]
        System.out.println(list);

        //复制
        Collections.addAll(list1, 2, 3, 4, 5,6,7,8);
        System.out.println(list1);
        Collections.copy(list1,list);
        System.out.println(list1);

        //同步
        //第一代集合类:Vector、HashTable  线程安全,效率低
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值