提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。 这些无序排列的同类数据元素的集合称为数组。 比如油烟机的风扇转速会和工作的模式之间有一定的关系,那么我们就可以把它的工作模式和一维数组的下标对应起来,我们将具体的转速放在数组中,这样的话就非常方便我们在日后查询。
一、数组简介
数组的来由:
变量一次只能存放一个数据,新的数据会覆盖掉之前的数据,在一些情况下我们需要一个空间可以连续存放多个数据并且不会被覆盖,这就是数组;
数组的概念:
是一种容器可以同时存放多个数据;
数组的特点:
1.数组是一种引用数据类型;2.数组当中的多个数据类型必须统一;3.数组的长度在数组运行当中不可改变;
二、数组的定义格式-初始化:
在内存当中创建一个数组,并且向其中赋予一些默认值。
常见的初始化方式:
1.动态初始化(指定长度);2.静态初始化(指定内容);
1.动态初始化数组的格式:
数据类型【】 数组名称=new 数据类型【数组长度】;
解析含义:
左侧数据类型,也就是数组当中保存的数据,全是统一的什么类型;
左侧的中括号代表它是一个数组;
左侧的数组名称代表给数组起个名字;
右侧的new代表创建数组的动作;
右侧的数据类型必须和左边的数据类型保持一致;
右侧中括号的长度也就是数组当中到底可以存放多少数据,是一个int数字
代码如下(示例):
package shuzu;
public class shuzu1 {
public static void main(String[] args) {
//创建一个数组,里面可以存放300个int数据
//格式:数据类型【】 数组名称=new 数据类型【数组长度】;
int[] arrayA=new int[300];
double[] arrayB=new double[300];
String[] arrayC=new String[300];
}
}
2.静态初始化数组的格式:
在创建数组的时候,不直接指定数字个数的多少,而直接将具体的数据内容进行指定。
基本格式(标准格式):数据类型【】 数组名称=new 数据类型【】{元素1,元素2,元素3…};
省略格式:数据类型【】 数组名称={元素1,元素2,元素3…};
注意:
1.虽然静态初始化里面没有直接告诉长度,但是根据大括号里面的元素具体内容也可以自动推算出来长度。
2.静态初始化标准格式可以拆分成为两个步骤。
3.动态初始化也可以拆分为两个步骤。
4.静态初始化一旦使用省略格式就不能使用拆分;
使用建议:如果不确定数组当中的具体内容,用动态初始化,否则已经确认了具体内容就用静态初始化;
package shuzu;
public class shuzu2jt {
public static void main(String[] args) {
//直接创建一个数组,里面装的是int数字,具体为:5,15,25
int [] arrayA=new int[]{5,15,25};
String[] arrayB=new String[]{"hello","world","java"};
int [] arrayC={5,15,25};
//静态初始化标准格式可以拆分成为两个步骤
int [] arrayD;
arrayD=new int[]{5,15,25};
//动态初始化标准格式可以拆分成为两个步骤
int [] arrayE;
arrayE=new int[5];
//静态初始化的省略格式不能拆分成为两个步骤,以下写法错误
// int [] arrayF;
// arrayF={10,20,30};
}
}
三、访问数组元素进行获取
直接打印数组名得到的是数组对应的内存地址的哈希值;
访问数组元素的格式:数组名称【索引值】,索引值就是一个int数字代表数组中元素的编号。
注意:索引值从0开始,一直到数组长度-1为止;
package shuzu;
public class qu1 {
public static void main(String[] args) {
int[] array={10,20,30};
for (int i = 0; i < 3; i++) {
System.out.println(array[i]);
}
}
}
四、访问数组元素进行赋值
使用动态数组的时候,其中的元素将会自动拥有一个默认值。
规则如下:
如果是整数类型,默认为0;
如果是浮点型,默认为0.0;
如果是字符类型,默认为’\u0000’(这是一个字符的特殊写法,一个看不见的字符);
如果是布尔类型,那么默认为false;
如果是引用类型,那么默认为null;
注意事项:静态初始化其实也有默认值的过程,只不过系统自动将默认值马上替换成大括号当中的具体数据。
int[] array={10,20,30};
array[0]=389;
五、JAVA的内存需要划分为5个部分:
1.栈(Stack):
存放的都是方法中的局部变量;局部变量:方法的参数或者大括号内部的变量;作用域:一旦超出作用域,立刻从栈内存中消失。真正方法运行一定要在栈当中。
2.堆(Heep):
凡是new出来的东西都在堆当中。堆内存里面的东西都有一个地址值:16进制;堆内存里面的数据都有默认值。规则:如果是整数类型,默认为0;如果是浮点型,默认为0.0;如果是字符类型,默认为’\u0000’(这是一个字符的特殊写法,一个看不见的字符);如果是布尔类型,那么默认为false;如果是引用类型,那么默认为null;
3.方法区(Method Area):
存储.class相关信息,包含方法死信息,真正方法运行一定要在栈当中。
4.本地方法栈(Native Method Stack):
与操作系统相关。
5.寄存器(pc Register):
与CPU相关;
六、一个数组的内存图
七、两个数组的内存图
八、两个引用指向同一个数组的内存图
九、常见问题
——数组索引越界异常:ArrayIndexOutOfBoundsException
package shuzu;
public class question1 {
public static void main(String[] args) {
int[] array={10,20,30};
for (int i = 0; i <= 3; i++) {//没有3号元素错误写法发生数字索引越界异常
System.out.println(array[i]);
}
}
}
解决办法:修改成存在的正确索引
——空指针异常:NullPointerException
package shuzu;
public class question2 {
public static void main(String[] args) {
int[] array=null;//所有引用类型变量都可以赋值一个null值代表其中什么都没有
//数组没有创建没有赋值就引用是错误的System.out.println(array[0]);
array=new int[3];
//数组必须进行new初始化才能使用其中的元素,如果只赋值null,没有进行new创建将会发生空指针异常
System.out.println(array[0]);
}
}
解决:把缺的补上
十、获取数组的长度:
格式:数组名称.length
数组一旦创建,程序运行期间,长度不可改变。
package shuzu;
public class length {
public static void main(String[] args) {
int[] arrayA=new int[3];
int[] arrayB={10,12,22,3,5,33332,4,4,4,4,4};
int len=arrayB.length;
System.out.println("arrayB长度:"+len);
int[] arrayC=new int[3];
System.out.println(arrayC.length);//3
arrayC=new int[5];
System.out.println(arrayC.length);//5
}
}