List,Set,Map学习笔记(1)

来源:互联网 发布:cf修复软件 编辑:程序博客网 时间:2024/06/04 18:14

最近自己研究了下jdk中set,list和map的底层源码,虽然有一些不太清楚,但是我会尽量全的分析每个方法的功能:

List:对于list的认识我是停留在集合上,也就是说,list是继承了collection接口的,作为list的父类,先简单介绍下这样理解起来好些,因为孩子总有点像爸爸嘛。

      Collection:Collection接口继承了Iterable接口,主要是为了表明集合是可以使用迭代器的,可以通过一个迭代器来访问集合中的元素。可以使用Collection直接制作迭代器:

                Collection<String> c=new ArrayList<>();
                c.add("1");
                c.add("2");
                c.add("3");
                Iterator<String> iterator=c.iterator();
                for(int i=0;i<3;i++){
                 if(iterator.hasNext()){
                  System.out.println(iterator.next());
                 }
                }//使用迭代器遍历字符串集合,输出集合中的元素

      对于Collection,迭代器是访问的工具,迭代器iterator主要有以下方法:

        hasNext()返回布尔值,如果当前元素的下一个元素不为空的话;

        next()将iterator移动到下一个元素(是不是觉得很像c语言里的指针);

        remove()移除当前元素,如果当前元素为空返回UnsupportedOperationException("remove");

        forEachRemaining(Consumer<? super E> action)这个方法研究的我要死了,首先说一下作用:为每一个剩下(留下的)的元素执行一个操作,操作我只知道使用 Lambda

        表达式可以进行操作, Lambda表达式举个例子 student->student.name="jyy",代表student代替的对象的名字属性赋值为jyy,具体指代什么对象则要看forEachRemaining(Consumer<? super E> action)中泛型Consumer<? super E>里的“?”是什么,<? super E>这个代表“?”所指代的对象不能是E对象的子类,只能是E或者E的父类。这个方法里的Consumer不能为空否则跑出Object的NullPointerException,然后对于每一个对象,都执行Consumer传入的操作,值得一提的是,Consumer不能进行对象直接赋值给对象的操作,原因还没有相关参考,也许哪位大神能解决下。Consumer的accept函数最终接受执行操作的对象,这里就是next()。


    说完iterator再回到Collection,它主要有这么几个方法:

    size()返回集合大小

    isEmpty()集合为空返回false否则true

    contains(Object o)是否包含某一对象,包含返回true 否则false

    iterator()返回一个迭代器对象,用法如上所述

    toArray()返回一个Object数组,用来干点什么有可能方便

    toArray(T[] a)返回一个包含当前Collection的所有元素的,不包含别的元素的数组,a参数只要初始化了并且不为空就行

    add(E e)为集合在末尾添加一个元素e

    remove(Object o)移除一个当前元素o为要移除的元素

    containsAll(Collection<?> c)如果包含Collection返回true否则饭后false

    addAll(Collection<? extends E> c)将c集合添加到当前集合末尾,添加成功返回true,不成功返回false(添加不相同的对象时)

    removeAll(Collection<?> c)将集合c中存在的所有元素从本集合中移除

    removeIf(Predicate<? super E> filter)移除满足条件的对象,Pridicate一般也用Lambda表达式去写

    retainAll(Collection<?> c)保存当前集合在c集合中有的元素

    clear()清空集合

    equals(Object o)对象比较

    hashCode()返回哈希散列值

    spliterator()生成iterator的split版本,可将生成的元素交付多线程进行操作,具体实现方法将在本学习结束后进行研究

    stream()生成基于collection的顺序流

    parallelStream()生成基于collection的并行流

    最后三个方法在线程上会进一步学习。



    最后回到List上,List除了继承了Collection的所有方法还新增加了索引index因此有如下方法:

    addAll(int index, Collection<? extends E> c)在特定的位置添加Collection的全部对象

    get(int index)获取特定位置的E对象

    set(int index, E element)在特定位置

    add(int index, E element)在特定位置添加对象

    remove(int index)移除特定位置对象

    indexOf(Object o)获取第一个o对象的位置

    lastIndexOf(Object o)获取最后一个o对象的位置

    今天先写到这里因为后面有几个麻烦的方法需要解释,还会进一步解释Collection的流操作

    


0 1
原创粉丝点击