上一章节回顾java
在上一章节中已经对数据结构的基本概念有了了解,主要就是数据结构研究的三个方面(逻辑结构、存储结构、算法)。还有两个重要的词汇:时间效率和空间效率。这一节开始了解最基本的数据结构-数组。程序员
说在前面的话算法
还须要说明一点,学习一个新的知识点的基本顺序我以为大致是这样的。首先要知道其基本概念(还有分类),而后了解它的特性(特殊点),由于特性决定用途,接下来就是它的用途,最后就是他的底层实现原理。所以我之后基本上也会按照这种方式去讲解一个新的知识点数组
。
数据结构
1、数组的基本概念app
一、什么是数组?jvm
在平时使用最多的恐怕就是数组了吧,它是使用最普遍的一种数据结构,它是相同数据类型(能够是基本类型也能够是自定义类型)的元素按必定顺序排列的集合,它们在内存中按照这个前后顺序连续存放在一块儿。有一维数组,二维数组,多维数组。 通俗的理解就是咱们通常把一群羊或者一群牛放在一个圈里面,这个圈就至关于数组容器,每个羊至关于一个元素。ide
以上这个概念须要知道这几个词汇:相同数据类型、必定顺序排列、集合、内存前后存放。学习
二、如何声明一个数组spa
从标题就能够看到,声明和建立一个数组是两个不一样的过程。声明的做用就好像是告诉别人我要去洗澡,建立的做用就好像是我真正的去洗澡了(比喻不当哈哈)。那如何声明数组呢?
int[] students ; int students [];
从上面咱们看到这里有两种方式,但通常推荐第一种。毕竟第一种看起来可读性更好一点。
三、如何建立一个数组
在咱们知道了如何声明数组以后,接下来就是咱们如何建立一个数组。不一样的语言建立一个数组的方式仍是不同的,可是大致上同样,这里给出java的几种方式。
//第一种:int [] students = new int[50];//第二种String [] colors = {"red","blue","black"};//第三种:int [] height = new int [3] {170,175,169};
从上面能够发现建立一个数组如此简单,别急,这三种方式里面其实仍是有不少知识点须要掌握的。其实数组的建立其中有一个环节叫作数组的初始化。举个例子,我建立了一个数组,可是一开始数组容器里面可能尚未这些值。那何时才有了这些值呢?也就是系统何时把我声明的那些red、blue等等装到数组容器里面的呢?这个过程就是数组的初始化。数组是如何初始化的呢?
数组的初始化分为静态初始化、动态初始化:
- 静态初始化:数组在初始化时由程序员显式指定每一个数组元素的初始值。而数组长度由系统决定。在上面建立数组的那三种方式中,第三种就是静态初始化。第二种也是,可是属于静态初始化的简化方式。
- 动态初始化:动态初始化时则必须指定元素个数。动态初始化时数组元素个数未知所以必须指定。上面第一种就是。
四、数组的分类
可能看到这个标题有一个疑问,数组还有分类吗?不就是把相同类型的元素放在一块儿嘛。其实否则。下面给你好好的分一下类:
按照是否有序分:有序数组和无序数组。
按照数组可否扩容分:静态数组和动态数组。
先来看静态数组:在编译期间在栈中分配好内存的数组,在运行期间不能改变存储空间,运行后由系统自动释放。
再来看动态数组:动态数组,是相对于静态数组而言。静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就没法改变。而动态数组则否则,它能够随程序须要而从新指定大小。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是经过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员本身负责释放内存。
java中动态数组的原理
现有一个数组:int [] data = new int[5];
该数组已经没法继续添加元素了,因此咱们再初始化一个新的数组,其容量为10,即数组arr容量的2倍: int [] newData = new int [10];
而后将原数组的全部元素所有都赋值给新的数组。
再将原数组的引用 arr指向 新的数组。
静态数组和动态数组的比较:
对于静态数组,其建立很是方便,使用完也无需释放,要引用也简单,可是建立后没法改变其大小是其致命弱点! 对于动态数组,其建立麻烦,使用完必须由程序员本身释放,不然严重会引发内存泄露。但其使用很是灵活,能根据程序须要动态分配大小。
2、数组的特色
在上面掌握了其基本概念以后,再来看一下数组有什么特色,数组的特色也是根据其分类来的,好比说有序数组其特色确定就是有序,咱们方便查找数据,无序的咱们方面插入删除数据这些。因此这里讲的特色是全部数组共有的特色,也就是通常性特色:又回到了以前发过的文章,特色就是来看时间效率和空间效率的。
1.数组的长度固定的,超过长度时,只能建立一个新的数组,并把旧的数组的值传进去方可;
2.数组的存储类型是单一的,同一数组只能存储同一数据类型的数据。
3.数组只能经过下标来访问数据
3、数组的使用场景
数组较容器,最大的优势就是效率。在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式,数组就是一个简单的线性序列,这使得元素访问很是快速, 数组的优势是效率高,但为此,所付出的代价就是数组对象的大小被固定。这也使得在工做中,数组并不实用。咱们应该优选java中的容器,而不是数组。
4、数组的底层实现
这里的底层实现也是相比较于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]; 则:
好了数组就先介绍到这里,后续内容我会持续的发布出来