目录
今天是七夕节,祝大家有对象的长长久久,没对象的早遇良人。
实在没对象的可以自己new一个,过节嘛,最重要的是开心!
七夕快乐!!!
数组的基本概念
什么是数组?
数组:相同类型元素的集合。在内存中是一片连续的空间
注意:
1.数组中存放的元素类型相同。
2.数组开辟的空间是连在一起的(java中二维数组不一定连续)。
3.每个空间都有自己的编号,其初始位置的编号为0,即为数组的下标
数组的创建
类型[] 数组名= new 类型[数组长度];
int[] array = new int[10];
//创建一个数组,可以容纳10个int类型的元素。
数组的初始化
动态初始化:
在创建数组时,直接指定元素个数。
int[] array = new int[5];
此时创建了一个可以容纳5个int类型元素的数组。
静态初始化:
double[] array = new int[]{1.0,2.0,3.0,4.0};
静态初始化也可省去new int[] 简写成:
double[] array = {1.0,2.0,3.0,4.0};
注意:
1.静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
2.静态初始化时, {}中数据类型必须与[]前数据类型一致。
3.简写虽然省去了new T[], 但是编译器编译代码时还是会还原
静态和动态初始化也可以分为俩步,但省略格式不可以。
int[] array1;//这里并没有开辟空间,只是声明了一个变量名array1。
array1 = new int[10];
int[] array2;
array2 = new int[]{10, 20, 30};
//创建了一个可以容量3个int类型元素的数组,元素的初始值为10,20,30
int[] array3;
array3 = {1, 2, 3}
//这是一种错误的写法。
这里可以这么理解:对于{1,2,3}来说,它只是数组初始化的一种方式,并不表示为数组。而array3是一个数组,他应该指向一个已经初始化了的数组对象。
数组中元素的默认值。
数组的使用:
数组中元素访问
int[]array = new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);
int[]array = new int[]{10, 20, 30, 40, 50};
array[1] = 90;
System.out.println(array[1]);
遍历数组
public static void main(String[] args) { int[] array = new int[]{1,2,3,4,5}; System.out.println(array.length); }
通过for循环来打印数组的每一个元素
public static void main(String[] args) { int[] array = new int[]{1,2,3,4,5}; for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } }
数组是引用类型
基本类型变量与引用类型变量的区别
基本数据类型创建的变量称为基本变量,该变量再空间中直接存放的是其所对应的值。
引用数据类型创建的变量,称为对象的引用,该变量在空间中存储的是对象所在空间的地址。
引用变量
来看一道例题:
public static void func() { int[] array1 = new int[3]; array1[0] = 10; array1[1] = 20; array1[2] = 30; int[] array2 = new int[]{1,2,3,4,5}; array2[0] = 100; array2[1] = 200; array1 = array2; array1[2] = 300; array1[3] = 400; array2[4] = 500; for (int i = 0; i < array2.length; i++) { System.out.println(array2[i]); } }
大家可以先思考一下,输出了些啥?
你答对了吗?这里值得注意是是array2[2] 和array2[3]的值是 300和400。
接下来给大家画图
值得注意的是数组里面存的是地址,当把array2数组的地址给array1时, 它们就指向了同一个对象。
认识 null
int[] arr = null;
System.out.println(arr[0]);
// 执行结果 Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:6)
数组的应用场景
保存数据
int[] array = new int[]{1,2,3,4};
把整形数据1,2,3,4存放在数组当中。
作为函数的参数
参数传数组类型(引用数据类型)
public static void func2(int[] arr){ arr[0] = 10; System.out.println(arr[0]); } public static void main(String[] args) { int[] array = new int[]{1,2,3,4}; func2(array); System.out.println(array[0]); }
可以发现在func2内部修改数组内容,方法外部数组内容也会发生改变 。
因为数组是引用类型,按照引用类型进行传递(传递对象的地址),是可以修改其中存放的内容的。
再看一个题:以下代码会输出什么?
public static void func1(int[] arr){ arr = new int[10]; } public static void main(String[] args) { int[] array ={1,2,3,4}; func1(array); System.out.println(Arrays.toString(array));//以字符串的形式输出array数组里面的元素 }
答案是{1,2,3,4}
虽然arr数组原本指向的对象是数组array1,但是arr数组又重新开辟了空间,指向了新的空间(对象),所以改变arr数组并不影响array这个数组。
作为函数的返回值
public static int[] func(int n){
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = i;
}
return arr;
}
public static void main(String[] args) {
int[] array = func(10);
System.out.println(Arrays.toString(array));
}
二维数组
int[][] array = new int[][]{{1,2,3},{4,5,6}};
int[][] array1 = new int[2][3];
不规则二维数组 :
int[][] array = new int[2][]; array[0] = new int[3]; array[1] = new int[4];