第八节 拷贝数组
拷贝数组
-不能调整数组的大小
-可使用相同的引用变量来引用一个全新的数组
int elements = new int 6;
elements = new int 10;
数组一旦创建后,其大小不可调整。然而,你可使用相同的引用变量来引用一个全新的数组:
int myArray = new int 6;
myArray = new int 10;
在这种情况下,第一个数组被有效地丢失,除非对它的其它引用保留在其它地方。
拷贝数组
拷贝数组
System.arraycopy()方法
// original array
1.int myArray[] = { 1, 2, 3, 4, 5, 6 };
2.
3.// new larger array
4.int hold[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
5.// copy all of the myArray array to the hold
6.// array, starting with the 0th index
7.System.arraycopy(myArray, 0, hold, 0,
8.myArray.length);
Java编程语言在System类中提供了一种特殊方法拷贝数组,该方法被称作arraycopy()。例如,araycopy可作如下使用:
// original array
1.int myArray[] = { 1, 2, 3, 4, 5, 6 };
2.
3.// new larger array
4.int hold[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
5.// copy all of the myArray array to the hold
6.// array, starting with the 0th index
7.System.arraycopy(myArray, 0, hold, 0,
8.myArray.length);
在这一点,数组hold有如下内容:1,2,3,4,5,6,4,3,2,1。
注意—在处理对象数组时,System.arraycopy()拷贝的是引用,而不是对象。对象本身不改变。
练习: 使用数组
练习目标--在定义并初始化数组后,你将在程序中使用数组。
一、准备
为成功地完成本练习,请务必理解基本的矩阵概念并了解如何定位一个数组以获取它的值。
二、任务
1级:基本数组的使用
1. 创建一个称作BasicArray的类,在...main()方法中声明两个变量,一个是thisArray,另一个是thatArray,它们应属类型array of int。
2. 创建一个数组,它有10个int值,范围从1至10。分配这个第三数组的引用给变量thisArray。
3. 使用for()循环打印thisArray的所有值。如何控制循环的次数?
4. 编译并运行程序。多少值被打印?这些值是什么?
5. 对每个thisArray的元素,建立它的值为索引值的阶乘。打印数组的值。
6. 编译并运行程序。
7. 分配thisArray的引用给变量thatArray。打印thatArray的所有元素。
8. 编译并运行程序。tyatArray的多少值被显示?这些值是什么?它们来自何处。
9. 修改thisArray的某些元素,打印thatArray的值。
10. 编译并运行程序;在thatArray的值中,你注意到了什么?
11. 创建一个有20个int值的数组。分配新数组的引用给变量thatArray,打印thatArray的值。
12. 编译并运行程序。每个数组有多少值被显示? 这些值是什么?
13. 拷贝thisArray的值给thatArray。你将使用什么方法调用? 你将如何限制拷贝元素的数量? thatArray的元素10至19有什么变化?
14. 打印thatArray的值。
15. 编译并运行程序。你所显示的值都是正确的吗?如果不是,你知道有那些内容理解得不对吗?
16. 改变thatArray的某些值;打印thisArray和thatArray。
17. 编译并运行程序。这些值是你所期待的吗?
2级:数组的数组
1. 创建一个称作Array2D的类,在main()方法中声明一个称作twoD的变量,它应属类型array of array of int。
2. 创建一个元素类型为int的数组,该数组应包括4个元素并被赋值到变量twoD的elements0。
3. 编写两个嵌套for()循环语句以打印twoD的全部值。以矩阵的格式安排输出 (可采用System.out.print()方法)。
4. 编译并运行程序。 你应该能发现此时出现了运行错误(空指针异常) ,这是因为twoD的elements1 至 3未被初始化。
5. 分别创建包括5个、6个和7个元素的int数组,将这些数组的引用分别赋予twoD的elements 1,2和3;确认完成上述操作的代码是在第3步所描述的嵌套for()循环之前插入的。
6. 编译并运行程序。这次你应该看到一个零值的非矩形布局。
7. 赋予twoD数组的每个元素一个明显的非零值(提示:使用Math.random() 以获得随机值)。
8. 声明一个属类型array of int的称作oneD的变量。然后, 创建一个包括4个元素的int数组。将该数组的引用分别赋予数组array twoD和oneD的第一个元素。赋值后,打印oneD和twoD数组。
9.编译并运行程序。请注意通过打印oneD的值而显示的单个数组与twoD数组的元素是相同的。
3级:字谜游戏
1. 创建一个称作WordScrambler的应用程序,它具有一个词数组(长度最大为8个字符) ,用它可将一个词的字母拼凑(重排顺序) ,然后组成一个新词。
2.允许使用者看到词的拼凑过程,并分解5个游戏的运行过程。
三、练习小结
讨论──用几分钟的时间讨论一下在以上练习中你所获得的经验、感想和发现。
经验 解释 总结 应用
四、检查你的进度
在进入下一模块之前,请确认你已经能够:
- 声明并创建原始数组、类数组或数组类型
- 解释为什么数组的元素需初始化
- 给出数组定义并初始化数组元素
- 确定一个数组中元素的数量
- 创建多维数组
- 编写从一个数组类型到另一个数组类型数组值的拷贝代码
五、思考题
你怎样创建一个三维数组?
使用数组的缺点是什么?
|