目录
概述
- 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理
- 数组的常见概念
- 数组名
- 下标(或索引)
- 元素
- 数组的长度
- 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型
- 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址
- 数组的长度一旦确定,就不能修改
- 我们可以直接通过下标(索引)的方式调用指定位置的元素,速度很快
- 数组的分类:
- 按照维度:一维数组、二维数组、。。。。
- 按照元素的数据类型:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)
数组的初始化
//1.数组的声明
int[] arr1; //声明一个数组
//静态初始化:数组初始化的同时也给元素赋值
arr1 = new int[]{1,3,5,7,9};
//动态初始化:数组的初始化和元素赋值分开
String[] arr2 = new String[4];
数组元素的调用
//调用数组中指定位置的元素:通过索引的方式调用
//数组的索引是从0开始的,到数组的长度-1
arr2[0] = "张三";
arr2[1] = "李四";
arr2[2] = "王五";
arr2[3] = "赵六";
数组的长度与遍历
//获取数组的长度,使用属性length
System.out.println(arr1.length);
//遍历数组
for(int i = 0; i < arr2.length; i++){
System.out.println(arr2[i]);
}
数组元素的默认初始化值
- 数组元素是整型:0
- 数组元素是浮点型:0.0
- 数组元素是char型:0或者'\u0000',也就是ASCII码是0的那个字符
- 数组元素是boolean型:false
- 数组元素是引用类型:null
int[] arr3 = new int[3];
for (int i = 0; i < arr3.length; i++) {
System.out.println(arr3[i]);
}
float[] arr4 = new float[3];
for (int i = 0; i < arr4.length; i++) {
System.out.println(arr4[i]);
}
char[] arr5 = new char[3];
for (int i = 0; i < arr5.length; i++) {
System.out.println(arr5[i]);
}
System.out.println(arr5[0] + 0);
boolean[] arr6 = new boolean[3];
for (int i = 0; i < arr6.length; i++) {
System.out.println(arr6[i]);
}
String[] arr7 = new String[3];
for (int i = 0; i < arr7.length; i++) {
System.out.println(arr7[i]);
}
内存结构说明
我们写好的程序,里面有好多变量数据,那在程序运行的时候这些变量、数据是放在哪里的呢??
放在内存中的。
(局部变量:在方法中定义的变量都称为局部变量)
数组的内存结构:
说明:其实张三和李四不是放在堆区的,应该是放在常量池的。
局部变量,是存放在栈区的,当方法执行完毕后,局部变量就要销毁,就会自动的从栈区弹出来。
先进后出!!!
对于一个数组来说,比如:int[] arr = new int[3];
new int[3] 这部分是放在堆区的
arr是放在栈区的,而且arr这块的值实际上是new int[3]在堆区中的地址值!
java内存模型
- 栈区:存放的是局部变量 (基本类型、引用)
- 堆区:new出来的对象和数组
- 方法区(常量池,静态域)
foreach循环
之前我们讲过三种循环结构:
- for循环
- while循环
- do-while循环
其实还有一种循环是 foreach循环,它是jdk5.0出来的,它其实底层用的还是for循环。
只不过是它使用起来更简单一些,我们经常用它来遍历数组、集合。
案例:
public static void main(String[] args) {
String[] names = new String[3];
names[0] = "张三";
names[1] = "李四";
names[2] = "王五";
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
//增强for循环
for(String name : names){
System.out.println(name);
}
}
交换两个变量
public static void main(String[] args) {
int num1 = 15;
int num2 = 30;
int temp = 0;
temp = num1;
num1 = num2;
num2 = temp;
System.out.println("num1=" + num1);
System.out.println("num2=" + num2);
二维数组
- Java语言里提供了支持多维数组的语法
- 如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格,像下图excel中的表格一样
- 对于二维数组的理解,我们可以看作是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,并没有什么多维数组,还是一维数组
案例:
public static void main(String[] args) {
//一维数组的声明及初始化
int[] arr1 = new int[]{1,3,5};
//1. 二维数组的静态初始化
int[][] arr2 = new int[][]{{1,2,3},{2,6},{3,8}};
//2.1 二维数组的动态初始化
String[][] arr3 = new String[3][2];
//2.2 二维数组的动态初始化
String[][] arr4 = new String[3][];
//3.获取二维数组中指定位置的元素
System.out.println(arr2[1][1]);
System.out.println(arr3[2][1]);
arr4[1] = new String[3];
System.out.println(arr4[1][2]);
//4.获取数组的长度
System.out.println(arr1.length);
System.out.println(arr2.length);
System.out.println(arr2[1].length);
//5.遍历二维数组
for (int i = 0; i < arr2.length; i++) {
for(int j = 0; j < arr2[i].length; j++){
System.out.print(arr2[i][j] + "\t");
}
System.out.println();
}
//6.数组元素的默认初始化值
//规定:二维数组分为外层数组的元素,内层数组的元素
//外层元素:arr[0]、arr[1]等
//内层元素:arr[0][1]、arr[2][1]等
int[][] arr5 = new int[4][3];
System.out.println(arr5[1]); //输出的是一维数组 int类型@地址值
System.out.println(arr5[1][2]);
System.out.println(arr5[4]); //输出的是二维数组int类型@地址值
float[][] arr6 = new float[3][];
System.out.println(arr6[2]); //null
System.out.println(arr6[2][1]); //报错
}
二维数组的内存结构图:
数组常见的异常
数组索引越界异常。java.lang.ArrayIndexOutOfBoundsException。
也就是当我们根据索引获取数组中的元素时,如果输入的索引是不存在的,就会报这个异常!