【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

目录
相关文章
|
2月前
|
人工智能 安全 Java
Java和Python在企业中的应用情况
Java和Python在企业中的应用情况
75 7
|
2月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
190 3
|
21天前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
56 2
|
2月前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
202 6
|
1月前
|
监控 Java 数据库连接
Java线程管理:守护线程与用户线程的区分与应用
在Java多线程编程中,线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。这两种线程在行为和用途上有着明显的区别,了解它们的差异对于编写高效、稳定的并发程序至关重要。
43 2
|
2月前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
77 6
|
2月前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
65 2
|
2月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
2月前
|
Java 测试技术 API
Java 反射机制:深入解析与应用实践
《Java反射机制:深入解析与应用实践》全面解析Java反射API,探讨其内部运作原理、应用场景及最佳实践,帮助开发者掌握利用反射增强程序灵活性与可扩展性的技巧。
142 4
|
2月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
81 6