1.一维数组申明

上面三种形式均可取:

x = new int[3];y = new int[]{1, 2, 3, 4, 5};int[] z = {9, 10, 11, 12, 13};

形式1:创立一个大小为3的int型数组,x为对该数组的援用,默认初始值均为0
形式2:创立一个int数组,外面的值为{1,2,3,4,5},Java会主动计算出该数组的长度,y为对该数组的援用

对于形式1与形式2,须要提前申明x与y是对数组的援用:
int[] x, y;
援用的内存大小均为64bit请留神,如果咱们对y从新赋值:
y = new int[]{-1, 2, 5, 4, 99};
那么咱们将永恒失落数组{1, 2, 3, 4, 5}的地址,无奈再找到并应用该数组,因为曾经被垃圾回收。
形式3:应用这种办法创立数组不须要应用关键字new,然而申明数组的同时也申明了变量z

字符型数组

String[] s = new String[6];
对于这样的申明形式,Java会主动赋予初值,int默认全是0,而String默认是null,是字符串的援用
应用以下语句:
s[4] = "ketchup";
则会将"ketchup"的地址传到s[4]

System.arraycopy()

拷贝数组的办法,System.arraycopy(array1,start1,array2,start2,length),该办法有五个参数,其含意为:

array1:被拷贝的数组名A
start1:从数组A的下标为start1的项开始
array2:拷贝至的数组名B
start2:从数组B的下标为statrt2的项开始
length:从数组A的下标为start1的项开始,拷贝length项
举例,System.arraycopy(b, 0,x, 3, 2)意思是将数组x的下标为3项开始,数组x前面的2项全副被替换为,从数组b的第0项开始往后2位,等同于python的x[3:5] = b[0:2]
当然奢侈的办法是通过一个循环,将x[i]=y[i],也能够实现数组拷贝,然而System.arraycopy()在解决大数组时比循环更快,起因是它更靠近底层硬件,且该办法是非破坏性办法,这意味着它不会对原来被拷贝数组作出改变


2.二维数组

二维数组实际上是数组的数组,听起来可能比拟拗口,比方:

int[][] pascalsTriangle;pascalsTriangle = new int[4][];

申明了一个长度为4的pascalsTriangle的数组,该数组的每一项均为数组的援用,每一项均可指向一个一维数组,因而初始值全为null

对数组的每一项赋值:

pascalsTriangle[0] = new int[]{1};pascalsTriangle[1] = new int[]{1, 1};pascalsTriangle[2] = new int[]{1, 2, 1};pascalsTriangle[3] = new int[]{1, 3, 3, 1};

将会使数组的第0,1,2,3项别离指向四个不同的int型数组

因为pascalsTriangle数组的每一项均为int类型数组的援用,创立一个新的数组并将pascalsTriangle数组的某一项值赋予给新数组的某一项,那么对新数组的该项进行改变时也能印象原来指向的int数组

int[] rowTwo = pascalsTriangle[2];rowTwo[1] = -5;

这里定义了一个rowTwo的变量作为数组援用,rowTwo寄存pascalsTriangle第2项的值,而pascalsTriangle第2项是对数组{1, 2, 1}的援用,因而rowTwo也成为对数组{1, 2, 1}的援用,rowTwo指向数组{1, 2, 1},那么对rowTwo[1]进行批改,原来的{1, 2, 1}也就会变成{1, -5, 1}
留神以下申明形式对于数组的初始化不同

int[][] matrix;① matrix = new int[4][];② matrix = new int[4][4];

对于①,创立一个长度为4的matrix数组,每一项的将作为一维int数组的援用,因而初始值全为null,仅创立了一个数组
对于②,在创立援用数组的同时也将4个int型数组创立了,且每一个int型数组的长度为4,默认初始化为0,因而申明②同时创立了五个数组

小练习

为了确定您是否把握二维数组,一个小测验

int[][] x = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};int[][] z = new int[3][];z[0] = x[0];z[1] = x[1];z[2] = x[2];z[0][0] = -z[0][0];int[][] w = new int[3][3];System.arraycopy(x[0], 0, w[0], 0, 3);System.arraycopy(x[1], 0, w[1], 0, 3);System.arraycopy(x[2], 0, w[2], 0, 3);w[0][0] = -w[0][0];

After running the code below, what will be the values of x[0] [0] and w[0] [0]?

answer:
x[0][0]: -1, w[0][0]: 1


3.数组和类比拟

数组和类都能够用来示意一堆内存盒。在这两种状况下,内存盒的数量都是固定的,即数组的长度不能扭转,就像类字段不能增加或删除一样

数组和类中内存盒的次要区别:

  • 数组应用 [] 符号进行编号和拜访,类应用 . 符号命名和拜访。
  • 数组中的元素必须都是雷同的类型。类的元素能够是不同的类型。

因而,当咱们应用Array[index]去拜访数组元素时确实可行,然而如果p是一个类的实例,应用p[index]则编译器会报错,不举荐应用该办法拜访类的成员(格调蹩脚),如果你确实想这么做的话,能够应用Java的reflection API

与其余语言中的数组相比,Java的数组:

没有相似于“切片”的非凡语法(例如在 Python 中)
不能膨胀或扩大(例如在 Ruby 中)
没有成员办法(例如在 Javascript 中,然而有Array.length可间接得出数组长度)
必须蕴含雷同类型的值(与 Python 不同)