Java的引用数据类型
- 数组
- 接口
- 类
- 枚举
数组
一维数组
概念:一组数据的容器
声明
数据类型[] 数组名;
数据类型 数组名[];
概念:
- 数组是引用数据类型
- 数组中的数据也可叫做元素
- 元素的编号也叫做下标/索引
- 下标从0开始
- 数组元素在内存中开辟的空间是连续的的
- 数组一旦初始化成功,长度不可变意味着数组不能添加或者删除元素
数组的初始化
-
静态初始化:元素由程序员指定,数组长度由系统分配
//静态初始化1:声明的同时初始化 String[] names = new String[]{"1","2","3","4","5"}; //静态初始化2:先声明,再初始化 String[] names; names = {"1","2","3","4","5"}; //静态初始化3:简化版本 String[] names = {"1","2","3","4","5"};
-
动态初始化:数组长度由程序员指定,元素由系统分配
//动态初始化1:声明的同时初始化 int[] arr = new int[5]; //动态初始化2:先声明,再初始化 int[] arr; arr = new int[5];
动态初始化时,不同数据类型系统分配不同元素类型
整数类型默认值:0
浮点类型默认值:0.0
字符类型默认值:’ ’
布尔类型默认值:false
引用类型默认值:null(空)小结:
- 初始化只知道元素,就使用静态初始化
- 初始化只知道长度,就使用动态初始化
int
类型的数组为引用数据类型,数组中的元素使基本数据类型
数组的遍历
-
for
遍历public class Demo{ public static void main(String[] args){ String[] names = new String[]{"1","2","3","4","5"}; for(i=0;i<names.length;i++){ System.out.println(names[i]) } } }
-
foreach
遍历:增强for
循环注意:ele的类型与names类型一致
public class Demo{ public static void main(String[] args){ String[] names = new String[]{"1","2","3","4","5"}; for(String ele:names){ System.out.println(ele) } } }
-
for
vsforeach
当需要操作数组下标时,使用
for
当不需要操作数组下标时,使用
foreach
练习:创建一个int
类型的数组,长度由用户指定,数据由用户输入,输入完毕后获取最大值并输出
import java.util.Scanner;
public class Demo{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入数组长度:");
//接收数组长度
int len = scan.nextInt();
//初始化数组
int[] arr = new int[len];
//元素
for(int i=0;i<arr.length;i++){
System.out.println("请输入" + (i+1) + "个数");
int num = scan.nextInt();
arr[i] = num;
}
//假设第一个数据为最大值
int max = arr[0];
for(int i=1;i<arr.length;i++){
if(max<arr[i]){
max = arr[i];
}
}
System.out.println("最大的数字为" +max);
}
}
数组初始化内存图
-
一维数组静态初始化内存图
小结:当使用某个类(方法区中,只有程序结束时才会被回收)的时候,
JVM会将该类(Demo.class)加载到方法区,
会将该类的常量(只有程序结束时才会被回收)扫描到常量池(值+地址)中,
JVM调用main方法(在栈中开辟空间),
在堆中新建数组对象(连续空间),里面的元素存放存放常量地址,
main方法中的引用(比如String[] str)存放数组对象的地址 -
一维数组动态初始化内存图
小结:
当使用某个类(方法区中,只有程序结束时才会被回收)的时候,
JVM会将该类(Demo.class)加载到方法区,
会将该类的常量(只有程序结束时才会被回收)扫描到常量池(值+地址)中,
JVM调用main方法(在栈中开辟空间),
在堆中新建数组对象(连续空间),里面的元素由系统自动分配(比如null),
main方法中的引用(比如String[] str)存放数组对象的地址,
会将该类(Demo.class)加载到方法区,
会将该类的常量(只有程序结束时才会被回收)扫描到常量池(值+地址)中,
JVM调用main方法(在栈中开辟空间),
在堆中新建数组对象(连续空间),里面的元素由系统自动分配(比如null),
main方法中的引用(比如String[] str)存放数组对象的地址,
当赋值时,将数组中对应下标的元素替换为常量池中的地址