【爪洼岛冒险记】第5站:多图解,超详细讲解Java中的数组、二维数组--建议收藏

news2024/11/24 13:08:11

在这里插入图片描述

🌱博主简介:是瑶瑶子啦,一名大一计科生,目前在努力学习JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛!
📜所属专栏:爪洼岛冒险记【从小白到大佬之路】
✈往期博文回顾: 【爪洼岛冒险记】第4站:Java中如何进行控制台输入&输出?用Java实现猜数字小游戏;超详细讲解Java中的方法:方法的重载,方法的签名
🕵️‍♂️近期目标:成为千粉小博主。
🙇‍♀️写博客理念:力求用自己的语言加上自己的理解去阐述知识知识、技术。喜欢画图、思维导图去描述过程和知识之间的联系。
🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!
🌺:“再牛的程序员也是从小白开始,既然开始了,就全身心投入去学习技术”

爪洼岛冒险记-第4站

  • 🧜‍♀️上一站快速回顾:
  • Part1:初识数组(array):
    • 1.1:什么是数组?
  • Part2:Java中的数组
    • 2.1:数组的定义:
      • 2.1.1:定义数组并初始化:
      • 2.1.2:定义数组,不初始化:
    • 2.2:数组的基本使用:
      • 2.2.1:获取数组长度(元素个数):
      • 2.2.2:访问数组元素:
      • 2.2.3:遍历数组:
    • 2.3:深入理解Java中数组
      • 2.3.1:数组在内存中如何存放?
      • 2.3.2:关于“引用”
  • Part3:Java中的二维数组:
    • 3.1:二维数组的定义&初始化:
      • 3.1.1:定义数组并初始化:
      • 3.1.2:定义数组不初始化
    • 3.2:如何理解Java中的二维数组:
    • 3.3:二维数组的遍历:
  • Part4:总结:

🧜‍♀️上一站快速回顾:

在这里插入图片描述

🐳上一站中重点:

  • Java中如何生成随机数?
  • 什么是随机数流?
  • 什么是随机数种子?
  • Java中的方法
  • 什么是方法的重载?
  • 重载的规则?

🐱‍💻尝试用Java写出汉诺塔问题–方法的递归

  public static void move(char pos1,char pos2){
        System.out.println(pos1+"--->"+pos2);
    }
    /**
     *
     * @param n 盘子个数
     * @param pos1 盘子所放的起始位置
     * @param pos2 盘子移动所借助的中间柱子
     * @param pos3 盘子的目标位置
     */
    public static void hanoiTower(int n,char pos1,char pos2,char pos3){
        if(n==1){
            move(pos1,pos3);
        }
        else{
            hanoiTower(n-1,pos1,pos3,pos2);
            move(pos1,pos2);
            hanoiTower(n-1,pos2,pos1,pos3);
        }
    }
    public static void main(String[] args) {
        hanoiTower(3,'a','b','c');
    }

😻今天,瑶瑶子将带领大家全面学习Java中第一个数据结构—数组,绝对详细,绝对清晰,一遍学会!那么这就启航~
在这里插入图片描述

🌴本站任务:
🙆‍♀️write int the front:
🥫🎊

  • 了解Java中的数组概念
  • 学习Java中一维数组
  • 学习Java中二维数组

Part1:初识数组(array):

1.1:什么是数组?

  • 🍧数组的概念
    数组是存储相同类型数据的集合
    在这里插入图片描述
  • 🙇‍♀️数组的特点:
    1.元素在内存中位置相邻,为顺序存储.
    2.数组中每一个元素都有对应编号(元素下标)

    在这里插入图片描述
    在这里插入图片描述
    注意:这里为了方便表示,是把内存单元当作4字节来画的,实际上内存的最小单元是1字节.

Part2:Java中的数组

2.1:数组的定义:

2.1.1:定义数组并初始化:

int[] arr = {1,2,3,4,5};
int[] arr = new int[]{1,2,3,4,5};

2.1.2:定义数组,不初始化:

int[] arr = new int[3];
//定义一个数组,元素个数为3,默认初始化为0
  • 注意:
    • 定义时:type+[]表示Java中的一种数据类型,即数组,表示type类型数据的集合,[]中不可写入数字哦。
    • 数组是一种引用数据类型,数组中的数据存在于上。
    • 数组在Java中也是一个对象,所以可以用new来创建数组–实例化一个对象。

2.2:数组的基本使用:

2.2.1:获取数组长度(元素个数):

int[] arr = {1,2,3,4,5};
int len = arr.length;//数组名.length 即可获取数组长度(元素个数)
System.out.println(len);

2.2.2:访问数组元素:

  • 下标访问:
int[] arr = {1,2,3,4,5};
System.out.println(arr[3]);
//4

注意:下标的有效范围是[0,arr.length),访问时下标一旦越界,编译时直接抛出异常。

2.2.3:遍历数组:

  • 普通for循环+数组下标:
int[] arr = {1,2,3,4,5};
for (int i = 0,;i < arr.length;i++){
	System.out.print(arr[i]+" ");
}
  • 增强for循环(for-each):
int[] arr = {1,2,3,4,5};
for ( int x :arr ){
	System.out.print(x+" ");
}

🙋‍♀️如何理解for each循环?
:”左边的变量,负责接收数组中元素的值。随着遍历,x的值也不断发生改变。(左边的相当于一个容器,负责接收for each 循环按顺序遍历出元素的值)
🤷‍♀️什么时候使用for-each循环?
当你只是想通过遍历来获取数组元素时,而不牵涉下标,这个时候,可以选择使用for-each循环~

  • 借助java.util.Arrays(操作数组的工具类)
import java.util.Arrays;

public class TestDemo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        String str = Arrays.toString(arr);
        System.out.println(str);
    }
}

在这里插入图片描述
🧘‍♀️其实String toString(int[] arr)方法就是用for循环来实现的

//toString(int[] a)源码:
 public static String toString(int[] a) {
        if (a == null)
            return "null";
        int iMax = a.length - 1;
        if (iMax == -1)
            return "[]";

        StringBuilder b = new StringBuilder();
        b.append('[');
        for (int i = 0; ; i++) {
            b.append(a[i]);
            if (i == iMax)
                return b.append(']').toString();
            b.append(", ");
        }
    }

2.3:深入理解Java中数组

2.3.1:数组在内存中如何存放?

🤸‍♀️首先,你需要知道:

  • JVM内存分布:
    在这里插入图片描述

  • Java中的局部变量存放在栈区

  • Java中的对象存放在堆区

  • Java中数组类型变量,是引用数据类型

  • Java中数组是一个对象

🐣然后,我们分析这段代码:

int[] arr = {1,2,3,4,5};
  • arr 是main函数中的局部变量,存放在堆上
  • 数组实体(数组实例,也就是对象),存放在堆上
    在这里插入图片描述
    👯‍♀️总结:
  • 数组类型是引用数据类型,数组类型变量存放的是数组实例在堆内存中的地址。

2.3.2:关于“引用”

  • 引用其实本质就是对象的地址
  • 一个引用类型变量只能储存一个对象的地址(即一个引用只能指向一个对象)
  • 引用类型变量置为null说明这个引用(引用变量)不指向任何对象
  • 引用类型变量不一定都在栈上。(后期讲)

注意:Java中的null表示无效引用,没有规定null表示的是0号内存。(C语言中规定NULL表示的是0号内存,不能被访问)。

Part3:Java中的二维数组:

3.1:二维数组的定义&初始化:

3.1.1:定义数组并初始化:

//eg:一个2行3列的数组
int [][] arr = {{1,2,3},{4,5,6}};
  • 注意:外层大括号里表示行的内存花括号不可省略!
int [][] arr = new int [][]{{1,2,3},{4,5,6}};
int [][] arr = new int [][]{{1,2},{4,5,6}};

💁‍♀️第二行是这样理解的:
在这里插入图片描述

🙅‍♀️也就是说,并不是arr[0][2]没有初始化,而是根本不存在arr[0][2]这个元素!
在这里插入图片描述

3.1.2:定义数组不初始化

//每一个元素默认初始化为0
int [][] arr1 = new int[2][3];
//省略列的(不规则二维数组)
int [][] arr2 = new int[2][0];
arr[0] = new int[2];
arr[1] = new int[3];
  • 注意:Java中二维数组可以省略列,但不能省略行!
  • 省略列时:
    在这里插入图片描述

3.2:如何理解Java中的二维数组:

  • 二维数组其实是一个特殊的一维数组:即元素类型是数组引用的数组(int [ ])。
    在这里插入图片描述

  • 行/列下标对应关系:
    在这里插入图片描述

  • 注意:两个/多个一维数组作为数组元素时,数组实体在堆内存上并没有物理位置上的相邻关系。
    比如下图的元素3和元素4在内存中很有可能是不相邻的。

在这里插入图片描述

3.3:二维数组的遍历:

  • 普通for循环+数组下标遍历:
public static void main(String[] args) {
        int[][] arr = {{1,2,3},{4,5,6}};
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j]+" ");
            }
        }
    }
  • for-each循环:
public static void main(String[] args) {
        int[][] arr = {{1,2,3},{4,5,6}};
        for (int[] ret:arr) {
            for (int x:ret) {
                System.out.print(x+" ");
            }
        }
    }
  • 使用Arrays.deepToString(Object [ ])
public static void main(String[] args) {
        int[][] arr = {{1, 2, 3}, {4, 5, 6}};
        String strArr = Arrays.deepToString(arr);
        System.out.println(strArr);
    }

Part4:总结:

  • 一维数组类型是引用数据类型,该类型变量存放的是一维数组实例在堆内存上的地址。
  • 二维数组本质是一维数组,二维数组的每一个元素均为一维数组类型(引用数据类型)

🏄‍♀️下期预告–详细讲解Java中最重要的语法–类&对象
🙆‍♀️专栏系列文章:

  • 【爪洼岛冒险记】第4站:Java中如何进行控制台输入&输出?用Java实现猜数字小游戏;超详细讲解Java中的方法:方法的重载,方法的签名
  • 【爪洼岛冒险记】第3站:任务1:学会int和String之间的转换;任务2:将Java运算符全部收入囊中~ 任务3:拿下Java中的类型提升
  • 【爪洼岛冒险记】第2站:带你学会:Java中三种输出语句,java中基本数据类型,学会变量,常量,类型转换知识点
  • 【爪洼岛冒险记】第1站:Java重要特性,JDK,JRE,JVM区别和联系,环境变量

🙈原创不易,如果对你有所帮助,还请三连+关注!我是瑶瑶子,持续输出优质文章!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GD32F427开发板试用】RT-THREAD标准版 移植使用

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;打盹的消防车 前言&#xff1a; 无意在微信看到了GD做活动&#xff0c;想到了第一时间体验一下&#xff0c;搭配RT-THREAD&#xff0c;也很方…

【Java】【系列篇】【Spring源码解析】【三】【体系】【BeanDefinition体系】

整体结构图 1. BeanDefinition 用于保存 Bean 的相关信息&#xff0c;包括属性、构造方法参数、依赖的 Bean 名称及是否单例、延迟加载等&#xff0c; 它是实例化 Bean 的原材料&#xff0c;Spring 就是根据 BeanDefinition 中的信息实例化 Bean。 2. 我们获取对象的方式一般有…

AioDnsBrute:一款功能强大的异步DNS爆破工具

关于AioDnsBrute AioDnsBrute是一款功能强大的异步DNS爆破工具&#xff0c;该工具基于Python 3.5开发&#xff0c;并使用了asyncio库以实现针对目标域名的异步爆破。 该工具的运行速度非常快&#xff0c;在一台小型VPS主机上&#xff0c;可以实现在1.5-2分钟之内处理大约10万…

【计数DP】P4933 大师

这道是洛谷官方题单的简单DP为啥我放上来呢&#xff0c;因为我因为各种各样的细节原因没做出来感觉计数的DP有点点难&#xff0c;得多写了P4933 大师 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)题意&#xff1a;思路&#xff1a;第一眼肯定是设dp[i][j]为以a[i]为结尾&…

8. 【Redisson源码】分布式信号量RSemaphore

目录 一、RSemaphore的使用 二、RSemaphore设置许可数量 三、RSemaphore的加锁流程 四、RSemaphore的解锁流程 【本篇文章基于redisson-3.17.6版本源码进行分析】 基于Redis的Redisson的分布式信号量RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法。 …

从首个「数实融合」公益球场,看元宇宙奏响创新「三重奏」

作者 | 曾响铃 文 | 响铃说 2022年的元宇宙&#xff0c;一半是海水&#xff0c;一半是火焰。 一边是刮起元宇宙热潮的Roblox股价跌去大半&#xff0c;Meta也因元宇宙亏损深陷泥潭。另一边&#xff0c;经过2021年元宇宙概念落地和普及&#xff0c;2022年却也是元宇宙相关产业…

分享86个PHP源码,总有一款适合您

PHP源码 分享86个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 86个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1fsoGdkr_-wZUaJvVMOlihQ?pwdlhyo 提取码&#xff…

Java 泛型是什么?一文带你吃透泛型

文章目录1. Java 泛型2. 泛型类3. 泛型接口4. 泛型方法5. 泛型集合Java编程基础教程系列1. Java 泛型 Java 泛型是 JDK1.5 中引入的一个新特性&#xff0c;其本质是参数化类型&#xff0c;把类型作为参数传递。其主要的形式有泛型类&#xff0c;泛型接口和泛型方法。泛型概念的…

sqoop安装(linux)

一、前期准备安装好hadoop伪分布安装好MySQL下载sqoop压缩文件实验环境&#xff1a;实验环境版本CentOS 6.5MySQL5.7.37hadoop3.3.0sqoop1.4.7sqoop1.4.7 下载链接&#xff1a;https://pan.baidu.com/s/16AUdtBmSv7OG2PTyA1XcgQ?pwdqu7lmysql驱动包下载地址&#xff1a;https:…

易于设置的倒计时页面Easy countdown

今天开始放假了 什么是 Easy countdown &#xff1f; Easy countdown 是一个易于设置的倒计时页面。可以设置为倒计时或计时器。 先看看官方提供的动图 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 easy-countdown &#xff0c;选择第一个 yooooomi/easy-countdown&am…

【前端学习指南】基础开发环境搭建

&#x1f36d; Hello&#xff0c;我是爱吃糖的范同学 邻近春节&#xff0c;虽然学校的事情已经处理的差不多了&#xff0c;又开始要忙着找实习......时间安排上还是有很多问题&#xff0c;希望大家多多包涵&#xff0c;我已经加班加点在写作了&#x1f602;&#x1f602;&…

高盐废水如何处理,离子交换树脂在高盐废水中的应用

什么是高盐废水&#xff1f; 高盐废水是工业废水中较常见的一种&#xff0c;它是指总含盐量(以NaCl计&#xff09;至少为1%的废水&#xff0c;属于难处理的废水之一。 高盐废水中的总溶解固体物TDS&#xff0c;多在10000-25000mg/L&#xff0c;含盐成分复杂&#xff0c;有Na、…

vue3中echarts组件的最佳封装形式

项目中经常用到echarts&#xff0c;不做封装直接拿来使用也行&#xff0c;但不可避免要写很多重复的配置代码&#xff0c;封装稍不注意又会过度封装&#xff0c;丢失了扩展性和可读性。始终没有找到一个好的实践&#xff0c;偶然看到一篇文章&#xff0c;给了灵感。找到了一个目…

【数据结构】并查集

目录1.概述2.代码实现3.应用本文参考&#xff1a; LABULADONG 的算法网站 《数据结构教程》&#xff08;第 5 版&#xff09;李春葆主编 1.概述 &#xff08;1&#xff09;并查集支持查找一个元素所属的集合以及两个元素各自所属的集合的合并运算。当给出两个元素的一个无序对…

氨氮废水如何处理,离子交换树脂在氨氮废水中的应用点

近几年来重点污染源考核结果及地表水监测结果表明&#xff0c;氨氮超标现象仍较严重。认清氨氮的来源&#xff0c;了解其危害&#xff0c;采取有效的处理措施成为保护水环境不被氨氮污染的必要环节。 北京科海思科技有限公司利用离子交换特种树脂可以做到有针对性的氨氮的去除…

vue2之生命周期

生命周期 生命周期是指组件从创建&#xff0c;运行到销毁的阶段。而生命周期函数&#xff08;也叫生命周期钩子&#xff09;是vue在关键的时刻帮我们调用的一些特殊名称的函数&#xff0c;会根据生命周期的阶段&#xff0c;依次执行。 beforeCreatecreatedbeforeMountmountedb…

基本的SELECT语句与显示表结构

文章目录基本的SELECT语句SELECT...SELECT ... FROM列的别名去除重复行空值参与运算着重号查询常数(查询同时添加常数字段)显示表结构过滤数据练习题基本的SELECT语句 SELECT… SELECT 11, 22;# 直接这样写相当于下面这句 SELECT 11, 22 FROM DUAL; # 这里DUAL&#xff1a;伪…

【云攻防系列】从攻击者视角聊聊K8S集群安全(上)

前言 作为云原生管理与编排系统的代表&#xff0c;Kubernetes&#xff08;简称K8S&#xff09;正受到越来越多的关注&#xff0c;有报告[1]显示&#xff0c;96% 的组织正在使用或评估 K8S&#xff0c;其在生产环境下的市场占有率可见一斑。 K8S 的功能十分强大&#xff0c;其…

day38【代码随想录】动态规划之斐波那契数、爬楼梯、使用最小花费爬楼梯

文章目录前言一、斐波那契数&#xff08;力扣509&#xff09;二、爬楼梯&#xff08;力扣70&#xff09;三、使用最小花费爬楼梯&#xff08;力扣746&#xff09;总结前言 1、斐波那契数 2、爬楼梯 3、使用最小花费爬楼梯 一、斐波那契数&#xff08;力扣509&#xff09; 思路…

详解C语言预处理

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C/C】 本文目录程序的翻译环境和执行环境翻译环境&#xff08;C语言程序的编译链接&#xff09;执行&#xff08;运行&#xff09;环境…