当前位置: 首页 > 后端技术 > Java

cs61bweek2--Arrays

时间:2023-04-01 15:59:50 Java

1.一维数组可以通过以下三种方式声明:x=newint[3];y=newint[]{1,2,3,4,5};int[]z={9,10,11,12,13};方法一:创建一个int数组,大小为3,x为数组的引用,默认初始值为0方法二:创建一个int数组,里面的值为{1,2,3,4,5},Java会自动计算数组的长度,y是数组的引用对于方法1和2,需要提前声明x和y是数组的引用:int[]x,y;引用内存的大小是64bit,请注意,如果我们重新分配y:y=newint[]{-1,2,5,4,99};那么我们将永久丢失数组{1,2,3,4,5}的地址,因为已经被垃圾回收了,所以再也找不到和使用了。方法三:使用该方法创建数组不需要new关键字,但是在声明数组的时候也声明了变量z字符数组String[]s=newString[6];对于这样的声明方式,Java会自动赋Initial值,int默认全0,String默认为null,为字符串引用。使用以下语句:s[4]="ketchup";“ketchup”的地址会传给s[4]System.arraycopy()复制一个数组的方法,System.arraycopy(array1,start1,array2,start2,length),这个方法有五个参数,它的含义是:array1:要复制的数组名Astart1:数组A的下标为start1的项开始array2:要复制到B的数组名start2:从数组B中下标为statrt2的项开始length:从数组A中下标为start1的项开始,复制长度项例如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()在处理大数组的时候比loop效率快,因为更贴近底层硬件,而这种方法是无损的,就是说不会对原来复制的数组做改动2.二维数组二维数组其实就是数组的数组,听起来可能比较啰嗦,比如:int[][]帕斯卡三角形;pascalsTriangle=newint[4][];声明了一个长度为4的pascalsTriangle数组,数组的每一项都是对数组的引用,每一项都可以指向一个一维数组,所以初始值全为null,给每一项赋值数组:pascalsTriangle[0]=newint[]{1};pascalsTriangle[1]=newint[]{1,1};pascalsTriangle[2]=newint[]{1,2,1};pascalsTriangle[3]=newint[]{1,3,3,1};由于pascalsTri,将使数组的0、1、2、3项指向四个不同的int数组角度数组的每一项都是对一个int类型数组的引用。新建一个数组,将pascalsTriangle数组的某一项赋值给新数组的某一项,这样就可以改变新数组的某一项。原本指向的int数组int[]rowTwo=pascalsTriangle[2];rowTwo[1]=-5;这里,定义了一个rowTwo变量作为数组引用,rowTwo存储了pascalsTriangle的第二项的值,而pascalsTriangle的第二项是对数组{1,2,1}的引用,所以rowTwo也变成了一个引用数组{1,2,1},rowTwo指向数组{1,2,1},那么修改rowTwo[1],原来的{1,2,1}也会变成{1,-5,1}注意下面的声明方式是数组初始化不同的int[][]matrix;①matrix=newint[4][];②matrix=newint[4][4];对于①,创建一个长度为4的矩阵数组,每一项都会作为一个一维int数组的引用,所以初始值为null,只创建一个数组。对于②,在创建引用数组的同时,也创建了4个int数组,并且每个int数组的长度为4,默认初始化为0,所以语句②同时创建了五个数组。快速测验int[][]x={{1,2,3},{4,5,6},{7,8,9}};int[][]z=newint[3][];z[0]=x[0];z[1]=x[1];z[2]=x[2];z[0][0]=-z[0][0];int[][]w=newint[3][3];系统。arraycopy(x[0],0,w[0],0,3);系统。arraycopy(x[1],0,w[1],0,3);System.arraycopy(x[2],0,w[2],0,3);w[0][0]=-w[0][0];运行下面的代码后,x[0][0]和w[0][0]的值会是多少?答案:x[0][0]:-1,w[0][0]:13.Arraysandclasses比较数组和类两者可以用来表示一堆记忆盒。在这两种情况下,内存框的数量都是固定的,即数组的长度不能改变,就像类字段不能增删一样。数组和类中的内存框之间的主要区别:数组使用[]符号进行编号和访问,类使用.命名和访问。符号。数组中的元素必须都是同一类型。一个类的元素可以是不同的类型。所以,我们使用Array[index]访问数组元素确实是可行的,但是如果p是一个类的实例,使用p[index]编译器会报错,不推荐使用这个访问类成员的方法(糟糕的风格),如果你真的想这样做,你可以使用Java的反射API与其他语言中的数组相比,Java的数组:没有像“切片”这样的特殊语法(例如在Python中)不能shrinkorexpand(如在Ruby中)没有成员方法(如在Javascript中,但有Array.length直接获取数组长度)必须包含相同类型的值(不像Python)