Java笔记day07
day07
一、数组
1、概念
1)、数组是存储同一数据类型的多个元素的集合,可以理解为一个容器
2)、数组既可以存储基本数据类型,也可以存储引用数据类型
2、格式
1)、格式1:数据类型[] 数组名;
举例:int[] arr1
2)、格式2:数据类型 数组名[];
举例:double arr2[]
3)、注意事项
a、以上两种定义,定义之后是没有元素值的
b、推荐使用第一种格式,都一种格式的可读性更强
3、初始化
1)、原因
上面的数组定义之后是没有元素值的,没有任何意义,所以要想使用它就要先初始化
2)、概念
初始化是指对数组中的元素进行分配内存空间,并且为元素赋值
初始化分为动态初始化和静态初始化
3)、动态初始化
概念:动态初始化只指定数组长度,由系统为数组分配初始值(默认的初始值为0)
格式:数据类型[] 数组名 = new 数据类型[数组长度]; //数组长度其实就是数组中元素的个数。
举例:int[] arr = new int[3];
意义:定义了一个int类型的数组,这个数组中可以存放3个int类型的值
4)、静态初始化
概念:静态初始化指定每个元素的初始值,由系统自动确定数组长度
格式:数据类型[] 数组名 = new 数据类型[]{元素值}
举例:int[] arr = new int[]{1,2,3};
意义:定义一个int类型的数组,里面由三个元素值,分别是1,2,3
4、动态初始化详解
1)、单独定义数组
int[] arr
单独使用是没有任何意义的,因为尚未初始化变量arr,未初始化之前不能使用
2)、索引
解释:在数组的实际使用中拿到地址值一般是没有意义的,大多数情况下是想获取数组的元素值,这时就需要索引(下标)来获取元素值了
格式: 数组的名称[索引] //注意:索引的编号是从0开始的,从左往右的顺序编号
3)、举例
int[] arr = new int[3];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
定义数组语句左边部分:
int: 说明数组中的元素的数据类型是int类型
[]: 说明它是一个数组类型
arr: 给数组起个名字
定义数组语句右边部分:
new: 代表为数组分配一个内存空间
int: 说明数组中的元素的数据类型是int类型
[]: 说明它是一个数组
3: 代表着数组的长度,其实这里的3就是数组元素的个数
输出:
****[I@1540e19d**** //这是数组arr的地址值,十六进制表示,一般情况下无意义
****0**** //获取的数组的第一个元素
****0**** //获取的数组的第二个元素
****0**** //获取的数组的第三个元素
4)、赋值
上面的例子给出了数组的初步使用,下面对如何赋值进行解释
int[] arr = new int[3]; //需求:想要把10,20,30这个三个值分别赋值给数组中的第一个元素,第二个元素,第三个元素
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
System.out.print(arr+","); //再打印数组的名字以及数组中的元素
System.out.print(arr[0]+",");
System.out.print(arr[1]+",");
System.out.print(arr[2]);
****输出为[I@1540e19d,10,20,30****
5、静态初始化
1)、初始化时指定每个数组元素的初始值,由系统决定数组长度
2)、格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
3)、举例
int[] arr = new int[]{1,2,3};
解释:定义了一个int类型的数组,这个数组中存放了3个int类型的值,并且值分别是1,2,3。
简化写法:
int[] arr = {1,2,3};
4)、注意事项
1、大括号中值要和定义数组的时候数据类型要一致
2、使用静态初始化的时候,右边的中括号中不允许出现数字
如果出现了,就意味着,定义的时候既有动态初始化,也有静态初始化,两者不能混淆使用
int[] arr1 = new int[5]{1,2,3,4,5};//错误
3、当初始值不是0的时候,推荐使用静态初始化
5)、举例
int[] arr2 = {100,200,300};
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
****输出100,200,300****
System.out.println(arr2[3]);
****报错:ArrayIndexOutOfBoundsException: 3****
****数组下标索引越界异常,没有对应的索引****
arr2 = null;
System.out.println(arr2[0]);
****NullPointerException 空指针异常,说明没有任何实例****
6、Java初始化内存分布图
1)、划分
Java程序为了提高程序运行的效率,就对数据在内存中进行了划分,划分了五个部分
栈:存储局部变量(方法中定义的变量都称之为局部变量)
堆:存储new出来的东西
方法区:面对对象学习
本地方法区、寄存器暂时不做解释
2)、堆的特点
a、堆内存中放的都是new出来的东西
b、每个变量都有一个系统给的默认值,这个默认值根据类型不同而不同
byte,short,int,long 0
float,double 0.0
char '\u0000'
boolean false
引用数据类型 null
3)、赋值过程
a、一个数组赋值
int[] arr = new int[3];
System.out.println(arr); //地址值
System.out.println(arr[0]); //0
System.out.println(arr[1]); //0
System.out.println(arr[2]); //0
int[] arr定义数组之后会在栈里生成一个地址值[I@1540e19d,位于栈的最底部(栈拥有先进后出的特点)
这个地址值会映射到堆里,对应一片区域,例如上面的代码就会生成三个区来存放数据
这里并没有对数组进行赋值,所以堆的三个区里存放的数据是默认值0,0,0
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
System.out.print(arr); //地址值
System.out.print(arr[0]); //10
System.out.print(arr[1]); //20
System.out.print(arr[2]); //30
堆里原本的数据是0,0,0,在赋值后原来的值被覆盖,分别变成10,20,30
b、两个数组赋值
int[] arr1 = new int[3];
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
int[] arr2 = new int[3];
arr2[0] = 40;
arr2[1] = 50;
arr2[2] = 60;
int[] arr1定义数组之后会在栈的最底部生成一个地址值0x0001(假设),堆里的一片区域中生成三个默认值,
arr1赋值之后有三个数据覆盖默认值(10,20,30)
int[] arr2定义数组之后会在栈中arr1的上层生成一个地址值0x0002,堆里的另一片区域中生成三个默认值,
arr2赋值之后有三个数据覆盖默认值(40,50,60)
c、两个数组特殊赋值
int[] arr1 = new int[3];
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
int[] arr2 = arr1;
arr2[0] = 40;
arr2[1] = 50;
int[] arr1定义数组之后会在栈的最底部生成一个地址值0x0001(假设),堆里的一片区域中生成三个默认值,
arr1赋值之后有三个数据覆盖默认值(10,20,30)
int[] arr2定义数组之后arr2和arr1拥有相同的地址,且对应堆里相同的区域
arr2赋值之后arr1[0]的值由10变成40,arr2[0]的值也是40,arr1[1]的值由20变成50,arr2[2]的值也是50
而arr1[2]的值由于arr[2]并没有赋值,所以依然为30,同时arr[2]的值也为30
7、数组遍历
对于动态数组由于知道有多少个元素,可以直接输出数组中的元素,但是元素数量越多输出代码就越多,不方便使用
对于静态数组是不知道有多少个元素的,所以要用别的方法遍历得到每个元素
1、动态数组for循环遍历
int[] arr1 = new int[3];
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
for(i=0;i<3;i++){
System.out.println(arr[i]);
}
2、静态数组for循环遍历
java中的数组提供一个属性,可以让我们获取到数组的长度,这个属性的名字叫做:length
使用格式:数组名称.length
int[] arr2 = {3123,12,43,43,5,4,554,3,432,4,2,23,4,2};
for(int i=0;i<arr2.length;i++){
if(i==arr2.length-1){
System.out.println(arr2[i]+"]");
}else if(i==0){
System.out.print("["+arr2[i]+",");
}else {
System.out.print(arr2[i]+",");
}
}
3、调用方法遍历数组
主函数中调用
int[] arr3 = {33,4143,235,45,76,8,43,23,2,23,4,2};
printArray(arr3);
方法
public static void printArray(int[] array){
for(int i=0;i<array.length;i++){
if(i==array.length-1){
System.out.println(array[i]+"]");
}else if(i==0){
System.out.print("["+array[i]+",");
}else {
System.out.print(array[i]+",");
}
}
明天继续