Collection详解

新手,刚开始写。如果有没明白可以在下面评论哦,每天晚上下班回家都会在线。对文章结构和叙述请大家给予批评并且给出建议(最重要的一点)
文章中可点击的链接都是我自己写的。

本章主要包括
1 Collection简介
    1.1 Collection接口
    1.2 AbstractCollection抽象类
2 List简介
    2.1 List接口
    2.2 AbstractList抽象类
3 Set简介
    3.1 Set接口
    3.2 AbstractSet抽象类
4 Iterator
5 后续

  1. Collection简介
    首先我们先来看下Collection的类图


    异常庞大的Collection类图

    从类图中就可以看出来Collection在Java中有着举足轻重的地位。
    将类图放大到Collection的前几个层次你就会发现,Collection主要有两个分支:List和Set。


    重要分支

    1.1 Collection接口
    Collection是集合的高度抽象,定义了集合共有的操作
size():int //返回集合中的元素数量
isEmpty():boolean // 判断集合是否为空
contains(Object):boolean //判断集合是否包含此元素
toArray():Object[] //将集合转化为数组返回
toArray(T[]):T[] //返回指定元素类型的数组
add(E):boolean //添加元素,返回是否添加成功 E为泛型
remove(Object):boolean //删除元素,返回是否删除成功
containsAll(Colleaction<?>):boolean //是否包含此集合
addAll(Colleaction<? extents E>):boolean //添加集合
removeAll(Colleaction<? extents E>):boolean //删除集合
retainAll(Colleaction<?>):boolean //取集合的交集
clear() //清空集合
/** JDK1.8新增,以下方法都用default修饰。
  * default模糊了抽象类和接口的关系。用default修饰的方法可以不重写
  * 以下方法和特性另开新章节
  */
spliterator():Spliterator<E> //返回可分割迭代器,并发使用.
removeIf(Predicate<? super E>):boolean //指定条件删除
stream():Stream //返回流,相当于高级版的迭代器
parallelStream():Stream //可并行操作的流

containsAll和removeAll的误区
containsAll和removeAll不是删除子集。譬如源Collection是1,2,3待删除的是1,3。那么删除后会为2。


containsAll

removeAll和containsAll类似。
取并集的操作

@Test
    public void testRetainAll() {
        List<Integer> list = Arrays.asList(1, 2, 3);
        List<Integer> retain = Arrays.asList(1, 3);
        list.retainAll(retain);
        list.forEach(System.out::println);
    }

结果为2
请在评论区回答这里为什么是错误的。
1.2 AbstractCollection抽象类
AbstractCollection是对Collection的一些公用方法进行实现。
同时添加了一个常量

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

此常量是为了限制数组的长度防止内存溢出
containsAll源码

for (Object e : c)
            if (!contains(e))
                return false;
        return true;

从此出我们可以看出containAll不是判断子集,而是判断是否包含参数集合的所有元素

  1. List
    List继承Colleaction,中文叫做列表,元素可以重复,元素排列有序,线程不安全。
    顺序不是指排序而是你添加到时候是3,1,2的顺序添加,那么取出来的顺序也是3,1,2
    2.1 List接口
    在Collection原有的操作上添加了以下操作
get(int):E //获取索引位置的元素
set(int,E):E //在此索引位置将元素设置为E,也即是替换掉
add(int, E):void //在此索引位置上添加元素E
remove(int):E //删除指定索引位置上的元素并返回此元素
indexOf(Object):int //返回Object在元素上第一次出现的索引位置
lastIndexOf(Object):int //返回Object在元素上最后一次出现的索引位置
listInterator():ListInterator //返回列表迭代器,可以在迭代器中删除元素
listInterator(int): //返回指定开始位置的迭代器
subList(int form,int end): //返回List的视图,从From到end的位置  //在ArrayList一章中会解释,文章发布后会加一个链接

2.2 AbstractList抽象类
AbstractList添加了以下操作和一个变量

removeRange(int from,int end):void //删除from -- end范围内的元素
private rangeCheckForAdd(int):void //判断添加的索引位置是否合法。不合法则抛出IndexOutBoundsException异常
private outOfBoundsMsg(int):String  //返回异常的信息,int是非法的索引位置
modCount://变量 记录修改次数,当modCount不匹配的时候会抛出异常。
当然理想很丰满,在单线程的情况下modCount会及时失效。但是在多线程的时候由于内存不可见性会导致modCount的值不是最新值,因此会导致判断不准确。

还有四个内部类
Ltr:从左到右的列表迭代器
ListLtr extends Itr Implement ListIterator:可双向移动的列表迭代器
SubList extends AbstractList:列表试图
RandomAccessSubList extends SubList:可随机访问的列表试图
3 Set
Set继承Collection。中文叫做集合,元素不可以重复,元素排列是无序。
无序的含义是插入时的顺序和取出的顺序不相同,而不是按元素排序。

        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(3);
        set.add(2);
        set.forEach(System.out::println);

输出的结果为1,2,3。自动对元素进行排序。但是不能说它是有序的。
3.1 Set接口
没有增加任何操作
3.2 AstractSet抽象类
AbstractSet继承了AbstractCollection抽象类和Set接口。没有增加操作。

  1. Iterator
    Iterator是集合的迭代器,但是却有限制只能顺序移动。
hasNext():boolean //下一个索引位置是否有元素
next():E //返回下一个位置的元素
remove():void //删除操作。
/**JDK1.8新增*/
forEachRemaining(Consumer<? super E> action):

remove()源码

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

Iterator使用了迭代器模式

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

推荐阅读更多精彩内容

  •   在之前的学习中我们将Java的集合框架做了一个大致的分类,对集合的结构有一定的了解,现在便是由表及里,我们深入...
    卡农Canon阅读 367评论 0 1
  • 前言:一名iOS开发工程师,正在学习Android开发,期待各路大神指点和学习交流.学习交流讨论及资料获取请关注:...
    极客James阅读 4,375评论 0 5
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,362评论 0 4
  • 在经过一次没有准备的面试后,发现自己虽然写了两年的android代码,基础知识却忘的差不多了。这是程序员的大忌,没...
    猿来如痴阅读 2,827评论 3 10
  • 所谓生活,就从来不是简简单单的。 就如现在,刚毕业工作的小年轻,拿的薪水仅仅是刚刚养活自己,几乎不剩下什么。感觉买...
    我是甜不甩阅读 189评论 0 0