数组概念: 数组就是一种数据结构,用来储存同一类型值得集合。
数组的特点:
- 数组是一种引用数据类型;
- 数组当中的多个数据,类型必须统一;
- 数组的长度在程序运行期间不可改变;
- 数组的存储方式为: 数组名在stack(栈)上存储数组第一个元素的地址,数组元素存储在heap(堆)上。
两种常见的初始化方式:
1.动态初始化(指定长度)在创建数组的时候,直接指定数组当中的数据元素个数。
int[] arrayA = new int[10];
// 格式:数据类型[] 数组名称 = new 数据类型[数组长度];
2.静态初始化(指定内容)在创建数组的时候,不直接指定数据个数多少,而是直接将具体的数据内容进行指定。
int[] arrayB = new int[1,2,3,4,5,6,7,8,9,10]
// 数据类型[] 数组名称 = new 数据类型[] { 元素1, 元素2, ... };
使用静态初始化数组的时候,格式还可以省略一下。
省略格式:
数据类型[ ] 数组名称 = { 元素1, 元素2, … };
注意事项:
- 静态初始化没有直接指定长度,但是仍然会自动推算得到长度。
- 静态初始化标准格式可以拆分成为两个步骤。
- 动态初始化也可以拆分成为两个步骤。
- 静态初始化一旦使用省略格式,就不能拆分成为两个步骤了。
二维数组
- 格式 : 数据类型[ ][ ] 数组名 = new 数据类型[m][n];
二维数组初始化:
二维数组可以初始化,和一维数组一样,可以通过3种方式来指定元素的初始值。
- 格式一:使用大括号直接赋值,适合已经确定知道数组元素的情况
int[][] arr1 = new int[][]{{1,2}, {2, 3}, {4, 5}};
- 格式二:给定二维数组的大小
int[][] arr2 = new int[4][3];
- 格式三:数组第二维的长度可变化,未改变
int[][] arr3 = new int[4][];
使用建议:
如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体的内容,用静态初始化。
数组索引
- 索引:每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引可以通过数组的索引访问到数组中的元素。
- 数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为:数组名.length ,属性length的执行结果是数组的长度,int类型结果。由次可以推断出数组的最大索引值为数组名.length-1。
- 索引访问数组中的元素:
数组名[索引]=数值,为数组中的元素赋值
变量=数组名[索引],获取出数组中的元素
public static void main (String[] args) {
int[] arr = {1,2,3,4,5}; //定义存储int类型数组,赋值元素1,2,3,4,5
arr[0] = 6; //为0索引元素赋值为6
int i = arr[0]; //获取数组0索引上的元素
System.out.println(i); //直接输出数组0索引元素
System.out.println(arr[0]);
}
- 注意事项
1.数组的索引编号从0开始,一直到“数组的长度-1”为止。
2.如果访问数组元素的时候,索引编号并不存在,那么将会发生
数组索引越界异常
ArrayIndexOutOfBoundsException
3.数组属于引用类型,因此在使用前一定要开辟空间(实例化),否则会产生 NullPoninterException
数组拷贝:
- 1.for
public class TestDame1 {
public static void main(String[] args) {
int[] array = {10, 20, 30, 40, 50};
int[] array2 = new int[array.length];
System.out.println(Arrays.toString(array));
System.out.println("=======================");
//第一种方法 for
for (int i = 0; i < array.length; i++) {
array2[i] = array[i];
}
System.out.println(Arrays.toString(array));
System.out.println(Arrays.toString(array2));
}
- 2.clone(要克隆的数组.clone)
public class TestDame1 {
public static void main(String[] args) {
int[] array = {10, 20, 30, 40, 50};
int[] array3 = new int[array.length];
System.out.println(Arrays.toString(array));
System.out.println("=======================");
//第二种方法 alone
array3 = array.clone();
System.out.println(Arrays.toString(array));
System.out.println(Arrays.toString(array3));
}
- 3.System.arraycopy(源数组名,源数组拷贝起点,目标数组名,目标数组拷贝起点,拷贝长度)
public class TestDame1 {
public static void main(String[] args) {
int[] array = {10, 20, 30, 40, 50};
int[] array4 = new int[array.length];
System.out.println(Arrays.toString(array));
System.out.println("=======================");
System.arraycopy(array,0,array4,0,array4.length);
System.out.println(Arrays.toString(array));
System.out.println(Arrays.toString(array4));
}
- 4.Arrays.copyOf(数组名,数组长度)
public class TestDame1 {
public static void main(String[] args) {
int[] array = {10, 20, 30, 40, 50};
int[] array5 = new int[array.length];
System.out.println(Arrays.toString(array));
System.out.println("=======================");
array5 = Arrays.copyOf(array, array.length);
System.out.println(Arrays.toString(array));
System.out.println(Arrays.toString(array4));
}
注意事项:
- for:拷贝对于基本类型来说是深拷贝。
- clone对于基本类型来说是深拷贝。
- System.arraycopy()对于基本类型来说是深拷贝。
- native System.arraycopy()拷贝最快
- 数组元素是引用类型是浅拷贝。native:底层代码由C/C++
- 四种拷贝方式对于引用类型来说都是浅拷贝。