当前位置: 首页 > news >正文

Java中数组、集合、链表、队列的数据结构和优缺点和他们之间的区别

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Java中数组、集合、链表、队列的数据结构和优缺点和他们之间的区别


        集合与数组的区别
        个人分类: Java基础
        相同点:数组和集合类同是容器。
        不同点 :1.数组的长度是固定的,集合的长度是可变的。
        2.数组只能存储同类型的对象,集合可以存储不同类型的对象。
        3.集合只能存储对象不能存储基本类型

        数组:
        .长度固定
        .可以存储基本类型,也可以存储引用类型
        .存储元素类型一致
        数组可以在内存中连续存储多个元素的构造,在内存中的分配也是连续的
        数组中的元素通过数组的下标进行访问的,下标从0开始的
        优点 :
        按照索引查询元素速度快
        按照索引遍历数组方便
        缺点:
        数组的大小固定后就不能扩容了
        数组只能存储一种类型的数据
        添加,删除的操作慢,因为要移动其他的元素
        适用场景:
        频繁查询,对存储空间要求不大,很少增加和删除的情况

        集合:
        特点
        长度可变
        只可以存储引用类型
        可以存储多种类型

        List:有序、可以有重复的集合
        List 接口的三个典型实现:
        ①、List list1 = new ArrayList();
            底层数据结构是数组,查询快,增删慢;线程不安全,效率高
        ②、List list2 = new Vector();
            底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合
        ③、List list3 = new LinkedList();
            底层数据结构是链表,查询慢,增删快;线程不安全,效率高
            
        Set
        HashSet:要保证元素唯一性,需要覆盖掉Object中的equals和hashCode方法(因为底层是通过这两个方法来判断两个元素是否是同一个)。

        **TreeSet:**以二叉树的结构对元素进行存储,可以对元素进行排序。
        排序的两种方式:
        1、元素自身具备比较功能,元素实现Comparable接口,覆盖compareTo方法。
        2、建立一个比较器对象,该对象实现Comparator接口,覆盖compare方法,并将该对象作为参数传给TreeSet的构造函数(可以用匿名内部类)。
        Map接口其特点是:元素是成对出现的,以键和值的形式体现出来,键要保证唯一性:常用类有:HashMap,Hashtable ,TreeMap。
        HashMap:线程不安全等的,允许存放null键null值。
        Hashtable:线程安全的,不允许存放null键null值。
        TreeMap:可以对键进行排序(要实现排序方法同TreeSet)。

        链表:
        通过一个链子把多个结点(元素)连接起来,由数据和地址组成的一个元素,
        节点本身必须有一个地址值(就是下一个元素的地址值)
        优点:
        链表是很常用的一种数据结构,不需要初始化容量,
        可以任意加减元素;
        添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,
        所以添加,删除很快;
        缺点:
        因为含有大量的指针域,占用空间较大;
        查找元素需要遍历链表来查找,
        非常耗时。
        适用场景:
        数据量较小,需要频繁增加,删除操作的场景

        队列:
        是一种先进先出的数据构造,也是运算受限制的线性表,只可以在对头删除元素,在队尾插入元素
        线性表是同一类型数据的一个有限序列
        元素之间的先后排列次序蕴涵着其线性关系。线性表中的第一个元素a1称为表头元素,an称为表尾元素
        队列可以分为顺序队列和链式队列,根据不同的存储方式,定义的结构也不同。
        顺序队列包含一个数组成员,有二端包含一个数组成员 我们把删除一端叫头
        插入一端叫尾
        链接存储的有序线性表类需要继承链接线性表类LinkList和实现有序线性表接口SortedList

        区别:
        1.占用的内存空间
        链表存放的内存空间可以是连续的,也可以是不连续的,数组则是连续的一段内存空间。一般情况下存放相同多的数据数组占用较小的内存,而链表还需要存放其前驱和后继的空间。
        2.长度的可变性
        链表的长度是按实际需要可以伸缩的,而数组的长度是在定义时要给定的,如果存放的数据个数超过了数组的初始大小,则会出现溢出现象。
        3.对数据的访问
        链表方便数据的移动而访问数据比较麻烦;数组访问数据很快捷而移动数据比较麻烦。
        链表和数组的差异决定了它们的不同使用场景,如果需要很多对数据的访问,则适合使用数组;如果需要对数据进行很多移位操作,则设和使用链表。

转载于:https://my.oschina.net/demons99/blog/2963022

相关文章:

  • Django的模板系统
  • 深入理解Emoji(二) —— 字节序和BOM
  • 防止系统锁屏-python、C++实现
  • 意见汇总
  • 如何在vue项目中优雅的使用SVG
  • this 指向问题
  • 「BZOJ1385」「Baltic2000」Division expression 解题报告
  • IBM提出8位深度网络训练法,提速4倍同时保持高精度
  • shell脚本中 [-eq] [-ne] [-gt] [-lt] [ge] [le]
  • PEM_密钥对生成与读取方法
  • nginx 根据域名和地址跳转
  • go语言渐入佳境[11]-function2
  • (三)从jvm层面了解线程的启动和停止
  • Apache https
  • 项目实战-Api的解决方案
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 77. Combinations
  • Angular数据绑定机制
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PAT A1092
  • Python利用正则抓取网页内容保存到本地
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Vue实战(四)登录/注册页的实现
  • windows下mongoDB的环境配置
  • 基于组件的设计工作流与界面抽象
  • 聚簇索引和非聚簇索引
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • Linux权限管理(week1_day5)--技术流ken
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​configparser --- 配置文件解析器​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $.proxy和$.extend
  • (1)(1.13) SiK无线电高级配置(五)
  • (二)springcloud实战之config配置中心
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET MVC 验证码
  • .NET分布式缓存Memcached从入门到实战
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • /proc/vmstat 详解
  • @SuppressWarnings(unchecked)代码的作用
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [daily][archlinux][game] 几个linux下还不错的游戏
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分
  • [fsevents@^2.1.2] optional install error: Package require os(darwin) not compatible with your platfo
  • [Google Guava] 1.1-使用和避免null
  • [JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别
  • [jquery]this触发自身click事件,当前控件向上滑出
  • [js]js设计模式小结
  • [LeeCode]—Wildcard Matching 通配符匹配问题
  • [linux学习]apt-get参数解析
  • [LWC小知识] 标准lightning-input-field怎么取得变更值(onchange)
  • [NISACTF 2022]easyssrf
  • [Node + Docker] 聊聊怎么把 nodeclub 构建成 Docker 镜像