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

java 传绝对路径无效_java架构师系列1-数据结构(2)数组

上一章节回顾

在上一章节中已经对数据结构的基本概念有了了解,主要就是数据结构研究的三个方面(逻辑结构、存储结构、算法)。还有两个重要的词汇:时间效率和空间效率。这一节开始了解最基本的数据结构-数组。

说在前面的话

还需要说明一点,学习一个新的知识点的基本顺序我觉得大体是这样的。首先要知道其基本概念(还有分类),然后了解它的特性(特殊点),因为特性决定用途,接下来就是它的用途,最后就是他的底层实现原理。因此我以后基本上也会按照这种方式去讲解一个新的知识点。

一、数组的基本概念

1、什么是数组?

​ 在平时使用最多的恐怕就是数组了吧,它是使用最广泛的一种数据结构,它是相同数据类型(可以是基本类型也可以是自定义类型)的元素按一定顺序排列的集合,它们在内存中按照这个先后顺序连续存放在一起。有一维数组,二维数组,多维数组。 通俗的理解就是我们一般把一群羊或者一群牛放在一个圈里面,这个圈就相当于数组容器,每一个羊相当于一个元素。

​ 以上这个概念需要知道这几个词汇:相同数据类型、一定顺序排列、集合、内存先后存放。

2、如何声明一个数组

​ 从标题就可以看到,声明和创建一个数组是两个不同的过程。声明的作用就好像是告诉别人我要去洗澡,创建的作用就好像是我真正的去洗澡了(比喻不当哈哈)。那如何声明数组呢?

 int[] students ;
 int students [];

​ 从上面我们看到这里有两种方式,但一般推荐第一种。毕竟第一种看起来可读性更好一点。

3、如何创建一个数组

​ 在我们知道了如何声明数组之后,接下来就是我们如何创建一个数组。不同的语言创建一个数组的方式还是不一样的,但是大体上一样,这里给出java的几种方式。

//第一种:
int [] students = new  int[50];
//第二种:
String [] colors =  {"red","blue","black"};
//第三种:
int [] height =  new int [3] {170,175,169};

​ 从上面可以发现创建一个数组如此简单,别急,这三种方式里面其实还是有很多知识点需要掌握的。其实数组的创建其中有一个环节叫做数组的初始化。举个例子,我创建了一个数组,但是一开始数组容器里面可能还没有这些值。那什么时候才有了这些值呢?也就是系统什么时候把我声明的那些red、blue等等装到数组容器里面的呢?这个过程就是数组的初始化。数组是如何初始化的呢?

数组的初始化分为静态初始化、动态初始化:

静态初始化:数组在初始化时由程序员显式指定每个数组元素的初始值。而数组长度由系统决定。在上面创建数组的那三种方式中,第三种就是静态初始化。第二种也是,但是属于静态初始化的简化方式。

动态初始化:动态初始化时则必须指定元素个数。动态初始化时数组元素个数未知因此必须指定。上面第一种就是。

4、数组的分类

​ 可能看到这个标题有一个疑问,数组还有分类吗?不就是把相同类型的元素放在一起嘛。其实不然。下面给你好好的分一下类:

按照照是否有序分:有序数组和无序数组。

按照数组能否扩容分:静态数组和动态数组。

先来看静态数组:在编译期间在栈中分配好内存的数组,在运行期间不能改变存储空间,运行后由系统自动释放。

再来看动态数组:动态数组,是相对于静态数组而言。静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员自己负责释放内存。

java中动态数组的原理

现有一个数组:int [] data = new int[5];

eea851414a91dfe6a2e737ece5f52c5c.png

该数组已经无法继续添加元素了,所以我们再初始化一个新的数组,其容量为10,即数组arr容量的2倍:int [] newData = new int [10];

c167f529d67975718b35910e12c85ab7.png

然后将原数组的所有元素全部都赋值给新的数组。

154deb506fe24a640e0a09db6414b22d.png

再将原数组的引用 arr指向 新的数组。

090361acb41b4dd6b0658a89df961292.png

静态数组和动态数组的比较:

​ 对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点! 对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则严重会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。

二、数组的特点

​ 在上面掌握了其基本概念之后,再来看一下数组有什么特点,数组的特点也是根据其分类来的,比如说有序数组其特点肯定就是有序,我们方便查找数据,无序的我们方面插入删除数据这些。所以这里讲的特点是所有数组共有的特点,也就是一般性特点:又回到了之前发过的文章,特点就是来看时间效率和空间效率的。

1.数组的长度固定的,超过长度时,只能创建一个新的数组,并把旧的数组的值传进去方可;

2.数组的存储类型是单一的,同一数组只能存储同一数据类型的数据。

3.数组只能通过下标来访问数据

三、数组的使用场景

​ 数组较容器,最大的优点就是效率。在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式,数组就是一个简单的线性序列,这使得元素访问非常快速, 数组的优点是效率高,但为此,所付出的代价就是数组对象的大小被固定。这也使得在工作中,数组并不实用。我们应该优选java中的容器,而不是数组。

四、数组的底层实现

这里的底层实现也是相比较于java语言来说的,比如在以后的文章里面,像链表这样的数据结构我也会配合Java中链表实现的容器来配合着说。

Java提供了很棒的集合API和集合类如:ArrayList、HashMap,他们内部都是基于数组。java如果程序尝试访问无效的数组索引的话jvm会抛出ArrayIndexOutOfBoundException。

Java语言中,数组的实现原理是什么?这个涉及到编译原理的问题,我只能说,这是一个编译规范。在规范中比如:int[]中的int告诉计算机这是一个整型数据,[]告诉计算机这是一个连续存储的内存地址空间,简单点说一个连续数据的存储空间就是数组,数组只是一个名称!!数组在Java里是一种特殊类型,有别于普通的“类的实例”的对象。 以HotSpot VM为例,答案是在数组对象的对象头里有一个_length字段,记录数组长度。arraylength字节码的实现只要去读那个_length字段即可。JVM 中数组对象是一种特殊的对象,它的Object Header 比普通对象多了一个word 来存储数组的长度,length 会编译成对应的字节码读取这个field 就可以了。

下面看看在内存中是如何实现的!

定义一个整型数组,并初始化 int p = new int[5]; 则:

c6d50ee30bb5065e46bfe8a436f7f309.png

好了数组就先介绍到这里,后续内容我会持续·的发布出来

f6aa7803e9e704beda5ec6e9d8141258.png

关注我的微信公众号,有更多内容和java架构师教程

相关文章:

  • ros 机械臂复位_DYNAMIXEL PRO PH54-200-S500-R 开源机械臂
  • pb数据窗char只有255_MySQL的基本数据类型
  • c语言 malloc_研究了多年C语言,却还没有搞懂malloc和free
  • 从零开始学python数据分析 电子版_从零开始学Python数据分析与挖掘[PDF][67.81MB]
  • 蓝桥杯c语言难还是JAVA难_校园人物 | 用C语言谱写别样人生——记校“十佳青年”数大学院孙露明...
  • mfc倾斜文本输入_一文解读光学字符识别(OCR)与手写文本识别(HTR)
  • python三大神器_Python三神器之virtualenv、virtualenvwrapper
  • 单学python能找工作吗_我为什么推荐学Python,但不希望大家用Python找工作?
  • python整数类型进制表示_Python数据类型:bytes
  • scada schneider 系统_【原创分享】小白也能DIY物联网系统,程序设计来了!
  • python程序设计试卷_Python程序设计试题库
  • python nameerror错误_python - python regex错误:NameError:未定义名称“ re” - 堆栈内存溢出...
  • 用自底向上算法为一组整数构造一个大根堆。_Polyhedral编译调度算法(1)——Pluto算法...
  • ftp文件夹错误 windows无法访问此文件夹_ftp根目录怎么设置,ftp根目录怎么设置,详细设置方法...
  • 无法列入分布式事务处理_浅谈分布式数据库中的事务
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • cookie和session
  • java概述
  • Java知识点总结(JavaIO-打印流)
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Web Storage相关
  • Zsh 开发指南(第十四篇 文件读写)
  • 聊聊directory traversal attack
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 山寨一个 Promise
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 通过调用文摘列表API获取文摘
  • (145)光线追踪距离场柔和阴影
  • (搬运以学习)flask 上下文的实现
  • (分享)自己整理的一些简单awk实用语句
  • (理论篇)httpmoudle和httphandler一览
  • (一)插入排序
  • (转载)CentOS查看系统信息|CentOS查看命令
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • ./configure,make,make install的作用(转)
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 使用 XPath 来读写 XML 文件
  • .NET 中的轻量级线程安全
  • .net下的富文本编辑器FCKeditor的配置方法
  • .project文件
  • // an array of int
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @Autowired @Resource @Qualifier的区别
  • @Not - Empty-Null-Blank
  • @我的前任是个极品 微博分析
  • [1525]字符统计2 (哈希)SDUT
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [30期] 我的学习方法
  • [BT]BUUCTF刷题第8天(3.26)
  • [COI2007] Sabor