数组
概念:
- 数组是存储同一种数据类型多个元素的容器。
- 数组既可以存储基本数据类型,也可以存储引用数据类型(引用类型:类,接口,数组);
定义格式:
- 数据类型[] 数组名;
eg:int[] arr; - 数据类型 数组名[];
eg:int arr[];
数组的初始化
Java中的数组必须先初始化,然后才能使用。
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
- 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
数据类型[] 数组名 = new 数据类型[数组长度];
(数组长度其实就是数组中元素的个数。)
eg:int[] arr=new int[3];
解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值。
- 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
数据类型[] 数组名 = {元素1,元素2,…};
int[] arr = {1,2,3};
数组的内存分配
- JVM内存分配
- 栈 存储局部变量
- 堆 存储new出来的东西
- 方法区
- 本地方法区
- 寄存器 (给CPU使用)
/*
- 需求:定义一个数组,输出数组名及元素。然后给数组中的元素赋值,再次输出数组名及元素。
*/
public class ArrayTest {
public static void main(String[] args) {
//定义一个数组
int[] arr = new int[3];
//输出数组名及元素
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//给数组中的元素赋值
arr[0] = 100;
arr[2] = 200;
//再次输出数组名及元素
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
代码内存图解:
两个数组指向同一个地址的内存图
/*
- 需求:定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。
- 然后给第二个数组赋值,再次输出两个数组的名及元素。
*/
public class ArrayTest3 {
public static void main(String[] args) {
// 先定义一个数组,赋值,输出
int[] arr = new int[3];
arr[0] = 100;
arr[1] = 200;
arr[2] = 300;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
// 然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组
int[] arr2 = arr;
// 然后给第二个数组赋值
arr2[0] = 111;
arr2[1] = 222;
arr2[2] = 333;
// 再次输出两个数组的名及元素
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
代码内存图解:
数组去重
import java.util.Random;
/*
* 随机生成10个1-10数字放入数组中 要求:数字不能重复
*/
public class Demo{
public static void main(String[] args) {
// 定义数组 (0)-(i-1)
int[] arr = new int[10];
Random random = new Random();
for(int i = 0;i<10;i++) { //i = 3
arr[i] = random.nextInt(10)+1;// 2
// 用当前生成的随机数和数组中其他元素对比 如果相同了就重新生成随机数
for(int j = 0;j<i;j++) {
if(arr[j] == arr[i]) {
// 让上一个生成的数字无效重新生成
i--;
}
}
}
for(int i = 0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
}
数组使用的两个小问题
-
java.lang.ArrayIndexOutOfBoundsException
数组越界异常
产生的原因:就是你访问了不存在的索引元素。 -
java.lang.NullPointerException
空指针异常
产生的原因:数组已经不指向堆内存的数据了,你还使用数组名去访问元素。
二维数组:一个元素为一维数组的数组
格式:
- 动态初始化
数据类型[ ][ ] 数组名 = new 数据类型[m][n];
m表示这个二维数组有多少个一维数组
n表示每一个一维数组的元素有多少个 - 静态初始化
数据类型[ ][ ] 变量名 = {{元素…},{元素…},{元素…}};
/*
* 二维数组遍历
*
* System.out.println():输出内容并换行
* System.out.print():输出内容
* System.out.println():换行
*/
public class ArrayArrayTest {
public static void main(String[] args) {
// 定义二维数组
int[][] arr = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
// 二维数组中的一维数组名称:二维数组名[索引]
// arr[0] 其实就是二维数组中的第一个一维数组的名称
// arr[1] 其实就是二维数组中的第二个一维数组的名称
// arr[2] 其实就是二维数组中的第三个一维数组的名称
// for (int x = 0; x < arr[0].length; x++) {
// System.out.println(arr[0][x]);
// }
// System.out.println("hello");
// System.out.println("world");
// System.out.print("hello");
// System.out.print("world");
/*
// 第一个一维数组的元素
for (int x = 0; x < arr[0].length; x++) {
System.out.print(arr[0][x] + " ");
}
System.out.println();
// 第二个一维数组的元素
for (int x = 0; x < arr[1].length; x++) {
System.out.print(arr[1][x] + " ");
}
System.out.println();
// 第三个一维数组的元素
for (int x = 0; x < arr[2].length; x++) {
System.out.print(arr[2][x] + " ");
}
System.out.println();
*/
// for(int y=0; y<3; y++) {
// for (int x = 0; x < arr[y].length; x++) {
// System.out.print(arr[y][x] + " ");
// }
// System.out.println();
// }
for(int y=0; y<arr.length; y++) {
for (int x = 0; x < arr[y].length; x++) {
System.out.print(arr[y][x] + " ");
}
System.out.println();
}
}
}