集合的进阶,Collection、Iterator迭代器、增强for

集合类体系结构:

                                                                集合接口
Collection(单列)Map(双列)
List(元素可重复)Set(元素不可重复)
ArrayListLinkedListHashSetTreeSetHashMapTreeMap实现类

Collection由List和Set继承,但由于三者都是接口,接口无法创建对象,所以必须使用多态,且符合多态前提条件

注意:不管是继承还是实现,左边的类中有什么方法,只能调用什么方法

public class M12 {
    public static void main(String[] args) {
        //不管是继承还是实现,左边有什么方法,只能调用什么方法
        S s = new B();
        s.s();
        A a = new B();
        a.a();
        a.s();

        C c =new B();
        c.c();
        
        D d =new B();
        d.d();
        d.c();

    }
}

interface S {
    void s();
}

interface A extends S {
    void a();
}

class C {
    void c(){
        System.out.println("我是c");
    }
}

class D extends C{
    void d(){
        System.out.println("我是d");
    }
}

class B extends D implements A{

    @Override
    public void s() {
        System.out.println("我是s的接口重写");
    }

    @Override
    public void a() {
        System.out.println("我是a的接口重写");
    }


}

Collection成员方法:

boolean add(E e )添加元素
boolean remove( Object o )从集合中移除指定的元素
boolean removeif ( Object o )根据条件进行删除(会进行遍历)
void clear ( ) 清空集合
boolean contains ( Object o )判断集合中是否存在指定的元素
boolean isEmpty ( )判断集合是否为空
int size ( )集合长度,也就是集合中元素的个数

创建对象:Collection<String> s = new ArrayList();

调用方法:

s.removeif ( (String a) -> { return a.length() == 3 });

removeif底层会遍历集合,得到集合中的每一个元素

a依次表示集合中的每一个元素

就会把这每一个元素都到lambda表达式中去

如果返回的是true,则删除

如果返回的是false,则保留

Collection集合的遍历:

Iterator:迭代器,集合的专用遍历方式

Iterator<E> iterator() :返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引

即哪个集合调用迭代器Iterator,该迭代器就会指向调用它的集合的0索引

成员方法:

boolean hasNext()判断当前位置是否有元素可以被取出
E next()

获取当前位置元素,

并将迭代器对象移向下一个索引位置

注意事项:

public static void main(String[] args) {
        Collection<String> s = new ArrayList();
        s.add("a");
        s.add("b");
        s.add("b");
        s.add("b");
        s.add("c");
        s.add("d");

        Iterator<String> it = s.iterator();


        while (it.hasNext()) {
            String next = it.next();
            /*if (next.equals("b")){
                it.remove();
            }*/

            s.removeIf(n -> "b".equals(n));

        }
        System.out.println(s);
    }
}

此处报错:ConcurrentModificationException

原因:

s是集合对象,调用Iterator,生成it,it也是一个集合,但在被next()调用的过程中,it的元素和位置不能有变动,若有变动会抛ConcurrentModificationException

此处原因为 hasNext()和 next()配合本身就是遍历了,removeIf()本身也是遍历,且还包含删除,修改了s,因此报错

另外一个需要注意的异常是,NoSuchElementException,这个是超出索引范围,若next()的指针指完了所有的索引,下一个就是空了,此时必然报错,即报NoSuchElementException。所以由此可知为什么需要用hasNext()去配合使用了,当有元素的时候hasNext()会返回true,反之返回false,就可以使用while进行判断使用。

ConcurrentModificationException异常来自于ArrayList中(查api)

NoSuchElementException异常来自于Next()这个方法底层中(查api)

什么是ConcurrentModificationException?在哪些场景下会报该异常?http://t.csdn.cn/T1NRY

注意:Iterator和Iterable 是不一样的!!!!一个是子类一个是接口,ator是able的子类

增强for循环:

作用:简化数组和Collection集合的遍历

使用前提:

1.他是JDK5之后出现的,其内部原理是一个Iterator迭代器

2.实现Iterable接口的类才可以使用迭代器和增强for

public interface Collection<E> extends Iterable<E>

Collection继承了Iterable接口,可以使用增强for

public interface Map<K,V>

而Map没有继承Iterable,无法使用增强for

格式:

for(String s :list){

sout(s);

}

String为元素类型,s为每一个变量,list为数组或集合,代码块内可以对变量s进行使用

注意:

增强for修改集合的元素是修改不了的 例:{s = "q";}

原因:

for(String s :list){}-----------String中的s,是第三方变量,即新开辟的空间,指针原理和iterator一样,默认指向0索引,当0索引有值,就返回元素,元素被赋值给第三方s,然后指针指向下一个索引,此时第三方s,被代码块内的"q"赋值,此时修改的只是第三方变量,并未修改集合里的变量(元素)。若在for内打印s输出的都会是q,for外输出list集合,集合内容是不变的

快捷键:集合或数组名.for

总结:

在此之前一共学习了3种遍历方式:普通for、迭代器Iterator、增强for

1.如果需要操作索引,使用普通for循环

2.如果在遍历的过程中需要删除元素,请使用迭代器

3.如果仅仅想遍历,那么使用增强for

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值