Java基础知识——数组(一)
6.1数组的定义和使用、属性
6.1.1什么是数组?
- 数组本质就是用来存储一组数的容器
6.1.2数组的定义
- 在java中,数组是一个变量,在内存中开辟一块连续的内存区域,用来存储
相同数据类型
的有序
集合- 相同数据类型:数组中存储的数据是相同的数据类型数据,不能出现多种数据类型,但是引用类型(Object)除外
- **有序:**数组存储元素在内存层面上讲是有序的,因为是连续的存储空间;另一方面数组获取值是通过索引去实现,索引也是有序的。
- 数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型
- 数组是引用类型
6.1.3数组的定义格式
定义数组的四步法:
- 声明数组:数据类型[] 变量名;例如:int[] arrays;
- 分配空间:变量名=new 数据类型[元素个数]; 例如:arrys=new int[6];
- 赋值:变量名[索引]=值; 例如:arrays[0]=2;
- 处理数据:System.out.println(arrays[0]);或者:arrays[0]=arrays[0]*10;
tip:声明数组的另一种方式:数据类型 变量名[];(不推荐使用,因为在C#中无法使用第二种声明方式,编译会出错)
6.1.4数组的四要素
- 标识符:数组的名称,用于区分不同的数组
- 数组元素:向数组中存放的数据
- 元素下标(索引):对数组元素进行编号,从0开始,数组中的每个元素都可以通过下标来访问
- 元素类型:数组元素的数据类型
6.1.5数组的使用方式
i.第一种方式:动态初始化
代码演示:
import java.util.Arrays;
public class Test1{
public static void main(String[] args){
//声明数组并开辟空间
int[] arrays=new int[5];
//动态初始化
arrays[0]=1;
arrays[1]=2;
arrays[2]=3;
arrays[3]=4;
arrays[4]=5;
//打印输出数组元素,调用Arrays中的方法
System.out.println(Arrays.toString(arrays));
}
}
//执行结果:
[1, 2, 1, 2, 1]
tip:new关键字的含义是在堆内存给数组开辟一块新的连续的存储空间,只要是重新new关键字创建的数组,就会在堆内存中重新开辟新空间
ii.第二种方式:静态初始化
代码演示:
import java.util.Arrays;
public class Test2{
public static void main(String[] args){
//静态初始化方式一
int[] arrays=new int[]{1,2,3,4,5};
//打印输出数组元素,调用Arrays中的方法
System.out.println(Arrays.toString(arrays));
//静态初始化方式二
boolean[] arr={true,false};
System.out.println(Arrays.toString(arr));
}
}
//执行结果:
[1, 2, 3, 4, 5]
[true, false]
6.1.6数组的常见的属性
i.数组length属性
- 数组在声明赋值时,都需要指定当前数组的长度(也就是元素的个数),通过new关键词在堆内存中开辟好连续的存储空间,我们通过length属性获取当前数组的长度。
代码演示:
public class Test3{
public static void main(String[] args){
//1:声明一个int类型的数组
int[] arrs=new int[5];//声明了一个存放5个数据的int类型的数组名字叫arrs
//2:获取当前数组的长度
System.out.println("获取数组的长度:"+arrs.length);
}
}
//执行结果:
获取数组的长度:5
ii.数组的索引属性
- 数组中的元素是有序,说的有序称是索引有序。数组中存储的元素,都存在一个下标,我们可以通过下标去获取、修改以及添加元素到数组中去。一定要注意数组的索引是从0开始的,到length-1结束,故数组的索引范围是是[0,length-1]
代码演示:
public class Test4{
public static void main(String[] args){
//1:声明一个int类型的数组,并开辟存储空间
int[] arrs=new int[5];
arrs[0]=1;
arrs[1]=2;
arrs[2]=3;
arrs[3]=4;
//2:获取当前数组的长度
System.out.println("获取数组的长度:"+arrs.length);
//3:通过索引获取数组中第4个元素的值
System.out.println("查看数组中第4个元素的值:"+arrs[3]);
//4:通过索引改变对应位置上的元素值
arrs[3]=10;
System.out.println("索引是3的元素,也就是第4个元素的值是:"+arrs[3]);
//5:通过索引去添加元素,不能超过数组的元素个数范围
arrs[4]=5;
System.out.println("查看添加后数组中第5个元素的值:"+arrs[4]);
}
}
执行结果:
获取数组的长度:5
查看数组中第3个元素的值:4
索引是3的元素,也就是第4个元素的值是:10
查看添加后数组中第5个元素的值:5
6.1.7数组的存储内存分析
代码演示:
public class ArraysTest05{
public static void main(String[] args){
//1:声明一个存放5个int类型元素的数组
int[] arrs=new int[5];
//2:指定数组索引是0的,也就是第一个元素的值是10
arrs[0]=10;
System.out.println("查看第一个元素的值"+arrs[0]);
//3:获取索引是1的,也就是第2个元素的值
System.out.println("查看第2个元素的值是:"+arrs[1]);
}
}
//执行结果:
查看第一个元素的值10
查看第2个元素的值是:0
想一想,为什么我们没有给数组的第二个元素赋值,怎么会有一个初始值0出来?我们下面就来分析一个数组存储的过程
第一步,创建int数组对象时,内存结构
- 1>、会在堆内存当中开辟5个长度的连续的存储空间,用来存储int类型的元素。
- 2>、由于当前数组的类型是int类型,所以每个存储空间的元素都是int的默认值0填充。如果是String类型则默认值为null,就好比类中的不同的数据类型成员变量,对应都会有默认的初始值
- 3>、将堆内存的地址付给arrs变量存储
第二步,将索引是1的元素的位置改为10,注意索引是从0开始,length-1结束
- 在按照元素的索引获取元素值时,注意图中的索引,我们也是按照元素的索引对于数组中的元素进行获取和修改。
6.1.8为什么数组是不可变的
当我们将一个数组中的元素添加满了之后,就不能加了,那我们要怎么样去给数组添加长度来满足我们将新的元素添加进去呢?
代码演示:
public class ArraysTest05{
public static void main(String[] args){
//1:声明一个存放5个int类型元素的数组
int[] arrs=new int[5];
//2:指定数组索引是0的,也就是第一个元素的值是10
arrs[0]=10;
//3:获取索引是1的,也就是第2个元素的值
System.out.println("查看第2个元素的值是:"+arrs[1]);
//4:重新赋值一个新的数组,这里是改变了数组长度吗?
arrs=new int[7];
//5:给arrs第6个元素赋值
arrs[5]=33;
//6:输出索引是5的元素及第6个元素
System.out.println(arrs[5]);
}
}
//执行结果:
查看第2个元素的值是:0
33
内存分析:
结论:数组一旦声明,其长度是不可变得,我们通常说的改变长度其实都是通过重新定义一个新的数组,改变局部变量的引用而已,将新的地址给给arrs