• Java集合详解及List源码分析


    对于数组我们应该很熟悉,一个数组在内存中总是一块连续的存储空间,数组的创建使用new关键字,数组是引用类型的数据,一旦第一个元素的位置确定,那么后面的元素位置也就确定了,数组有一个最大的局限就是数组一旦创建,他的长度就是固定的,不可以进行更改,如果数组空间不够大,唯一的方法就是再创建一个大的数组,把原来的数组元素拷贝过去。

    为了使程序鞥狗方便的存储和操作数量不固定的数据,java加入了集合个概念,和数组最大的区别也就是长度可以改变,是一种动态的调整。

    在java中一共有三种集合分别是List,Set,Map,三种集合有着各自的特点:

    List(列表):集合中的每一个位置是按照索引位置放的,像一个柜子,一层一层的,可以有重复的元素,当我们想要取数据的时候,直接找对应的柜子的层号就可以找到,就是可以根据索引找到元素,是和数组最像的集合,

    Set(集):集合中的每一个元素都是不按顺序进行排列,这也决定了Set集合中没有重复的元素,像篮子里的鸡蛋,无序不重复。

    Map(映射):集合中的每一个元素都是按照键值对的方式存储,一个键对应一个值,键不可以重复,值可以重复,我们可以根据键找到值,也是无序的集合。

    接下来我们看看各个集合类继承和实现类

    我们常说的三种集合其实是三个接口,List和Set集合共同继承Collection这个父接口,Map集合是单独的一个接口,他们一共有六个实现类,List的实现类是LinkedList和ArrayList

    Set的实现类有HashSet和TreeSet,Map的实现类有HashMap和TreeMap


    我们先看ArrayList的源码:ArrayList的底层实现还是数组,只不过好多方法都封装好了,不用我们去写,看着好像一个可变长度的集合,在ArrayList的源码中有一个数组,构造方法及操作集合的方法都是对这个数组进行操作





    每次进行add添加元素操作时,都是把原来的元素复制到新的数组中,利用了System的arraycopy方法,这是native修饰的方法,数组的工具类Arrays中元素的复制也是利用了这个方法。

    LinkedList的底层是用链表实现的,关于链表和数组的区别,请看另一篇文章:单链表的插入,查找,删除       在这里详细讲了数组uhe链表的区别

    我们看到他的内部有一个内部类Node(节点),定义了前指针,尾指针

    所有的操作都是对节点进行操作,举两个方法例子:



  • 相关阅读:
    Ubuntu搭建flask服务器, 部署sklearn 机器学习模型
    Jupyter-notebook 显示图片的两种方法
    Linux多版本opencv指定 & CMake中 find_package()的原理解析
    使用C++调用pytorch模型(Linux)
    Arch / Manjaro Linux下 Opencv 编译 配置 查看
    获取路径下所有特定格式文件列表
    Pycharm相对路径
    opencv 与操作 bitwise_and
    vim学习
    opencv 旋转 点旋转 以及 逆旋转
  • 原文地址:https://www.cnblogs.com/duzhentong/p/7816557.html
Copyright © 2020-2023  润新知