⛹️三、数组作为方法的返回值
代码示例:
这个代码固然可行, 但是破坏了原有数组. 有时候我们不希望破坏原数组, 就需要在方法内部创建一个新的数组, 并由方法返回出来。
修改后的代码:
※思考题※
题目一:
输出是什么
题目二:
输出是什么
题解:
⛵四、数组练习
1.模拟实现toString
题目要求:
实现一个方法 toString, 把一个整型数组转换成字符串.
例如 :数组 {1, 2, 3} , 返回的字符串为 “[1, 2, 3]”, 注意 逗号 的位置和数量.
2.数组拷贝
数组的拷贝方式
1.for循环拷贝
在这种拷贝方式中,我们首先通过 new 一个新的和 arr 一样长度数组 copy,再通过 for 循环将 arr 数组中的内容 一 一赋给copy数组,达到 最终的数组拷贝的效果.
2.Arrays数组的工具类
(1)copyOf()
我们先通过JKD的工具文档,来看一下拷贝工具的用法
功能:复制指定的数组,用零截取或填充(如有必要),以便复制具有指定的长度.
具体看一下Java当中copyOf方法的具体实现
首先 Arrays.copyOf() 的返回类型是 int [ ] ,第一个参数是 原数组(要拷贝的数组),第二个参数是新数组的长度(可以自己定),如果新的数组的长度比原数组长的话,大于原数组长度的元素都补为0 。 具体如下所示…
(2)copyOfRange()
我们先通过JDK文档来查看这个工具类的功能
功能:将指定数组的指定范围复制到新的数组中.
具体看一下Java当中copyof方法的具体实现
copyOfRange 方法的返回类型是 int [ ] ,第一个参数是 原数组 ,第二、三参数是要拷贝原数组数据的下标 ,一定要切记 是左闭右开的区间 , [ from , to ).
代码示例
3.System.arraycopy
我们打开 System.arraycopy 方法的具体实现,发现没有和上面几种拷贝方法的实现过程,System.arraycopy 有前面的 native 可知,这是一个本地方法。
本地方法
1.运行在
本地方法栈
上2.底层是由
C/C++代码实现
的
System.arraycopy 没有返回值,第一个参数原数组(要拷贝的数组),第二个参数是原始数组要拷贝的下标,第三个参数是目的地数组 ,第四个参数是 目的地数组的下标,第五个数组是要拷贝的长度.
代码示例:
注意点:
System.arraycopy 最后一个参数 ——要拷贝的数组长度,这个数据不能超过原数组的长度,否则编辑器会发生错误报告:数组越界。
4.
数组名.clone
----> 产生当前数组的一个副本
clone可以理解为是一份资料的备份
代码示例:
⌚五、理解深拷贝与浅拷贝
浅拷贝
:复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针,不复制堆内存中的对象。
深拷贝
:复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针和堆内存中的对象。
深拷贝和浅拷贝
最根本的区别
在于是否真正获取一个对象的复制实体
,而不是引用。
假设B复制了A,修改A的时候,看B是否发生变化:
如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)
如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)
通俗来说就是:
- 浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,
- 深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,
- 使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。