Java基础(第五期): 一维数组 二维数组 数组 引用数据类型在内存中的存储图解

news2024/11/26 9:44:32

Java基础专栏

Java基础(第五期)

一、数组介绍和静态初始化

数组(Array):数组指的是一种容器,可以用来存储同种数据类型的多个值。

今后若要操作多数据,同种数据类型就可以考虑数组。

1.1 数组初始化
  • 初始化:就是在内存中,为数组开辟空间,并将数据存入容器中的过程。
1.2 数组的定义格式

格式一:

数据类型[] 数组名
int[] array

格式二:

数据类型 数组名[]
int array[]
        // 创建一个整数类型的数组变量
        int[] array;
        int array1 [];
1.3 数组的静态初始化格式

一种是完整格式,一种是简化格式

package com.liujintao.array;

public class ArrayDemo1 {
    public static void main(String[] args) {
        arrayTest1();
    }

    public static void arrayTest1() {
        // 完整写法
        int[] arr1 = new int[]{11,22,33};
        double[] arr3 = new double[] {11,22,33};

        // 简写方法
        int[] arr2 = {11,22,33};
        double[] arr4 = {11,22,33};

        System.out.println(arr2);
        System.out.println(arr4);

        /*
            [I@58ceff1    →  [ : 表示数组类型   →    I: 表示数据类型首字母大写   →   @  分隔符   →   后面的就是十六进制内存地址
            [D@7c30a502     →  [ : 表示数组类型   →    I: 表示数据类型首字母大写   →   @  分隔符   →   后面的就是十六进制内存地址
         */
    }
}

  • 注意看一下注释!!!

二、 数组元素访问

想要访问数组里面的元素,就只有用到索引。

  • 格式:数组名[索引]
  • 注意:数组索引从 0 开始
package com.liujintao.array;
    /*
        数组元素索引:
            数组名[索引号]
            索引号从0开始哦!
     */
public class ArrayDemo2 {
    public static void main(String[] args) {
        arrayTest();
    }

    public static void arrayTest()   {
        int [] arr = {11,22,33,44,55};
        // 1、访问数组 元素 33
        System.out.println(arr[2]); // 33

        // 2、判断数组中第一个元素是奇数还是偶数
        if (! (arr[0] % 2 == 0)) {
            System.out.println("是奇数");
        } else {
            System.out.println("是偶数");
        }

        // 3、修改数组中第三个元素为 66
        arr[2] = 66;
        System.out.println(arr[2]);  // 66

        // 4、根据数组中第四个元素,System.out.pritnln多少次
        for (int i = 1; i <= arr[3]; i++) {
            System.out.println("Hello World"); // 输出 44 次
        }
    }
}

  • 用需求引用知识点,加深和巩固。

三、数组遍历操作

遍历:就是将数组里面的所有元素进行访问。

length:动态的获取数组长度。

package com.liujintao;
    /*
        数组遍历:
            将数组每一个(所有)的内容,取出来进行操作。
     */
public class ArrayTest1 {
    public static void main(String[] args) {
        printArray();
    }

    public static void printArray() {
        int[] arr = {11, 22, 33, 44, 55};
        // 注意 length:是数组的长度,用法就是直接点(注意数组下标越界)
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

  • length的使用需要注意。这样防止写死。在很多编程语言中都会有的。

四、数组遍历求和等练习

1.求出数组中所有偶数元素的和

    /*
        需求: 对数组中的偶数元素 做求和操作。
            每一个:就得用遍历
     */
    public static void getSum() {
        int[] arr = {11, 22, 33, 44, 55, 66, 77, 88, 99, 100};
        int sum = 0;
        // 使用技巧: 遇到数组和循环,初始值从0开始,并且最大条件就用length,不行我们再改
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % 2 == 0) {
                sum += arr[i];
                System.out.println(arr[i]);
            } else {
                sum += arr[i]; // 595
            }
        }
        System.out.println("数组中所有的偶数和为:" + sum);
    }
2.数组求最大值

需求:数组有 5 个元素,,请找出数组中的最大值并打印。

package com.liujintao.array;
    /*
        需求:数组有 5 个元素,,请找出数组中的最大值并打印。
     */
public class ArrayTest2 {
    public static void main (String[] args) {
        int[] arr = {5, 44, 33, 55, 22};
        int result = getMax(arr); // 只需要传递数组名
        System.out.println("数组中最大值为:" + result);  // 55
    }

    public static int getMax(int[] arr) { // 这里使用整数类型的数组变量接收
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (max < arr[i]) {
                max = arr[i];
            }
        }
        return max;
    }
}

3、处理班级学生成绩

成绩为: int[] arr = {100, 50, 20, 90, 90};

1、找出数组最大值,并打印

2、找出数组最小值,并打印

3、求总成绩,并打印

4、计算出平均值,并打印

5、统计低于平均值的元素个数

package com.liujintao.test;

public class ArrayTest3 {
    public static void main(String[] args) {
        int[] arr = {100, 50, 20, 90, 90};
        handleSchool(arr);

    }

    public static void handleSchool(int[] arr) {
        int max = handleMax(arr);
        int min = handleMin(arr);
        int sum = handleSum(arr);
        double average = handleAverage(arr);
        int count = handleCount(arr, average);

        System.out.println("最高分为:" + max);
        System.out.println("最低分为:" + min);
        System.out.println("总成绩为:" + sum);
        System.out.println("平均成绩为:" + average);
        System.out.println("低于平均分的个数为:" + count);
    }

    // 1、求最大值
    public static int handleMax(int[] arr) {
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (max < arr[i]) {
                max = arr[i];
            }
        }
        return max;
    }


    // 2、求最小值
    public static int handleMin(int[] arr) {
        int min = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (min > arr[i]) {
                min = arr[i];
            }
        }
        return min;
    }

    // 3、求总成绩
    public static int handleSum(int[] arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }

    // 4、求平均值
    public static double handleAverage(int[] arr) {
        double average = 0;
        double sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return average = sum / arr.length;  // 自动转换
    }

    // 5、统计低于平均值的个数
    public static int  handleCount(int[] arr, double average) {
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] < average) {
                count++;
            }
        }
        return count;
    }
}

/*
    运行结果为:
        最高分为:100
        最低分为:20
        总成绩为:350
        平均成绩为:70.0
        低于平均分的个数为:2
 */
  • 这里使用方法封装功能进行模块化实现功能。

五、数组动态初始化

动态初始化:就是在我们创建数组初始化的时候,系统会默认分配默认值(初始值)

格式:数据类型[] 数组名 = new 数据类型[长度]

默认返回的类型为:

默认值分类:
整数: 0;

​ 小数: 0.0

​ 布尔:false


​ 字符: ’\u0000‘ → Unicode字符 → 打印的话就是空白

​ 字符串: null

​ 引用数据类型: null (数组、类、接口)都是引用数据类型

int[] arr = new int[3];

六、两种初始化的区别

  • 动态初始化:手动指定数组长度,有系统给出默认初始值
  • 静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组长度。

应用场景

  • 动态初始化用于明确个数,不明确具体值

需求1:输入5名学生的成绩,并打印出来。

    public static void handleInput() {
        Scanner sc = new Scanner(System.in);
        int[] arr = new int[5];
        System.out.println("请输入5名学生的成绩:");
        for (int i = 0; i < arr.length; i++) {
            System.out.println("请输入第" + (i + 1) + "名学生的成绩:");
            arr[i] = sc.nextInt();
            System.out.println("第" + (i + 1) + "名学生的成绩为:" + arr[i]);
        }
    }

需求2:产生10个 1- 100 之间的随机数,并且求出最小值。

    public static int getRandomMin() {
        Random r = new Random();

        int[] arr = new int[10]; // 动态初始化数组长度(因为我们知道了长度)
        for (int i = 0; i < arr.length; i++) {
            int num = r.nextInt(100) + 1;
            arr[i] = num;
        }
        // 得到是个随机数,求出数组中的最小值
        int min = 0;
        for (int i = 1;i < arr.length; i++) {
            min = arr[i];
            if (min > arr[i]) {
                min = arr[i];
            }
        }
        return min;
    }
  • 静态初始化用于明确具体指,不明确个数的场景

需求:求出 班級人数的总分 100,50,20,40,90

int[] arr = {100, 50, 20, 40, 90};
int sum = 0;
for (int i = 0; i < arr.length; i++) {
    sum += arr[i];
}
System.out.println("班级总成绩为:" + sum);

七、数组内存图和方法参数传递

    public static void main (String[] args) {
        int[] arr = {11, 22, 33, 44, 55};
        System.out.println("调用change方法之前:" + arr[0]);   // 11
        change(arr);
        System.out.println("调用change方法之前:" + arr[0]);   // 66
    }
    public static void change(int[] arr) {
        arr[0] = 66;
    }

一维数组内存图

引用数据类型

  • 如果是普通数据类型,必须得有return 返回值,否则,修改不了数据哦!

在这里插入图片描述

经过上面的内存图分析:

       int[] arr = {11, 22, 33, 44, 55};
        int[] arr1 = arr;
        arr1[0] = 99;
        System.out.println(arr[0]); // 99
  • 知道为什么等于99吗?

不知道的继续往上看内存图。

八、二维数组静态初始化

  • 二维数组是一种容器,该容器用于存放一维数组。

存放多组数据,又属于同种数据,那么就可以考虑二维数组来进行维护。

8.1 二维数组的静态初始化

定义二维数组和使用二维数组。

// 语法定义格式   
int[][] arr = {
                {11, 22, 33},
                {33, 44, 55}
        };

// 访问二维数据里面的一维数组
System.out.println(arr[0]);  // [I@58ceff1 (存放在堆空间二维数组里面的地址)


// 访问二维数组里面的一维数组
System.out.println(arr[0][0]); // 11
8.2 二维数组的遍历

下面这样操作直接遍历的是一维数组的地址

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);     // 打印的是一维数组的地址
        }

正确方法

遍历二维数组的操作:
1、先遍历二维数组拿到每一个一维数组。
2、然后遍历一维数组中的下标即可。

        for (int i = 0; i < arr.length; i++) {
//            System.out.println(arr[i]);     // 打印的是一维数组的地址
            for (int j = 0; j < arr[i].length; j++) {
                System.out.println(arr[i][j]);
            }
        }

二维数组练习:
需求:对一个任意一个整数类型的二位数组求和:

    public static int getSum (int[][] arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                sum += arr[i][j];
            }
        }
        return sum;
    }


        int result = getSum(arr);
        System.out.println("二维数组的和为:" + result);   // 二维数组的和为:198

8.3 二维数组动态初始化

二维数组动态初始化:
格式: 数据类型[][] 数组名 = new 数据类型[m][n]
+ m: 这个二位数组中可以存放多少个一维数组(一维数组地址)
+ n:指定一维数组可以存放多少个元素

               // 如下就是动态创建一个二维数组
            int[][] arr = new int[2][3];

            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                    System.out.println(arr[i][j]);    // 打印结果为 0 0 0 0 0 0
                }
            }
        }
  • 注意:动态初始化,我们存放值是不是有点麻烦啊!

那么此时我们可以将一维数组赋值给二维数组

        // 将提前定义好的一维数组,赋值给二维数组
        int[] arr1 = {1, 2, 3};
        int[] arr2 = {4, 5, 6};
        int[][] arr = new int[2][3];
        arr[0] = arr1;
        arr[1] = arr2;

二维数组内存图

在这里插入图片描述

  • Java基础(第五期)到此结束…

下期综合的练习数组和巩固联系。下期见!

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

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

相关文章

深入详解高性能消息队列中间件 RabbitMQ

目录 1、引言 2、什么是 RabbitMQ &#xff1f; 3、RabbitMQ 优势 4、RabbitMQ 整体架构剖析 4.1、发送消息流程 4.2、消费消息流程 5、RabbitMQ 应用 5.1、广播 5.2、RPC VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&am…

【工具使用-信号叠加演示】一种演示不同频率信号叠加的工具

一&#xff0c;简介 本文主要介绍一种网页演示不同频率的正弦信号叠加的工具&#xff0c;供参考。 二&#xff0c;说明 网址&#xff1a;https://teropa.info/harmonics-explorer/ 打开后可以设置不同的信号&#xff0c;然后最上面是不同信号的频率叠加之后的效果&#xff…

Blender vs 3ds Max:谁才是3D软件的未来

在不断发展的3D建模和动画领域&#xff0c;两大软件巨头Blender和3ds Max一直在争夺顶级地位。 随着技术的进步和用户需求的演变&#xff0c;一个重要问题逐渐浮出水面&#xff1a;Blender是否最终会取代3ds Max&#xff1f;本文将深入探讨二者各自的优势和劣势、当前状况&…

2024好用免费的mac苹果电脑杀毒软件CleanMyMac

杀毒软件在苹果家族中是一个小众软件&#xff0c;百度搜索苹果电脑杀毒软件&#xff0c;可能各种杀软良莠不齐&#xff0c;因为在这个市场非常小&#xff0c;绝大多数都是冲着“清理”去的&#xff0c;而不是杀毒。最近测试了一款Mac电脑杀毒软件&#xff0c;杀毒效果也是一般般…

WebDAV之π-Disk派盘 + MiXplorer

MiXplorer是一款非常强大实用的手机文档管理器,能给用户提供了一系列的文档处理功能,包括本地文件浏览、文件排序、文件筛选、切换视图、新建文件、添加收藏等等,同时还能将你手机里的所有文件都罗列出来,简洁明了,让用户一眼就能够找到相应的文件并对其进行编辑,或是删除…

YOLOv5:通过真实结果的txt文件与预测结果的txt文件进行结果评估

YOLOv5&#xff1a;通过真实结果的txt文件与预测结果的txt文件进行结果评估 前言前提条件相关介绍项目结构YOLOv5&#xff1a;通过真实结果的txt文件与预测结果的txt文件进行结果评估val_txt.py输出结果 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批…

Istio快速入门

Istio快速入门 目录 文章目录 Istio快速入门目录本节实战前言1、安装安装方式1.使用 istioctl install2.使用 istioctl manifest generate 安装3.使用 Helm 安装4.使用 Istio Operator 安装 安装 Istio&#x1f6a9; 实战&#xff1a;istioctl 方式安装istio-2023.11.3(测试成功…

SRC实战 | CORS跨资源共享漏洞

CORS跨资源共享 跨源资源共享 (CORS) 是一种浏览器机制&#xff0c;允许网页使用来自其他页面或域的资产和数据。 大多数站点需要使用资源和图像来运行它们的脚本。这些嵌入式资产存在安全风险&#xff0c;因为这些资产可能包含病毒或允许服务器访问黑客。 CORS响应头 CORS通…

物联网AI MicroPython学习之语法 sys系统相关

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; sys 介绍 sys 模块中提供了与micropython运行环境有关的函数和变量。 常量说明 常量定义常量说明sys.argv当前程序启动的可变参数列表sys.byteorder字节顺序 (‘little’ - 小端&#xff0c; ‘big’ - 大…

深入理解强化学习——多臂赌博机:10臂测试平台

分类目录&#xff1a;《深入理解强化学习》总目录 为了大致评估贪心方法和 ϵ − \epsilon- ϵ−贪心方法相对的有效性&#xff0c;我们将它们在一系列测试问题上进行了定量比较。这组问题是2000个随机生成的 k k k臂赌博机问题&#xff0c;且 k 10 k10 k10。在每一个赌博机问…

Python的切片操作详细用法解析

在利用Python解决各种实际问题的过程中&#xff0c;经常会遇到从某个对象中抽取部分值的情况&#xff0c;切片操作正是专门用于完成这一操作的有力武器。理论上而言&#xff0c;只要条件表达式得当&#xff0c;可以通过单次或多次切片操作实现任意切取目标值。切片操作的基本语…

【计算机架构】程序指令计数 | 功耗计算 | 电力功耗 | 安德尔定律(Amdahl‘s Law)

0x00 程序的指令计数 程序的指令计数&#xff08;Instruction Count&#xff09;由程序本身、ISA&#xff08;指令集架构&#xff09;和编译器决定。这表示一个程序中包含的指令数量受到程序编写方式、计算机体系结构和编译器的影响。 每条指令的平均周期数&#xff08;Averag…

如何更改IP地址为美国IP?美国静态住宅代理如何搭建?

相信很多做跨境电商或外贸如TikTok shop、Facebook商店、Amazon、领英的玩家都需要搭建独享的美国IP环境来运营店铺&#xff0c;那么如何搭建稳定独享的IP环境呢&#xff1f;加下来为你详细介绍&#xff0c;助力您的跨境业务。 一、选择合适的代理IP 代理IP可以帮助隐藏用户真…

XSS漏洞利用工具BeEF

BeEF是Browser Exploitation Framework的缩写。随着人们越来越多地关注针对包括移动客户端在内的客户端的网络传播攻击&#xff0c;BeEF使专业的渗透测试人员可以使用客户端攻击向量来评估目标环境的实际安全状况。与其他安全框架不同&#xff0c;BeEF超越了硬化的网络边界和客…

breach1靶机攻略

breach1 准备 这个靶机ip固定为 192.168.110.140 使用vmware的话&#xff0c;将它加入一张仅主机的网卡就行&#xff0c;比如vmnet7&#xff0c;然后vmnet设置成192.168.110.0网段&#xff0c;kali也新建一张网卡加入该网卡 扫描 nmap --min-rate 10000 -p- 192.168.110.1…

登录Tomcat控制台,账号密码输入正确但点击登录没反应不跳转到控制台页面

在tomcat-users.xml里面可以查看登录tomcat控制台的账号密码&#xff0c;如果账号密码输入正确还是登录不进去&#xff0c;则很有可能是tomcat的账号被锁了&#xff08;可在catalina.xxx.log里面查看&#xff09;。tomcat账号被锁定后默认情况是不访问控制台后5分钟自动解锁&am…

第六章:Property-based Testing and Test Oracles

文章目录 Test OraclesActive and Passive Test OraclesTypes of Test OraclesFormal, executable specificationsSolved examplesMetamorphic oraclesAlternative implementations (备用实现)Heuristic oracles (启发式)The Golden Program!Oracle Deviation (Oracle偏差)T…

Rust编程基础之引用与借用

1.引用与借用 在上一章节最后的代码中, 我们必须将 String 返回给调用函数&#xff0c;以便在调用 calculate_length 后仍能使用 String&#xff0c;因为 String 被移动到了 calculate_length 内。相反我们可以提供一个 String 值的引用&#xff08;reference&#xff09;。引…

BGF-YOLO | 增强版YOLOV8 | 用于脑瘤检测的多尺度注意力特征融合

基于You Only Look Once(YOLO)的目标检测器在自动脑瘤检测中展现出卓越的准确性。在本文中,我们开发了一种新的BGF-YOLO架构,通过将双层路由注意力(BRA)、广义特征金字塔网络(GFPN)和第四检测头整合到YOLOv8中来实现。BGF-YOLO包含了一个注意力机制,用于更加关注重要的…

北马“破3收割机”,特步成赛场和市场双面“赢家”

北马已经落下帷幕&#xff0c;尽管当天全国共有20多场城市马拉松开跑&#xff0c;但作为国内第一个城市马拉松&#xff0c;有“国马”之称的北马&#xff0c;还是赛事的中心点。北马相关的所有标签&#xff0c;都会在跑圈内外引起足够多的讨论&#xff0c;比如一双跑鞋——顶级…