详解 普通数组 —— Arrays类 与 浅克隆
我们在C语言中,编一些代码量规模比较大的程序,几乎都会用到 “数组” 或 “链表” ,但是,在本人之前的博文中,却对这两个知识点从未提到过,那么,本人将通过这篇博文,来为同学们讲述这两个知识点。
首先,本人来带同学们重温下普通数组的基本知识点:
基本应用:
那么,现在,本人来通过一段代码来为同学们展示 一维数组的定义和初始化 过程:
package com.mec.study;
import com.mec.study.complex.Complex;
public class AboutArray {
public static void main(String[] args) {
int[] array1 = {1, 2, 3, 4};
System.out.println(array1.getClass()); //第一种数组的定义
double[] array2 = new double[10];
System.out.println(array2.getClass()); //第二种数组的定义
Complex array3[];
array3 = new Complex[5];
System.out.println(array3.getClass()); //第三种数组的定义
}
}

本人先对 .getClass() 这一句做一下解释:
这个方法,返回值是 “.” 之前的对象的类名称。
从上图的输出结果来看,数组的确被当做一个“类”来对待,这就应证了本人上面对数组的描述
那么,现在,本人在来讲解一下二维数组,来展示下多维数组的初始化方法:
现在,本人来通过一段代码来为同学们展示 二维数组的定义和初始化 过程:
import com.mec.study.complex.Complex;
public class AboutArray {
public static void main(String[] args) {
int[][] matrix1 = {{1, 2}, {1, 2, 3}, {1, 2, 3, 4}}; //第一种初始化方式:直接赋初值
int[][] matrix2 = new int[3][2]; //第二种初始化方式:通过new来确定行、列数,但并未赋值
int[][] matrix3 = new int[2][]; //第三种初始化方式:先初始化行,在初始化列
for(int i = 0; i < matrix3.length; i++) {
matrix3[i] = new int[2];
}
}
}
那么,现在来看一个十分奇怪的例子:
package com.mec.study;
public class AboutMatrix {
public static void main(String[] args) {
int[][] matrix = new int[3][];
for(int i = 0; i < matrix.length; i++) {
matrix[i] = new int[i+3];
}
for(int i = 0; i < matrix.length; i++) {
for(int j = 0; j < matrix[i].length; j++) {
System.out.print((j == 0 ? "" : ", ") + matrix[i][j]);
}
System.out.println();
}
}
}
这里来解释下:
因为二维数组的每一个元素是一维数组的对象,该对象需要申请一维数组空间,而申请空间时,完全可以给不同长度,所以,在Java语言中,可以做到二维数组的各行长度可以是不同,
。
所以,我们对于二维以上的数组遍历时,也可以用如下方式:
j < matrix[j].length
这样的条件判断,这样才能遍历完二维以上的数组!
那么,在C语言中,我们未对一个定义的变量赋初值,那么这个变量内存储的是“垃圾数据”,这一点,在Java中是否也一样呢?
我们通过一段代码来探索下:
package com.mec.study;
import com.mec.study.complex.Complex;
public class AboutArray {
public static void main(String[] args) {
int[] array1 = {1, 2, 3, 4};
for(int i = 0; i < array1.length; i++) {
System.out.print(array1[i] + " ");
}
System.out.println();
double[] array2 = new double[10];
for(int i = 0; i < array2.length; i++) {
System.out.print(array2[i]);
}
System.out.println();
Complex array3[];
array3 = new Complex[5];
for(int i = 0; i < array3.length; i++) {
System.out.print(array3[i] + " ");
}
System.out.println();
}
}
我们上述代码运用了.length方法,这个方法的功能是,返回该数组 或 该链表的长度
我们能够得出一个结论:
当我们定义了一个数组时,系统将自动为其各成员赋值为:0、0.0、flase 和 null
那么,谈及数组,本人就不得不来讲解下八大排序了:
请观看本人博文——《Java数组 —— 八大排序》
那么,数组的基本初始化方法我们就讲解完了。
数组在Java中也是 “类”,并且 这与C语言中的数组有非常大的差别。
Java语言对于数组有专门封装好的类——Arrays类
现在,本人就来讲解下Arrays类:
Arrays类:
请观看本人博文——《详解 Arrays类》
接下来,本人来介绍一下数组的 clone() 与 “浅克隆”
数组类 中提供了一个clone()方法,顾名思义:克隆。
但是,这里的克隆 是 “浅克隆”,那么,什么是“浅克隆”呢?
浅克隆:
首先,本人先来介绍一下浅克隆的几个注意点:
- 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口;
- Cloneable接口只不过是一个标识接口而已,没有任何方法;
- 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份;
- 对象的浅克隆也不会调用到构造方法。
- 浅克隆 在数组中的应用可理解为 只克隆数组元素的值。
相信看到上述解释的大多数同学并没有理解什么是“浅克隆”,那么,现在,本人通过一段代码来让同学们了解下 浅克隆 的本质:
package com.mec.study;
import com.mec.study.complex.Complex;
public class AboutArray {
public static void main(String[] args) {
Complex array[] = new Complex[5];
for(int i = 0; i < array.length; i++) {
array[i] = new Complex(i, 0);
}
System.out.println("array 克隆前各元素的值: ");
for(int i = 0; i < array.length; i++) {
System.out.print((i == 0 ? "" : ",") + array[i]);
}
System.out.println();
Complex arr[] = array.clone();
System.out.println("arr 是 array 克隆结果: ");
for(int i = 0; i < array.length; i++) {
System.out.print((i == 0 ? "" : ",") + arr[i]);
}
System.out.println();
array[0].setReal(100);
System.out.println("array 更改后的结果: ");
for(int i = 0; i < array.length; i++) {
System.out.print((i == 0 ? "" : ",") + array[i]);
}
System.out.println();
System.out.println("arr 竟然也变化了: ");
for(int i = 0; i < array.length; i++) {
System.out.print((i == 0 ? "" : ",") + arr[i]);
}
System.out.println();
}
}

可以看到,我明明重新申请了一个arr[],但是改变array[]数组的值,arr[]数组中的值也会发生改变。
这就是“浅克隆”。
array初始化时,对每一个Complex对象申请了实例空间,而每一个Complex对象就是申请的实例空间的首地址;clone()方法 “克隆”的只是array数组的每一个元素本身的值(即 一个对象的首地址值),所以,克隆出的arr数组,表面上是独立于array数组,但其元素却指向array各元素所指向的同一Complex实例空间。这就是“浅克隆”。
尤其是当我们定义了一个二维数组时,我们在使用clone()时小心啦!!!
那么,关于数组的基本知识点就讲解完成了,可见,Java中的数组,和C语言中的数组,还是有很大差别的。有封装好的工具类使用起来真的比较方便。
若是对上述知识点或代码有任何疑惑、意见或者建议,请在下方评论区提出,本人将尽早予以答复,觉得有所帮助的同学请留下小赞赞,谢谢!!!
详解 普通数组 —— Arrays类 与 浅克隆的更多相关文章
- 详解JavaScript数组过滤相同元素的5种方法
详解JavaScript数组过滤相同元素的5种方法:https://www.jb51.net/article/114490.htm
- 数组 Arrays类
1.数组是一组变量集合,用来存储相同数据类型的一组数据的连续的空间. *数组名(标识符)连续空间首地址. *元素下标标明元素在数组中的位置,从0开始. *每个元素都可以通过下标来访问. *数组长度固定 ...
- Android Studio 插件开发详解二:工具类
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自[赵彦军的博客] 在插件开发过程中,我们按照开发一个正式的项 ...
- 详解C++中基类与派生类的转换以及虚基类
很详细!转载链接 C++基类与派生类的转换在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中 ...
- 详解 ServerSocket与Socket类
(请观看本人博文 -- <详解 网络编程>) 目录 ServerSocket与Socket ServerSocket 类: Socket类: ServerSocket与Socket 首先, ...
- 17 数组 Arrays类
Arrays类 概念 数组的工具类java.util.Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作 ...
- Java虚拟机详解(九)------类文件结构
我们知道计算机是由晶体管.电路板等组装而成的电子设备,而这些电子设备其实只能识别0与1的信号. 那么问题来了,我们在操作系统上编写的Java代码(由字母.数字等各种符号组成),打包后部署到服务器上,是 ...
- Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释
上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用 首先来看一下C++中的sayHello方法的实现: JNIEXPO ...
- Java IO详解(一)------File 类
File 类:文件和目录路径名的抽象表示. 注意:File 类只能操作文件的属性,文件的内容是不能操作的. 1.File 类的字段 我们知道,各个平台之间的路径分隔符是不一样的. ①.对于UNIX平台 ...
随机推荐
- RDD的Cache、Persist、Checkpoint的区别和StorageLevel存储级别划分
为了增强容错性和高可用,避免上游RDD被重复计算的大量时间开销,Spark RDD设计了包含多种存储级别的缓存和持久化机制,主要有三个概念:Cache.Persist.Checkout. 1.存储级别 ...
- maven resource filter 说明和配置方法
<maven> <dependencies> <dependency> ... </dependency> </dependencies> ...
- AC自动机(初步学习)
一开始讲AC自动机就是在字典树上做一个KMP,吓得我感觉好难,不过了解了以后,感觉也就是有点难度,不吓人. 它只是在字典树上用了KMP的思想 典型问题:给n个模式串和一个文本串,问有多少个模式串在文本 ...
- flask中 多对多的关系 主从表之间的的增删改查
# 角色表模型class Role(db.Model): r_id = db.Column(db.Integer, primary_key=True) r_name = db.Column(db.St ...
- 学习笔记-EL
仅作为学习过程中笔记作用,若有不正确的地方欢迎指正 目标 理解El的作用,熟练使用EL EL表达式与Jsp表达式对比来记 EL表达式的概念,作用,语法 Jsp作用主要是用来实现动态网页的,而动态网页中 ...
- Prism 源码解读7-导航
介绍 Prism提供了一个非常强大的功能导航,导航的意思就是指定对应的View显示.这个导航的强大之处有: 可以设置导航前后的动作 可以指定View实例的生命周期,可以是否导航到新的View实例 提供 ...
- 对oracle里面clob字段里面xml的增删改查学习
这段时间,我使用系统表里面有clob字段里面存放的xml信息,我们如何对xml进行增删改查操作呢,自己参考了很多也学到很多,给大家分享一下 首先我们先建测试表 CREATE TABLE EFGP_23 ...
- vulnhub~DC-9
首先对于整体的思路,网上有很多的教程,如果国内的不能满足建议‘fanqiang’,Google有很多大佬,各个部分都有详细的说明.但又由于每个人的环境都有所不同,所以会在同样的命令行执行后出现不同的错 ...
- springboot项目下的Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
今天遇到mybatis-puls的报错Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (n ...
- PTA数据结构与算法题目集(中文) 7-20
PTA数据结构与算法题目集(中文) 7-20 7-20 表达式转换 (25 分) 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个 ...