前言
数组是一种线性数据结构,是一个使用连续的内存空间存放相同的数据类型的集合容器,与其他容器相比,数组的区别主要在于性能与保存基本类型的能力。
在Java中,数组是一种效率最高的存储和随机访问对象的方式,通过寻址公式,随机访问的时间复杂可以达到O(1),但是为了保持空间的连续性,在数组中插入、删除数据时,都需要移动后面数据,该操作的时间复杂度为O(n)。另外,由于空间上连续,所以数组对CPU缓存比较友好,借助CPU的缓存机制,预读数组中的数据,提高访问效率。但是,由于数组是定长的,一旦声明之后就不可以改变长度,所以如果长度声明过大或者过小都会造成问题。
一,数组
数组指的是一种容器,可以用来存储同种数据类型的多个值。
数组容器在存储数据的时候,需要结合隐式转换来考虑。
例如:int类型的数组容器(boolean byte short int double)
建议:容器的类型和存储的数据一致。
二,数组的定义
数组有两种定义格式:
- 数据类型 [] 数组名 int [] array
- 数据类型 数组名[] int array[]
三,数组的初始化
初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器的过程。
1.静态初始化
完整格式:数据类型[] 数组名=new 数据类型[]{元素1,元素2,元素3....};
int[] array=new int[]{11,22,33};
简写格式:数据类型[] 数组名={元素1,元素2,元素3....};
int[] array={11,22,33};
注意:数组一旦创建完毕就不会发生变化
2.动态初始化
初始化时只指定数组长度,由系统为数组分配初始值
格式:数据类型【】数组名=new 数据类型【数组长度】
数组默认初始化的规律
整数类型:默认初始化值0
小数类型:默认初始化0.0
字符类型:默认初始化值‘/u0000’空格
布尔类型:默认初始化 false
引用数据类型:默认初始化值 null
特点:在创建时,由我们自己指定数组的长度,由虚拟机给出默认的初始化值
3.数组动态初始化和静态初始化的区别
动态初始化:手动指定数组长度,由系统给出默认初始化值,
只明确元素个数,不明确具体数值,推荐使用动态初始化
举例:使用数组容器来存储键盘录入的5个整数。
int[] arr={????? };
int[] arr=new int[5]
静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度
需求中已经明确了要操作的具体数据,直接静态初始化即可。
举例:将全班的学生成绩存入数组中11,22,33
int[l arr={11,22,33};
四,数组的地址值和元素的访问,遍历
1.数组的地址值
double[] arr2 ={1.1,2.2,3.3};
System.out.println(arr2);//[D@568db2f2
数组的地址值表示数组在内存中的位置
解释一下地址值的具体含义
[ :表示一个数组
D :表示当前数组里面的元素都是double类型的
@ :表示一个间隔符
568db2f2 :才是数组真正的地址值
2. 数组元素的访问和存储
访问:
格式:数组名[索引]
索引特点:从0开始
存储;
格式:数组名[索引]=具体数据/变量
一旦覆盖之后,原来的数据就不存在了
3.数组的遍历
将数组中所有的内容取出来,取出来之后可以(打印,求和,判断...)
注意:遍历指的是取出数据的过程,不要局限理解为,遍历就是打印!
for(int i=0;i<arr.length; i++){
//i:0 1 2 3 4
System.out.println(arr[i]);
}
自动的快速生成数组的便利方式
数组名.fori (idea提供)
五,数组的常见问题和Java的内存分配
1.数组常见的问题
索引越界问题
当数组访问了数组中不存在的索引,就会引发索引越界异常。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at javaee.array.main(array.java:31)
2.Java的内存分配
栈:方法运行时使用的内存,比如main方法运行,进入方法中栈执行。
堆:存储对象或者数组,new用来创建,都存储在堆内
方法区:存储可运行的class文件
本地方法栈:JVM在使用操作系统功能时使用,和我们开发无关
寄存器:给CPU使用,和我们开发无关。
注意:在堆内存中都会有地址值。
六,数组练习
练习一
定义一个数组,存储1,2,3,4,5
遍历数组得到每一种元素,求数组里面所有的数据和
int arr[]={1,2,3,4,5};
int sum=0;
for (int i = 0; i < arr.length; i++) {
sum=sum+arr[i];
}
System.out.println(sum);
练习二
定义一个数组,存储1,2,3,4,5,6,7,8,9,10遍历数组得到每一个元素,统计数组里面一共有多少个能被3整除的数字*/
int arr[]={1,2,3,4,5,6,7,8,9,10};
int count=0;
for (int i = 0; i < arr.length; i++) {
if(arr[i] %3== 0){
// System.out.println(arr[i]);
count++;
}
}
System.out.println("数组中能被3整除的数字有"+count+"个");
}