【一步一步了解Java系列】:何为数组,何为引用类型

简介: 【一步一步了解Java系列】:何为数组,何为引用类型

看到这句话的时候证明:此刻你我都在努力

加油陌生人

1.png

数组

数组是一推相同数据类型组合在一起的集合,数组是引用类型数据,比如int[10] arr; 就是一个储存着10个int类型的一个集合,这就是数组。


那么数组有什么用呢?它存在的意义是什么呢?

在我看来数组的作用就像我们生活中用来装各种种类的盒子,比如有些盒子是装一些笔,有些是装一些书,有些是在装一些化妆品等等,他们的作用无非就是让我们使用时更加方便,不会因为分散而到处去找。数组也是一样的作用,极大减少了我们程序员对数据寻找去使用的时间。为我们更好的储存数据。比如:我们的通讯录也是运用数组来完成的。

一维数组

一维数组是数组中比较简单的数组,那么他和C语言的数组一样吗?今天我们就对标一下C语言中的数组,来探索一下Java中的数组与C语言中的数组有何不同?


我们可以看一下下面这一段代码:

public static void main(String[] args) {
    int[] arr1={1,2,3,45};
    int[] arr2=new int[]{1,2,3,45,6};
    int[] arr3=new int[10];
    System.out.println(arr1);
    System.out.println(arr2);
    System.out.println(arr3);

    

}

首先我们看一下上面的三种一维数组的定义方法,其中第一第二种其实可以说是同一种,这两种方法就是在定义数组的同时给数组进行初始化,大家也看到第二种比第一种的写法较为繁杂,但效果都是一样的,所以我们建议如果直接给数据初始化的话我们用第一种定义方法即可。

然后就是第三种方法就是定义一个元素长度为10的数组。与C语言不同在C语言中如果要定义一个元素长度为10的整形数组的代码是:int arr[10];

讲解完定义方法我们可以在思考一下接下来的打印结果:会不会打印数组出来呢?

然后下面是输出的结果:


很显然从打印结果来看,编译器并没有把数组打印出来,而是打印出了一串数字,符号和字母的组合,那么这是什么呢?这时候我就又要把C语言扯出来说事了。


其实这就类似C语言中的数组的地址,可能有小伙伴就比较疑惑了,不是说Java中没有地址吗?

emmm,按我的理解的话,Java并非没有地址,而是不运用地址,Java中是没有对数据地址操作的相关操作,也就是不用地址对程序进行处理。


那么我们该如何打印出来呢?

第一种方法:对数组的每个成员元素进行遍历打印。arr1.length可以得到数组的长度

如下:

public static void main(String[] args) {
    int[] arr1={1,2,3,45};
    int[] arr2=new int[]{1,2,3,45,6};
    int[] arr3=new int[10];
    System.out.println(arr1);
    System.out.println(arr2);
    System.out.println(arr3);



    for (int i = 0; i <arr1.length ; i++) {
        System.out.print(arr1[i]+" ");

    }
    System.out.println();
    for (int i = 0; i <arr2.length ; i++) {
        System.out.print(arr2[i]+" ");

    }

    System.out.println();

    for (int i = 0; i <arr3.length ; i++) {
        System.out.print(arr3[i]+" ");

    }
    System.out.println();
    
    }

需要注意的是arr3我们是对它定义的方法没有给它赋初值,所以默认数组里面的值全为0

第二种方法:利用我们Java中现成包的输出方法——将数组转化为字符串进行输出。

如下:

public static void main(String[] args) {
    int[] arr1={1,2,3,45};
    int[] arr2=new int[]{1,2,3,45,6};
    int[] arr3=new int[10];
    System.out.println(arr1);
    System.out.println(arr2);
    System.out.println(arr3);


    System.out.println(Arrays.toString(arr1));
    System.out.println(Arrays.toString(arr2));
    System.out.println(Arrays.toString(arr3));
    
    }


Java中数组是引用类型

首先我们要说Java中数组与C语言数组有什么区别,那么这里就要谈到引用。

对标一下C语言数组的区别Java中的数组有什么不同呢?

  1. Java中数组是可以做为返回类型的
public static int[] func1(){
    int[] arr={1,2,3,4,5,6};
    for (int i = 0; i <arr.length ; i++) {
        arr[i]*=2;
    }
    return arr;
}


public static void main(String[] args) {
    System.out.println(Arrays.toString(func1()));
}

  1. Java中的数组是储存的元素是存放在堆区上,而数组名存放在栈区指向堆区的那块储存元素的地址,在Java中叫做引用。


三、局部数组变量本身在方法结束时,变量本身是会被销毁的,但数组本身的元素可能还是会存在于内存中。如果数组中的元素是对象,且对象没有被其它引用所引用,那么它就会可能会被Java内部的垃圾回收器回收,可理解为C语言中的free函数。


扩展:引用类型可以是null,他表示空引用。 基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值; 而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。

数组的一些方法使用

一、转化为字符串

public static void main(String[] args) {
    int[] arr={1,23,4,5,6};
    String a=Arrays.toString(arr);
    System.out.println(a);
}

二、数组的拷贝方法

public static void main(String[] args) {
    int[] arr1={1,2,3,45,};

    int[] arr2=Arrays.copyOf(arr1,arr1.length);
    
    System.out.println(Arrays.toString(arr2));    //注意这里arr1与arr2不是同一个数组
                                                    // 这里copyOf创建出了一个新的数组
    


}


三、数组的排序方法

public static void main(String[] args) {
    int[] arr={21,12,4,7,33,98,56,1};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
}


二维数组

二维数组与一维数组有什么区别呢?

在我看来二维数组就是一个比较长的一维数组,他是几个一维数组的拼接。实际上在内存中二维数组就是一维数组似的一整块,只不过给这个二维数组在一些地方分割了。

相信我这么讲是比较抽象的,下面我就用一些代码和图解让大家更好理解我上面的话:

上图中我用了arr[2][3]举例画出了,两种二维数组的储存图,那么为了加深记忆我接下来会给大家再次举几个代码的例子:

public static void main(String[] args) {
       int[][] arr1={{1,2,3,4},{12,4,6,8}};
       int[][] arr2=new int[2][3];
       int[][] arr3=new int[2][];   //不规则二维数组


        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        System.out.println(Arrays.toString(arr3));
    }
}


如上代码:可能大家伙又感到奇怪了,怎么好像有打印出地址了?还有第三种arr3的定义方式是怎么回事?

其实我们只需要牢记:二维数组就是由几个一维数组拼接而成。那么这里打印的就是那三个二维数组里的6个一维数组的地址了。

当然我们发现arr3的顶义方式是与C语言截然不同的,Java中可以省略列,不能省略行,而C语言则相反。

而且打印出来时两个空引用,这说明了这个二维数组的拼接的那两个二维数组还没有引用到堆区的一块数组。所以我们叫他”不规则二维数组“。


那么该如何正确打印二维数组呢?

两种方法:

第一种方法:将二维数组拆分为一维数组,在用一维数组的打印方法打印出来,二位数组中arr.length就是求二维数组中的行,也就是有几个一维数组。

public static void main(String[] args) {
   int[][] arr1={{1,2,3,4},{12,4,6,8}};
   int[][] arr2=new int[2][3];
   int[][] arr3=new int[2][];   //不规则二维数组

    for (int i = 0; i <arr1.length ; i++) {
        System.out.println(Arrays.toString(arr1[i]));

    }


    System.out.println("-----------------------");

    
    for (int i = 0; i <arr2.length ; i++) {
        System.out.println(Arrays.toString(arr2[i]));

    }

第二种方法:还是用现成包的方法转化为字符串进行输出。

public static void main(String[] args) {
    int[][] arr1={{1,2,3,4},{12,4,6,8}};
    int[][] arr2=new int[2][3];


    System.out.println(Arrays.deepToString(arr1));
    System.out.println(Arrays.deepToString(arr2));
}

从开始讲二维数组,到现在,其实可以得到一个总结:在Java中已经把二维数组是由一维数组拼接而成这句话给表现得淋漓尽致。

好了这次数组的知识就到这里了。喜欢的话就点个赞吧。

目录
相关文章
|
1天前
|
存储 Java
什么是带有示例的 Java 中的交错数组?
什么是带有示例的 Java 中的交错数组?
18 9
|
5天前
|
存储 算法 Java
Java一分钟之-数组的创建与遍历
数组作为Java中存储和操作一组相同类型数据的基本结构,其创建和遍历是编程基础中的基础。通过不同的创建方式,可以根据实际需求灵活地初始化数组。而选择合适的遍历方法,则可以提高代码的可读性和效率。掌握这些基本技能,对于深入学习Java乃至其他编程语言的数据结构和算法都是至关重要的。
17 6
|
2天前
|
存储 XML Java
如何在 Java 中将常见文档转换为 PNG 图像数组
如何在 Java 中将常见文档转换为 PNG 图像数组
8 1
|
12天前
|
存储 安全 Java
Java数组(Arrays)详解
Java 中的数组是一种用于存储固定数量同类型数据的高效数据结构,支持连续内存存储和随机访问。数组可以声明并初始化,通过索引访问和修改元素,获取长度,使用循环遍历,支持多维形式,并可通过 `Arrays` 类的方法进行复制和排序。数组具有固定大小和类型安全的特点,但需注意越界等问题。灵活运用数组能显著提升编程效率。
|
26天前
|
存储 Java 数据处理
Java 数组的高级用法
在 Java 中,数组不仅可以存储同类型的数据,还支持多种高级用法,如多维数组(常用于矩阵)、动态创建数组、克隆数组、使用 `java.util.Arrays` 进行排序和搜索、与集合相互转换、增强 for 循环遍历、匿名数组传递以及利用 `Arrays.equals()` 比较数组内容。这些技巧能提升代码的灵活性和可读性,适用于更复杂的数据处理场景。
|
27天前
|
存储 Java
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
38 2
|
4天前
|
存储 机器学习/深度学习 Java
【Java】数组详解
【Java】数组详解
18 0
|
18天前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
2月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
42 0
|
5月前
|
前端开发 Java
java前端:删除数组中指定元素的方法
java前端:删除数组中指定元素的方法