【Java探索之旅】基本类型与引用类型 数组的应用 二维数组

简介: 【Java探索之旅】基本类型与引用类型 数组的应用 二维数组

📑前言

在编程中,了解基本数据类型和引用数据类型的区别是非常重要的,这有助于我们更好地理解变量的存储方式和数据操作过程。数组作为一种常见的数据结构,在Java中扮演着重要的角色,掌握数组的基本用法和应用场景有助于我们更高效地处理数据和进行程序设计。此外,二维数组作为数组的延伸,也具有自己的特点和用法,深入理解二维数组可以拓展我们对数组的认识和应用能力。  

一、基本类型与引用类型

1.1 区别

基本数据类型创建的变量:称为基本变量,该变量空间中直接存放的是其所对应的值;

引用数据类型创建的变量:一般称为对象的引用,其空间中存储的是对象所在空间的地址。

public static void main() {
    int a = 10;
    int b = 20;
    int[] arr = new int[]{1,2,3};
}

在上述代码中,a、b、arr,都是函数内部的变量,因此其空间都在main方法对应的栈帧中分配。a、b是内置类型的变量,因此其空间中保存的就是给该变量初始化的值。

array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。

引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象。有点类似C语言中的指针,但是Java中引用要比指针的操作更简单。

1.2 引用变量

public static void func() {
    int[] array1 = new int[3];
    array1[0] = 10;
    array1[1] = 20;
    array1[2] = 30;
    int[] array2 = new int[]{1,2,3,4,5};
    array2[0] = 100;
    array2[1] = 200;
    array1 = array2;
    array1[2] = 300;
    array1[3] = 400;
    array2[4] = 500;
    for (int i = 0; i < array2.length; i++) {
        System.out.println(array2[i]);
    }
}

1.3 认识null

null 在 Java 中表示 “空引用” , 也就是一个不指向对象的引用

int[] arr = null;
System.out.println(arr[0]);
// 执行结果
Exception in thread "main" java.lang.NullPointerException
     at Test.main(Test.java:6)

null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作. 一旦尝试读写, 就会抛出 NullPointerException.

二、数组的应用场景

2.1 保存数据

public static void main(String[] args) {
        int[] array = {1, 2, 3};
        for(int i = 0; i < array.length; ++i){
                System.out.println(array[i] + " ");
        }
}

2.2 作为方法的参数

传参基本数据类型

public static void main(String[] args) {
        int num = 0;
        func(num);
        System.out.println("num = " + num);
}
public static void func(int x) {
        x = 10;
        System.out.println("x = " + x);
} // 执行结果
        x = 10
        num = 0
在func方法中修改形参 x 的值, 不影响实参的 num 值

传参数组类型(引用类型)

public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        func(arr);
        System.out.println("arr[0] = " + arr[0]);
}
public static void func(int[] a) {
        a[0] = 10;
        System.out.println("a[0] = " + a[0]);
} // 执行结果
        a[0] = 10
        arr[0] = 10
func方法内部修改数组的内容, 方法外部的数组内容也发生改变.
因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的。

作为函数的返回值

//斐波那契数组
public static int[] fib(int n){
    if(n <= 0){
        return null;
    } int[] array = new int[n];
    array[0] = array[1] = 1;
    for(int i = 2; i < n; ++i){
        array[i] = array[i-1] + array[i-2];
    } 
    return array;
}
public static void main(String[] args) {
    int[] array = fib(10);
    for (int i = 0; i < array.length; i++) {
        System.out.println(array[i]);
    }
}

2.3 小结

所谓的 “引用” 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大)

三、二维数组

3.1 概念

二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组。可以理解成二维数组是一维数组的数组。

3.2 基本语法

数据类型[][] 数组名称 = new 数据类型 行数{ 初始化数据 };  行数不可省略,列数可以省略  

二维数组的用法和一维数组并没有明显差别

3.3 代码示例

public static void main(String[] args) {
    int[][] array = new int[2][3];
    array[0] = new int[] {1,2,3};
    array[1] = new int[] {4,5,6};
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[0].length; j++) {
            System.out.print(array[i][j]+" ");
        }
        System.out.println();
    }
    for (int[] num : array) {
        for (int x: num) {
            System.out.print(x+" ");
        }
    }
    System.out.println();
    System.out.println(Arrays.deepToString(array));
}

🌤️全篇总结

通过学习基本数据类型和引用数据类型的区别,我们能够更清晰地理解变量在内存中的存储方式,以及对数据的操作方式。数组作为一种重要的数据结构,在不同场景下具有不同的应用方式,包括保存数据、作为方法参数传递和作为函数返回值等。二维数组则是一种在一维数组基础上延伸出的数据结构,通过理解二维数组的概念和基本语法,我们可以更灵活地处理多维数据。

33dcadccda9a4327a9541c4fd95c09fd.png

目录
相关文章
|
4天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
26 7
|
6天前
|
前端开发 Java 测试技术
Java一分钟之Spring MVC:构建Web应用
【5月更文挑战第15天】Spring MVC是Spring框架的Web应用模块,基于MVC模式实现业务、数据和UI解耦。常见问题包括:配置DispatcherServlet、Controller映射错误、视图解析未设置、Model数据传递遗漏、异常处理未配置、依赖注入缺失和忽视单元测试。解决这些问题可提升代码质量和应用性能。注意配置`web.xml`、`@RequestMapping`、`ViewResolver`、`Model`、`@ExceptionHandler`、`@Autowired`,并编写测试用例。
293 3
|
6天前
|
Java 测试技术
Java一分钟之-正则表达式在Java中的应用
【5月更文挑战第14天】正则表达式是Java中用于文本处理的强大力量,通过`java.util.regex`包支持。常见问题包括元字符的理解、边界匹配和贪婪/懒惰量词的使用。错误通常涉及未转义特殊字符、不完整模式或过度匹配。要避免这些问题,需学习实践、使用在线工具和测试调试。示例代码展示了如何验证邮箱地址。掌握正则表达式需要不断练习和调试。
26 2
|
1天前
|
Java 程序员 API
Java 8 Lambda 表达式和Stream API:概念、优势和实战应用
【5月更文挑战第20天】在Java 8中,Lambda 表达式和Stream API是两个非常强大的特性,它们显著改变了Java程序员处理数据和编写代码的方式。本篇技术文章将深入探讨这些特性的概念、优点,并提供实战示例,帮助理解如何有效地利用这些工具来编写更简洁、更高效的代码。
18 6
|
2天前
|
并行计算 Java API
Java 8中的接口默认方法和静态方法以及并行数组
【5月更文挑战第19天】Java 8引入了许多新特性,其中包括接口的默认方法和静态方法,以及并行数组的能力。这些特性增强了Java的面向对象编程模型和数组处理能力。让我们深入了解它们的概念和实践。
20 2
|
3天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【5月更文挑战第18天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将了解线程池的基本概念,应用场景,以及如何优化线程池的性能。通过实例分析,我们将看到线程池如何提高系统性能,减少资源消耗,并提高系统的响应速度。
13 5
|
3天前
|
算法 搜索推荐 Java
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
【5月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
31 8
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
|
4天前
|
存储 Java 测试技术
滚雪球学Java(32):如何理解和实现稀疏数组
【5月更文挑战第7天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
14 1
滚雪球学Java(32):如何理解和实现稀疏数组
|
5天前
|
安全 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第16天】 在移动开发领域,性能一直是开发者关注的焦点。随着Kotlin语言的普及,其与Java在Android应用中的性能表现成为热门话题。本文将深入分析Kotlin和Java在Android平台上的性能差异,并通过实际测试数据来揭示二者在编译速度、应用启动时间以及运行效率方面的表现。我们的目标是为开发者提供一个参考依据,以便在选择合适的编程语言时做出更加明智的决策。
|
6天前
|
Java 开发工具 Maven
java解析apk获取应用信息
请注意,你需要替换"path/to/your/apkfile.apk"为你的APK文件的实际路径。
12 0