数组的思维导图
¶数组的赋值
¶杨辉三角
1 | package com.xiebin.day4; |
¶数组的复制
数组的复制:
1.for循环复制;
2.clone复制;
3.System.arraycopy复制;
4.Arrays.copyof复制
¶for循环复制
数组属于引用数据类型,变量保存的是地址值.
1 | package com.xiebin.day4; |
通过上述代码我们可以知道, arr2 = arr;这一步只是把arr保存的地址值[I@7a7b0070赋值给arr2,所以arr和arr 保存的是同一个地址值,修改arr2元素的值,arr元素的值也会随着改变.我们通过画图看看其怎么变化的
1 | package com.xiebin.day4; |
通过for循环把arr复制给arr2,然后修改arr数组第一个元素的值发现arr2数组对应位置的值没有变,说明两个变量指向的不是同一块地址.
1 | package com.xiebin.day4; |
¶clone复制
1 | package com.xiebin.day4; |
通过上述代码的演示,我们发现,通过clone方法进行数组的复制,通过改变数组arr元素的值,然后arr2对应位置元素的值却没有发生改变,说明两数组变量保存的不是同一个地址值.我们打印两个数组的地址值发现,地址值不同.
总结:
- 一维数组:深克隆;(重新分配空间,并将元素复制过去)
二维数组:浅克隆。(只传递引用)
分析:这里采用"数组降维度"的思想,一维数组降维度就成为元素,基本数据类型;而二维数组降维度就为一维数组,数组是引用数据类型,复制的是引用.
浅复制和深复制
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象 ;
深拷贝指的是对象A复制给对象B时,A和B指向的不是同一个对象,通时A的对象成员AA和B的对象成员BB也指的不是同一个对象,如有更深层对象,以此类推。
浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制
在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆。
在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制。
在Java语言中,如果需要**实现深克隆,可以通过*覆盖Object类的clone()方法实现,也*可以通过序列化(Serialization)等方式来实现。
Java语言提供的Cloneable接口和Serializable接口的代码非常简单,它们都是空接口,这种空接口也称为标识接口,标识接口中没有任何方法的定义,其作用是告诉JRE这些接口的实现类是否具有某个功能,如是否支持克隆、是否支持序列化等。
实现对象克隆有两种方式:
1). 实现Cloneable接口并重写Object类中的clone()方法;
2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
¶System.arraycopy()
1 | System.arraycopy()源码 |
1 | package com.xiebin.day4; |
¶Arrays.copyof()
首先看下它的源码
1 | public static int[] copyOf(int[] original, int newLength) { |
此方法需要两个参数,原始数组,新数组的长度.该方法底层 调用了System.arraycopy ,返回是一个原始数组的副本
1 | package com.xiebin.day4; |
¶Arrays.copyOfRange
1 | //源码分析 |
1 | package com.xiebin.day4; |
数组的反转
1 | package com.xiebin.day4; |
¶数组的查找
¶线性查找
1 | /* |
1 | package com.xiebin.day4; |
¶二分法查找
1 | package com.xiebin.day4; |
¶数组的排序
¶冒泡排序
1 | package com.xiebin.day5; |
v1.5.2