Java强化知识Day02----------集合的数据结构

数据结构

简单的介绍一下java里常用的数据结构

先进后出,后进先出(类似子弹的结构)
压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。
弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。

队列

队列:queue,简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。
同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除
先进先出(类似火车过山洞,一侧入,一侧出)

数组

数组:Array,是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素。就像是一排出租屋,有100个房间,从001到100每个房间都有固定编号,通过编号就可以快速找到租房子的人。
特点
查找元素快:通过索引,可以快速访问指定位置的元素
增删元素慢:每次曾删数组(因为数组的长度不可变),其实都会新建一个数组,再复制原数组来进行操作

链表

链表:linked list,由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时i动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。(我们常说的链表有单向链表和双向链表,这里先说单向)
特点
查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
增删元素快:增加元素:只需要修改连接下个元素的地址即可。

红黑树

红黑树是一种有意思的二叉树(二叉查找树)
红黑树:binary tree ,是每个结点不超过2的有序树(tree),类似于我们生活中的树结构,只是每个节点只有2个子节点。顶上的叫根结点,两边被称作“左子树”和“右子树”。
特点
提高搜索效率:红黑树的左节点比右节点小(左节点<根节点<右节点)

常用集合的数据结构特点

ArrayList集合
  • 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以 ArrayList 是最常用的集合。
  • ArrayList 内部是用 Object[]实现的,当我们 new 一个空参 ArrayList 的时候,系统内部使用了一个 new Object[10]数组(内存默认长度为10,size是获得逻辑长度,初始0),
  • add方法,如果集合的长度 s 等于数组的长度则重新分配新数组,重新分配数组的时候需要计算新分配内存的空间大小,分配当前长度一半(s/2)的长度
LinkedList集合
  • 集合数据存储的结构是链表结构。方便元素添加、删除的集合,适合一些添加与删除都处于首尾的操作,查询慢(从头到尾遍历)
HashSet集合
  • 所存储的元素是不可重复的,并且元素都是无序的,底层的实现其实是一个HashMap 支持,根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。使用哈希表结构
LinkedHashSet集合
  • 元素唯一,但是存储有序,底层结构采用哈希表+链表
HashMap
  • HashMap:基于哈希表实现。使用 HashMap 要求添加的键类明确定义了 hashCode()和 equals(),可以调优初始容量和负载因子,可以通过通过 hashcode 对其内容进行快速查找,非线程安全

这里简单的讲一下HashMap,因为该集合面试常常被问的比较多

  • 哈希表:数组+链表,我们将有限个数组,看做一个个桶,这些桶的编号就是key(键)的哈希值,当我们存储对象的时候,计算key的哈希值,找到对应的桶(数组位)存进去,如果发生哈希冲突(两个key的哈希值相同,则通过链表(单链表)的方式将数据一个一个挂起来,而到了JDK1.8之后,同一个位置的数据超过8个,则使用红黑树存储哈希冲突的数据)
  • 关于扩容:扩容方面涉及的点比较多,因为篇幅问题不在这里展开,后续有机会单独列一篇。不过如果真被面试问到了,可以答每次扩容都是2的幂,为什么要这么设计呢?因为在HashMap通过键的哈希值进行定位桶位置的时候,会调用下列方法:
    static int indexFor(int h, int length) {
        return h & (length-1);
    }
  • 可以看到这里是将哈希值h与桶数组的length-1(实际上也是map的容量-1)进行了一个位运算得出了对应的桶的位置,h & (length-1)。
    (java中%、/操作比&慢10倍左右,因此采用&运算会提高性能。)
LinkedHashMap

存储有序,链表+哈希表结构,他是 HashMap 的子类

TreeMap
  • 基于红黑树实现。TreeMap 没有调优选项,因为该树总处于平衡状态。TreeMap 中所有的元素都保持着某种固定的顺序,如果需要得到一个有序的结果就应该使用TreeMap,线程安全
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单片微型计算机(MCU)经过多年的发展,在性能上有很大的进步,在型号上发展到上千种类,已经广泛应用于人类社会生活的各个领域。单片机课程已经成为高校计算机、自动化、测控以及电子信息工程等专业的重要课程。该课程是一门理论性和实践性都很强的课程,在实际教学中,应将理论教学和实验教学紧密结合。学生在掌握理论知识之余,必须通过编写程序、设计硬件电路、仿真、调试这一系列的实验过程,才能更好地掌握单片机的结构原理和应用技能。随着单片机及其接口技术的飞速发展,目前市场上供应的编程仿真实验资源并不能完全满足高校单片机课程教与学的需求,构建低成本、技术先进、源码公开的单片机编程仿真实验系统,对我国单片机课程的教学和单片机领域人才的培养具有重要的现实意义。 本论文结合目前教学中对单片机编程仿真实验系统的实际需求,采用模块化结构设计思想,精心设计和开发了单片机编程仿真实验系统。该单片机编程仿真实验系统由PC机端单片机编程控制软件和单片机编程仿真实验板两部分组成。PC机端的单片机编程控制软件可以自动检测到连接到单片机编程仿真实验板上的单片机,控制单片机编程器擦除、写入、读出、校验目标单片机ROM中的程序,以十六进制文件(.HEX文件)格式显示在控制界面内;单片机仿真实验系统能够把写入单片机的程序实时地运行,并呈现实际运行效果。单片机编程控制软件和单片机仿真实验板组成一个完整的单片机编程仿真实验系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值