我们在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()方法,顾名思义:克隆。

但是,这里的克隆 是 “浅克隆”,那么,什么是“浅克隆”呢?

浅克隆:

首先,本人先来介绍一下浅克隆的几个注意点:

  1. 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口;
  2. Cloneable接口只不过是一个标识接口而已,没有任何方法;
  3. 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份;
  4. 对象的浅克隆也不会调用到构造方法
  5. 浅克隆 在数组中的应用可理解为 只克隆数组元素的值

相信看到上述解释的大多数同学并没有理解什么是“浅克隆”,那么,现在,本人通过一段代码来让同学们了解下 浅克隆 的本质:

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类 与 浅克隆的更多相关文章

  1. 详解JavaScript数组过滤相同元素的5种方法

    详解JavaScript数组过滤相同元素的5种方法:https://www.jb51.net/article/114490.htm

  2. 数组 Arrays类

    1.数组是一组变量集合,用来存储相同数据类型的一组数据的连续的空间. *数组名(标识符)连续空间首地址. *元素下标标明元素在数组中的位置,从0开始. *每个元素都可以通过下标来访问. *数组长度固定 ...

  3. Android Studio 插件开发详解二:工具类

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自[赵彦军的博客] 在插件开发过程中,我们按照开发一个正式的项 ...

  4. 详解C++中基类与派生类的转换以及虚基类

    很详细!转载链接 C++基类与派生类的转换在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中 ...

  5. 详解 ServerSocket与Socket类

    (请观看本人博文 -- <详解 网络编程>) 目录 ServerSocket与Socket ServerSocket 类: Socket类: ServerSocket与Socket 首先, ...

  6. 17 数组 Arrays类

    Arrays类 概念 数组的工具类java.util.Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作 ...

  7. Java虚拟机详解(九)------类文件结构

    我们知道计算机是由晶体管.电路板等组装而成的电子设备,而这些电子设备其实只能识别0与1的信号. 那么问题来了,我们在操作系统上编写的Java代码(由字母.数字等各种符号组成),打包后部署到服务器上,是 ...

  8. Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

    上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用 首先来看一下C++中的sayHello方法的实现: JNIEXPO ...

  9. Java IO详解(一)------File 类

    File 类:文件和目录路径名的抽象表示. 注意:File 类只能操作文件的属性,文件的内容是不能操作的. 1.File 类的字段 我们知道,各个平台之间的路径分隔符是不一样的. ①.对于UNIX平台 ...

随机推荐

  1. 听说用 Lombok 可以早点下班?

    听说隔壁用 Lombok 的六点就下班了,我也想六点下班! 好的,那么这篇文章就介绍下什么是 Lombok,Lombok 做了什么以及 Lombok 是怎么做的? 在介绍之前,先通过是否使用 Lomb ...

  2. 支持向量机(Support Vector Machine)

    本博客是针对Andrew NG在Coursera上发布的Machine Learning课程SVM部分的学习笔记. 目录 前言 最优化目标(Optimization Objective) 最大化边界的 ...

  3. python win32com

    要使用Python控制MS Word,您需要先安裝win32com套件,這個套件可以到 http://sourceforge.net/projects/pywin32/ 找到.本文假設您已經正確安裝w ...

  4. BZOJ 压力 tarjan 点双联通分量+树上差分+圆方树

    题意 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量. 他们每天都生活在巨大的压力之下.小强建立了一个模型.这世界上有N个网络设备, ...

  5. stm32CubeMx+TrueSTUDIO+uc/os-III移植开发(一)

    自从接触到stm32cubemx后,发现使用起来很方便,用来做项目开发的话,由于是图形化操作界面,工作效率比较快.如果要学习操作系统,以前的IDE如keil,IAR等IDE对操作系统的代码调试起来不够 ...

  6. OpenCV-Python 霍夫圈变换 | 三十三

    学习目标 在本章中, 我们将学习使用霍夫变换来查找图像中的圆. 我们将看到以下函数:cv.HoughCircles() 理论 圆在数学上表示为(x−xcenter)2(y−ycenter)2=r2(x ...

  7. WeChat-SmallProgram:组件 scroll-view 横向和纵向 案例

    scroll-view为滚动视图,分为水平滚动和垂直滚动.注意滚动视图垂直滚动时一定要设置高度否则的话scroll-view不会生效. 滚动视图常用的地方一般都是Item项比较多的界面,比如我的模块 ...

  8. +load 和 +initialize

    APP 启动到执行 main 函数之前,程序就执行了很多代码. 执行顺序: 将程序依赖的动态链接库加载到内存 加载可执行文件中的所有符号,代码 runtime 解析被编译的符号代码 遍历所有的 cla ...

  9. Python中的编码及操作文件

    ------------恢复内容开始------------ 1,字符编码 ASCII  用1个字符来表示所有的英文字母和特殊符号 GB2313(GBK)用2个字符来表示英文字母及中文字符,且决定如果 ...

  10. Python数据库MySQL之数据备份、pymysql模块

    一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接 ...