关于java:cs61b-week2Arrays

12次阅读

共计 2490 个字符,预计需要花费 7 分钟才能阅读完成。

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 不同)

正文完
 0