在上一章节中已经对数据结构的基本概念有了了解,主要就是数据结构研究的三个方面(逻辑结构、存储结构、算法)。还有两个重要的词汇:时间效率和空间效率。这一节开始了解最基本的数据结构-数组。
一、数组的基本概念
1、什么是数组?
在平时使用最多的恐怕就是数组了吧,
它是使用最广泛的一种数据结构,它是相同数据类型(可以是基本类型也可以是自定义类型)的元素按一定顺序排列的集合,它们在内存中按照这个先后顺序连续存放在一起。有一维数组,二维数组,多维数组。
通俗的理解就是我们一般把一群羊或者一群牛放在一个圈里面,这个圈就相当于数组容器,每一个羊相当于一个元素。
以上这个概念需要知道这几个词汇:相同数据类型、一定顺序排列、集合、内存先后存放。
2、如何声明一个数组
从标题就可以看到,声明和创建一个数组是两个不同的过程。声明的作用就好像是告诉别人我要去洗澡,创建的作用就好像是我真正的去洗澡了(比喻不当哈哈)。那如何声明数组呢?
- int[] students ;
- int students [];
从上面我们看到这里有两种方式,但一般推荐第一种。毕竟第一种看起来可读性更好一点。
3、如何创建一个数组
在我们知道了如何声明数组之后,接下来就是我们如何创建一个数组。不同的语言创建一个数组的方式还是不一样的,但是大体上一样,这里给出java的几种方式。
- //第一种:
- int [] students = new int[50];
- //第二种:
- String [] colors = {"red","blue","black"};
从上面可以发现创建一个数组如此简单,别急,这三种方式里面其实还是有很多知识点需要掌握的。其实数组的创建其中有一个环节叫做数组的初始化。举个例子,我创建了一个数组,但是一开始数组容器里面可能还没有这些值。那什么时候才有了这些值呢?也就是系统什么时候把我声明的那些red、blue等等装到数组容器里面的呢?这个过程就是数组的初始化。数组是如何初始化的呢?
数组的初始化分为静态初始化、动态初始化:
4、数组的分类
可能看到这个标题有一个疑问,数组还有分类吗?不就是把相同类型的元素放在一起嘛。其实不然。下面给你好好的分一下类:
**按照是否有序分:**有序数组和无序数组。
按照数组能否扩容分:静态数组和动态数组。
先来看静态数组:在编译期间在栈中分配好内存的数组,在运行期间不能改变存储空间,运行后由系统自动释放。
再来看动态数组:动态数组,是相对于静态数组而言。静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员自己负责释放内存。
java中动态数组的原理
现有一个数组:
int [] data = new int[5];
该数组已经无法继续添加元素了,所以我们再初始化一个新的数组,其容量为10,即数组arr容量的2倍:int [] newData = new int [10];
然后将原数组的所有元素全部都赋值给新的数组。
再将原数组的引用 arr指向 新的数组。
静态数组和动态数组的比较:
对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点!对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则严重会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。
二、数组的特点
在上面掌握了其基本概念之后,再来看一下数组有什么特点,数组的特点也是根据其分类来的,比如说有序数组其特点肯定就是有序,我们方便查找数据,无序的我们方面插入删除数据这些。所以这里讲的特点是所有数组共有的特点,也就是一般性特点:又回到了之前发过的文章,特点就是来看时间效率和空间效率的。
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 就可以了。
本文转载自微信公众号「愚公要移山」,可以通过以下二维码关注。转载本文请联系愚公要移山公众号。
作者 许力 阿里云原生多模数据库Lindorm与东软云科技推出联合解决方案 共建面向...
1.我手机掉进厕所了怎么办?是屎在给我发信息吗? 2.生活就像新闻联播,不是换...
数据目录已成为企业数据管理策略的重要组成部分,但选择合适的数据目录并不是简...
我们将创建以下三个Shell脚本来锁定和解锁多个帐户和查看账号状态。 创建锁定用...
新冠肺炎疫情的全球大流行不仅深刻影响了世界政治经济格局的发展演进,而且加速...
年味到底是什么?不同的时代,人们迎接春节的方式也在变换。 在70后的眼里,年味...
1.男女之间是真的可以有纯友谊的,只要一个打死不说一个装傻到底。 2.不要迷恋...
Knative 是基于 Kubernetes 的开源 Serverless 应用编排框架。阿里云 Knative 在...
1.世界上最悲哀的事莫过于睡眠不足,尤其是在感冒的时候。 2.我是一个很有原则...
?又到一年毕业季,即将开启(实习及正式)职场生涯的同学们会有不少疑惑。比如,...