二.Collection接口与抽象类

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,559评论 18 399
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,483评论 0 3
  • 在经过一次没有准备的面试后,发现自己虽然写了两年的android代码,基础知识却忘的差不多了。这是程序员的大忌,没...
    猿来如痴阅读 2,821评论 3 10
  • 接口/抽象类意义规范、扩展、回调为其子类提供一个公共的类型 封装子类中得重复内容 定义抽象方法,子类虽然有不同的实...
    MigrationUK阅读 2,153评论 1 28
  • 题记:这世上最美妙的声音……这世上最珍贵的存在…… 呼 • 吸 在冥想者的掌心里,握着一粒沙,这是一段折叠的记忆,...
    穿越者木易君阅读 1,319评论 84 133