首页 > 其他分享 >day05 数组和二维数组

day05 数组和二维数组

时间:2024-11-10 13:16:49浏览次数:3  
标签:arr int 元素 day05 33 二维 数组

今日内容

  • 数组
  • 二维数组

教学目标

能够知道数组的概念和作用

能够使用数组的两种初始化方式

能够通过索引访问数组元素

能够完成数组的遍历

能够理解数组在内存中的操作过程

能够看懂数组常见的问题并知道如何解决

能够完成数组的常见操作(求和、求最值)

能够使用二维数组的两种初始化方式

能够对二维数组进行元素访问

第八章 数组

8.1 数组介绍

数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。

8.2 数组的定义

8.2.1 第一种格式

数据类型[] 数组名

示例:

int[] arr;        
double[] arr;      
char[] arr;

8.2.2 第二种格式

数据类型 数组名[]

示例:

int arr[];
double arr[];
char arr[];

8.3 数组的静态初始化

8.3.1 什么是初始化

就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程。

8.3.2 静态初始化格式

  • 完整版格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};

  • 简化版格式
数据类型[] 数组名 = {元素1,元素2,...};

示例代码:

// 数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素2...};
// 创建了一个int类型的数组, 数组名叫arr, 数组中存储了 11 22 33 这个三个数据.
int[] arr = new int[]{11, 22, 33};
System.out.println(arr);

// 数据类型[] 数组名 = {元素1, 元素2, 元素2...};
double[] dArr = {12.3, 22.3, 33.3};
System.out.println(dArr);

8.4 数组元素访问

8.4.1 什么是索引

每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。

这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。

8.4.2访问数组元素格式

数组名[索引];

示例代码:

int[] arr = {11, 22, 33, 44, 55};

// 需求1: 将元素44取出来打印在控制台
System.out.println(arr[3]);

// 需求2: 修改0号元素位置元素为66, 修改后取出并打印.
arr[0] = 66;
System.out.println(arr[0]);

8.5 数组遍历

概念:

遍历:将数组中所有的内容取出来,取出来之后可以(打印,求和,判断..)。

注意事项:

  • 遍历指的是取出数据的过程,不要局限的理解为,遍历就是打印!
  • 数组的长度属性:arr.length
  • IDEA快速生成遍历的方式:数组名 + fori 回车

代码示例:

int[] arr = {11, 22, 33, 44, 55, 33, 44, 55, 33, 44, 55, 33, 44};
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

练习1:

  • 需求:已知数组元素为 {11,22,33,44,55} 请将数组中偶数元素取出并求和,最后打印求和结果
  • 分析:
    1.静态初始化数组
    2.定义求和变量
    3.遍历数组取出每一个元素
    4.判断当前元素是否是偶数,是的话跟求和变量做累加操作
    5.打印求和变量
  • 示例代码:

public class Test1 {
    /*
        需求:已知数组元素为 {11,22,33,44,55}
	            请将数组中偶数元素取出并求和,最后打印求和结果

	    分析:
            1. 定义求和变量
            2. 静态初始化数组
            3. 遍历数组取出每一个元素
            4. 判断当前元素是否是偶数,是的话跟求和变量做累加操作
            5. 打印求和变量

     */
    public static void main(String[] args) {
        // 1. 定义求和变量
        int sum = 0;
        // 2. 静态初始化数组
        int[] arr = {11, 22, 33, 44, 55};
        // 3. 遍历数组取出每一个元素
        for (int i = 0; i < arr.length; i++) {
            // 4. 判断当前元素是否是偶数,是的话跟求和变量做累加操作
            if (arr[i] % 2 == 0) {
                sum += arr[i];
            }
        }

        // 5. 打印求和变量
        System.out.println(sum);
    }
}

练习2:

  • 需求:已知数组元素为 {5,44,33,55,22} 请找出数组中最大值并打印在控制台

分析:
1. 假设数组中第一个元素就是最大值
2. 遍历数组, 取出每一个元素 (准备进行比较)
3. 逐个进行比较,找到更大的,max变量记录更大的数据
4. 找到了更大了, 让max, 记录这个更大的元素
5. 打印最大值

  • 示例代码:

public class ArrayTest2 {
    /*
        需求:已知数组元素为 {5,44,33,55,22} 请找出数组中最大值并打印在控制台
     */
    public static void main(String[] args) {
        int[] arr = {5, 44, 33, 55, 22};

        // 1. 假设数组中第一个元素就是最大值
        int max = arr[0];

        // 2. 遍历数组, 取出每一个元素 (准备进行比较)
        for (int i = 1; i < arr.length; i++) {
            // 3. 比较
            if(arr[i] > max){
                // 4. 找到了更大了, 让max, 记录这个更大的元素
                max = arr[i];
            }
        }

        // 5. 打印最大值
        System.out.println("最大值为:" + max);
    }
}

8.6 数组动态初始化

8.6.1 什么是动态初始化

数组动态初始化就是只给定数组的长度,由系统给出默认初始化值

8.6.2 动态初始化格式

数据类型[] 数组名 = new 数据类型[数组长度];

int[] arr = new int[3];

8.6.3 动态初始化格式详解

  • 等号左边:
    • int:数组的数据类型
    • []:代表这是一个数组
    • arr:代表数组的名称
  • 等号右边:
    • new:为数组开辟内存空间
    • int:数组的数据类型
    • []:代表这是一个数组
    • 5:代表数组的长度

代码 :

// 数据类型[] 数组名 = new 数据类型[数组的长度];
int[] arr = new int[3];

System.out.println(arr[0]);  //  0
System.out.println(arr[1]);  //  0
System.out.println(arr[2]);  //  0

arr[0] = 11;
arr[1] = 22;
arr[2] = 33;

System.out.println(arr[0]);  //  0
System.out.println(arr[1]);  //  0
System.out.println(arr[2]);  //  0

8.7 内存分配

8.7.1 内存概述

内存是计算机中的重要原件,临时存储区域,作用是运行程序。

我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。

必须放进内存中才能运行,运行完毕后会清空内存。

Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

8.7.2 java中的内存分配

  • 目前我们只需要记住两个内存,分别是:栈内存和堆内存?
    | 区域名称   | 作用                                                       |
    | ---------- | ---------------------------------------------------------- |
    | 寄存器     | 给CPU使用,和我们开发无关。                                |
    | 本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。          |
    | 方法区     | 存储可以运行的class文件。                                  |
    | 堆内存     | 存储对象或者数组,new来创建的,都存储在堆内存。            |
    | 方法栈     | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。 |
    |||

8.8.1 一个数组的内存图

8.8.2 两个数组指向相同空间内存图

8.9 数组常见两个小问题

8.9.1 索引越界异常

当访问了数组中不存在的索引,就会引发索引越界异常。

代码示例:

int[] arr = {11, 22, 33};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[10]);//当访问了数组中不存在的索引,就会引发索引越界异常。

核心点:

要知道索引的范围。

  • 最小索引:0
  • 最大索引:数组的长度 - 1

8.9.2 空指针异常

当引用数据类型变量被赋值为null之后,地址的指向被切断,还继续访问堆内存数据,就会引发空指针异常

代码示例:

int[] arr = new int[2];
arr = null;
System.out.println(arr[0]);

内存图解:

第九章 二维数组

9.1 二维数组介绍

概述:

二维数组也是一种容器,该容器存储的都是一维数组容器。

一维数组可以看成是装数据的小箱子。然后我们把小箱子放到一个大箱子当中,这个大箱子就是二维数组。

使用场景:

某公司季度和月份统计的数据如下:单位(万元)
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99

分析:

这样的数据我们就可以用二维数组,定义四个一维数组装每个月的数据。

然后再把四个一维数组放到二维数组当中。

9.2 二维数组静态初始化

完整格式 :

数据类型[][] 变量名 = new 数据类型[][]{ {元素1, 元素2...} , {元素1, 元素2...}

简化格式 :

数据类型[][] 变量名 = { {元素1, 元素2...} , {元素1, 元素2...} ...};

代码示例:

//完整格式
int[][] arr = new int[][]{{11,22},{33,44}};

//简写格式:
int[][] arr = {{11,22,33}, {44,55,66}};

9.3 二维数组元素访问

格式:

数组名[m][n]

解释:

数组名:就是二维数组的名字。

m:表示二维数组中第几个一维数组。(从0索引开始计算)

n:表示一维数组中第几个元素。(从0索引开始计算)

代码示例:

//定义一个二维数组
int[][] arr = {{11,22,33}, {44,55,66}};

//0表示获取二维数组中0索引上的一维数组。
//2表示获取该一维数组中2索引上的元素。
System.out.println(array[0][2]);

11.3 二维数组遍历

需求 :

已知一个二维数组 arr = {{11, 22, 33}, {33, 44, 55}};

遍历该数组,取出所有元素并打印

步骤 :

  1. 遍历二维数组,取出里面每一个一维数组
  1. 在遍历的过程中,对每一个一维数组继续完成遍历,获取内部存储的每一个元素

代码示例:

int[][] arr = {{11, 22, 33}, {33, 44, 55}};
// 1. 遍历二维数组,取出里面每一个一维数组
for (int i = 0; i < arr.length; i++) {
    // 2. 在遍历的过程中,对每一个一维数组继续完成遍历,获取内部存储的每一个元素
    for (int j = 0; j < arr[i].length; j++) {
        System.out.println(arr[i][j]);
    }
}

9.4 二维数组动态初始化

格式:

数据类型[][] 变量名 = new 数据类型[m][n];
m表示这个二维数组,可以存放多少个一维数组
n表示每一个一维数组,可以存放多少个元素

代码示例:

int[][] arr = new int[3][3];

// 向二维数组中存储元素
arr[0][0] = 11;
arr[0][1] = 22;
arr[0][2] = 33;

arr[1][0] = 11;
arr[1][1] = 22;
arr[1][2] = 33;

arr[2][0] = 11;
arr[2][1] = 22;
arr[2][2] = 33;

//遍历二维数组
for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr[i].length; j++) {
        System.out.println(arr[i][j]);
    }
}

9.5 二维数组内存图

核心点:

二维数组实际存储的是一维数组的地址值。

内存图:

9.6 二维数组案例-打乱二维数组

  • 需求:将一维数组
    int[] nums = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
    打乱后,存入二维数组中
  • 分析:
    1.动态初始化二维数组,准备存储打乱后的数据
    2.打乱一维数组
    3.将一维数组中,打乱后的元素,存入二维数组
    4.遍历并打印二维数组数据
  • 代码实现:

import java.util.Random;

public class Test7 {
    /*
        需求:将一维数组
            int[] nums = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
            打乱后,存入二维数组中


        分析:
            1. 动态初始化二维数组,准备存储打乱后的数据
            2. 打乱一维数组
            3. 将一维数组中,打乱后的元素,存入二维数组
            4. 遍历并打印二维数组数据

     */
    public static void main(String[] args) {

        int[] nums = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};

        // 1. 动态初始化二维数组,准备存储打乱后的数据
        int[][] arr = new int[4][4];
        // 2. 打乱一维数组
        Random r = new Random();
        for (int i = 0; i < nums.length; i++) {
            int index = r.nextInt(nums.length);
            int temp = nums[i];
            nums[i] = nums[index];
            nums[index] = temp;
        }
        // 3. 将一维数组中,打乱后的元素,存入二维数组
        int index = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                arr[i][j] = nums[index];
                index++;
            }
        }
        // 4. 遍历并打印二维数组数据
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

标签:arr,int,元素,day05,33,二维,数组
From: https://blog.csdn.net/Darling912/article/details/143659647

相关文章

  • 540. 有序数组中的单一元素
    文章目录问题描述解决思路代码示例复杂度分析问题描述给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足O(logn)时间复杂度和O(1)空间复杂度。解决思路题......
  • 3255. 长度为 K 的子数组的能量值 II
    文章目录问题描述解题思路代码示例复杂度分析问题描述给你一个长度为n的整数数组nums和一个正整数k。一个数组的能量值定义为:如果所有元素都是依次连续且上升的,那么能量值为最大的元素。否则为-1。你需要求出nums中所有长度为k的子......
  • 二维椭圆拟合算法及推导过程
    目录1、间接平差法2、最小二乘法3、matlab案例4、案例结果5、参考链接1、间接平差法  该方法忽略了半长轴相对于xxx轴的旋转角度,需要较好的初......
  • c中柔性数组
    c99中,结构中最后一个元素允许是未知大小的数组,这就叫柔性数组成员。柔性数组的特点1.结构中柔性数组前必须至少有一个其他成员2.sizeof返回的这种结构大小不包括柔性数组的内存3.包含柔性数组成员的结构用malloc函数进行动态分配,并且分配的内存应该大于结构的大小,以适应柔......
  • 树状数组learning Day1识海社区打卡1st
    鉴于上次省赛的惨烈失败教训,狠狠加训,距离下次沈阳站还有两星期,再次感谢东北大学赐予的外卡机会,你知道的,东北大学一直是我的第二户籍所在地。今天到下星期周末为止估计都会持续更新树状数组和线段树相关的笔记。我的刷题顺序大概会按照[灵神提单](LC-Rating&Training)->codefor......
  • Java入门程序之一维数组的基础运用
    Java入门程序之一维数组的基础运用​本文详细介绍了Java中数组的概念、创建与初始化、一维数组的使用、内存分布以及二维数组。讲解了数组的静态与动态初始化、元素访问与修改、遍历方式。一、数组的基本概念数组的初始化例如:int[]array1=newint[20];//创建一个......
  • AcWing 827:双链表 ← 数组模拟
    【题目来源】https://www.acwing.com/problem/content/829/【题目描述】实现一个双链表,双链表初始为空,支持5种操作:  ●在最左侧插入一个数;  ●在最右侧插入一个数;  ●将第k个插入的数删除;  ●在第k个插入的数左侧插入一个数;  ●在第k个......
  • 二维数组和数组指针数组的关系
    在深入理解指针end中,我在最后写了一长段代码#include<stdio.h>voidtest1(intarr[][5],intx,inty)//voidtest1(int(*p)[5],intx,inty){ for(inti=0;i<x;i++) { for(intj=0;j<y;j++) { //printf("%d",*(*(p+i)+j)); print......
  • 【数据结构】快慢指针探秘:理解链表与数组中的环结构
    在处理链表或数组时,我们经常需要在一次遍历中找到特定的位置或检测某种模式。这时,快慢指针技术就能成为强大的工具,尤其在链表面试题中。本文将详细介绍什么是快慢指针、它们的工作原理,并通过一些实际应用帮助你理解这种技巧。学完后,你将掌握这种技巧的核心以及如何在代码中......
  • Air780E软件指南:C语言内存数组(zbuff)
    一、ZBUFF(C内存数组)简介zbuff库可以用c风格直接操作(下标从0开始),例如buff[0]=buff[3]可以在sram上或者psram上申请空间,也可以自动申请(如存在psram则在psram进行申请,如不存在或失败则在sram进行申请)。操作里面的元素时,可以根据光标进行增删改查。偏移方式有三种:从头......