美文网首页
二.Collection接口与抽象类

二.Collection接口与抽象类

作者: 蜗牛1991 | 来源:发表于2017-09-08 10:26 被阅读0次

    1.层次图

    image.png

    2.接口Collection

    • 提供集合类增删改查,遍历器基本方法接口


      image.png

    3.AbstractCollection<E>

    • 1.实现父接口isEmpty(), contains(Object o),toArray() , remove(Object o) ,addAll(Collection<? extends E> c) ,removeAll(Collection<?> c) ,retainAll(Collection<?> c),clear() 方法;
      2.等待子类重写实现方法:Iterator接口方法 (iterator(),hasNext(), next(),remove()),size(),add(E e)
    • 方法使用
      • 如何使用iterator()遍历集合
    public boolean removeAll(Collection<?> c) {
              ....
            Iterator<?> it = iterator();//得到集合的迭代器
            while (it.hasNext())//判断是否有下个元素 {
                if (c.contains(it.next()))//得到下个元素 {
                  .....
                }
            }
            return modified;
        }
        
    
    • 反射创建数组
     public <T> T[] toArray(T[] a) {
            // 若传入数组洗浴集合大小则反射创建集合大小的数组
            int size = size();
            T[] r = a.length >= size ? a :(T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);
            .....
    }
    
    image.png

    4.List与Set接口

    • LIst比Colllection增加以下方法


      image.png
    • Set只是继承了Colllection所有方法

    5.java 设计思想一:

    • 为什么接口Set与抽象类AbstractCollection方法相同,AbstractSet要实现Set和继承stractCollection,这样不是重复吗?
      • 抽象类体现了数据抽象的思想,是实现多态的一种机制。抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。 抽象类所跨域的是具有相似特点的类,而接口却可以跨域不同特点的类。对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。
      • 简单来说:AbstractCollection是实现父子继承关系与属性的,只能有一个。而Set是定义这个类的行为和方法,且定义的方法在类中必须实现。就像动物是AbstractCollection,老虎是AbstractSet,而吃饭这个行为是Set定义的,与老虎本身属性无关,因为人也可以吃饭。


        image.png

    6.AbstractList

    • 1.待子类重写的方法:List接口中的get(int index),set(int index, E element),add(int index, E element) ,remove(int index), size()。注意由于继承AbstractCollection,父类实现方法该抽象类已经自动继承。另本类已重写待子类重写的父类方法。
    image.png
    • 2.方法学习
      • 静态内部类
        使用时机:只在本类使用,构造内部类。
    public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
                          ......
        public Iterator<E> iterator() {
            return new Itr();
        }
        private class Itr implements Iterator<E> {
            //内部类方法调用
            public E next() {
                checkForComodification();
               //正常调用外部类方法,外部类调用内部类方法,内部类设为静态,或new内部类对象
                E next = get(i)
            }
                    ....
          final void checkForComodification() { }
      }
        private class ListItr extends Itr implements ListIterator<E> { }
    }
    
    • 重写equals方法与hashCode
       public boolean equals(Object o) {
            if (o == this)
                return true;
            if (!(o instanceof List))
                return false;
           return (this == o);
        }
        public int hashCode() {
            int hashCode = 1;
            for (E e : this){
                hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
            }
            return hashCode;
        }
    
    • 数组增删改查可用方法
            //1.要拷贝复制的原始数据
            //2.原始数据的读取位置(从原始数据哪个位置开始拷贝)
            //3.存放要拷贝的原始数据的目的地
            //4.开始存放的位置()
            //5.要读取的原始数据长度(拷贝多长)
      System.arraycopy(elementData, index+1, elementData, index, numMoved);
    
    • 迭代器的实现
    每一个迭代器保存cursor,lastRet,expectedModCount三个变量。
    cursor初始为0,对于每次调用next方法就增加一次,表示迭代的当前位置。
    lastRet:保存了每次跳过的元素的坐标,用于迭代remove操作;
    expectedModCount:记录这个迭代器对对象进行结构性修改的次数。这样每次迭代器进结构性修改的时候都将expectedModCount 和modCount进行对比,如果两种相等则说明没有其他迭代器修改了对象,可以进行。如果不相等则说明有迭代进行了修改,立刻抛出异常。
    

    7.AbstractSet

    • 1.等待子类重写实现方法:Iterator接口方法 (iterator(),hasNext(), next(),remove()),size(),contains(Object o),add(E e)
    • 2.重写方法:equels,hashcode,removeAll
    image.png

    相关文章

      网友评论

          本文标题:二.Collection接口与抽象类

          本文链接:https://www.haomeiwen.com/subject/qusijxtx.html