数组的相关概念

文章介绍了Java中的数组概念,包括静态和动态初始化方法,数组的地址值和元素访问,以及如何遍历数组。通过示例代码展示了数组遍历的几种常见操作,如求和、计数和数据变换。还讨论了动态初始化的特点,数组的索引越界问题,以及对数组的常见操作,如找最大值、交换元素、打乱顺序等。最后提到了数组在内存中的分配情况。

一、数组概述和静态初始化

数组:作用类似于变量,可以存储同种数据类型的多个值
在这里插入图片描述
在这里插入图片描述
初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程。
数组的初始化有两种方式:静态初始化动态初始化

静态初始化
在这里插入图片描述
在这里插入图片描述

二、数组的地址值和元素访问

地址值:表示数组在内存中的位置。
在这里插入图片描述
数组元素的访问:
格式: 数组名[索引]
在这里插入图片描述
另外:可以使用具体的数据存储到数组中,但这样做,以前的数据就会被覆盖。
在这里插入图片描述

三、数组的遍历

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

.length方法

调用方式:数组名.length
可用for循环进行遍历,循环停止条件为:i < 数组名.length
扩展:
IDEA中可用数组名.fori快速生成遍历数组元素的for循环。

3.1 数组遍历的练习

Test1:

public class ArrayDemo1 {
    public static void main(String[] args) {
        // 定义一个数组,存储1-5,遍历每个元素并求和
        int[] array1  = {1,2,3,4,5};
        int sum = 0;

        for (int i = 0; i < array1.length; i++) {
            sum += array1[i];  
            //i表示数组的索引;array1[i]则表示每个元素
        }
        System.out.println(sum);
    }
}

Test2:

public class ArrayTest1 {
    /*
    定义一个数组,存储1,2,3,4,5,6,7,8,9,10
    遍历数组得到每一个元素,统计数组里面一共有多少个能被3整除的数字
     */
    public static void main(String[] args) {
        int[] arr1 = {1,2,3,4,5,6,7,8,9,10};
        int count = 0;

        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] % 3 == 0){
                count++;
            }
        }
        System.out.println("数组arr1中能被3整除的数共有" + count + "个");
    }
}

Test3:

public class ArrayTest2 {
    /*
    定义一个数组,存储1,2,3,4,5,6,7,8,9,10遍历数组得到每一个元素。要求:
    如果是奇数,则将当前数字扩大两倍
    如果是偶数,则将当前数字变成二分之一
     */
    public static void main(String[] args) {
        int[] arr2 = {1,2,3,4,5,6,7,8,9,10};

        for (int i = 0; i < arr2.length; i++) {
            if (arr2[i] % 2 ==1){
                arr2[i] *= 2;
            }else if (arr2[i] % 2 ==0){
                arr2[i] /=2;
            }
            System.out.println(arr2[i]); 
            //不推荐这样写,打印可以另写一个循环,一个循环做一件事就好
        }
    }
}

四、数组的动态初始化和常见问题

4.1 数组的动态初始化

动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。

格式:
数据类型[] 数组名= new 数据类型[数组长度];
public class ArrayDemo2 {
    /*
    定义一个数组,用来存班级中50个学生的姓名
    姓名未知,等学生报道之后,再进行添加。
     */
    public static void main(String[] args) {
        String [] name = new String[50];

        //添加
        name[0] = "zhangsan";
        name[1] = "lisi";

        System.out.println(name[0]);
        System.out.println(name[1]);
        System.out.println(name[2]);//尚未添加,打印结果是初始化的值
    }
}

在这里插入图片描述

扩展:

数组默认的初始化规律

  • 整数类型:默认初始化值0
  • 小数类型:默认初始化值0.0
  • 字符类型:默认初始化值 /u0000,打印出来是空格
  • 布尔类型:默认初始化值 false
  • 引用数据类型:默认初始化值 null(引用数据类型:除了四类八种以外的所有)

4.2 静态初始化和动态初始化的区别

在这里插入图片描述

4.3 常见问题——索引越界

出现原因:访问了不存在的索引;
避免方式:知道数组索引范围,即,从0开始,到数组长度-1结束。

4.4 对数组的常见操作

1.求最值

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

        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max){
                max = arr[i];
            }
        }
        System.out.println(max);
    }
}

2.求和并统计个数

public class Test4 {
    /*
    生成10个1~100之间的随机数存入数组
    1)求出所有数据的和
    2)所有数据的平均数
    3)统计有多少个数据比平均值小
     */
    public static void main(String[] args) {
        int [] num = new int[10];
        int sum = 0;

        // 生成10个随机数存入数组
        for (int i = 0; i < 10; i++) {
            Random r = new Random();
            int number = r.nextInt(100)+1;
            num[i] = number;
        }
        // 求和
        for (int i = 0; i < 10; i++) {
            sum += num[i];
        }

        int average = sum / 10;
        int count = 0;

        //求几个小于平均
        for (int i = 0; i < 10; i++) {
            if (num[i] < average){
                count++;
            }
        }

        System.out.println("总和为:" + sum);
        System.out.println("平均为:" + average);
        System.out.println("小于平均数的共有:" + count + "个");
    }
}

3.交换数据*

public class Test5 {
    /*需求:定义一个数组,存入1,2,3,4,5.按照要求交换索引对应的元素
    交换前:1,2,3,4,5    交换后:5,2,3,4,1*/
    public static void main(String[] args) {
        int [] arr = {1,2,3,4,5};

        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] =temp;
        }
    }
}

4.打乱数据

import java.util.Random;

public class Test6 {
    //需求:定义一个数组,存入1~5。要求打乱数组中所有数据的顺序
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};

        for (int i = 0; i < arr.length; i++) {
            Random r = new Random();
            int num = r.nextInt(5);

            int temp = arr[i];
            arr[i] = arr[num];
            arr[num] = temp;
        }
    }
}

五、数组的内存图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当定义一个数组时:
在这里插入图片描述
在这里插入图片描述

总结

  • 只要是new出来的一定是在堆里面开辟了一个小空间
  • 如果new了多次,那么在堆里面有多个小空间,每个小空间中都有各自的数据

特殊情况:两个数组指向同一个空间
在这里插入图片描述
总结
当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改之后的结果了。

<think>嗯,用户想了解数组的基本概念和用途,包括定义、特性和应用场景。首先,我需要从数组的基本定义开始,确保解释清楚什么是数组,以及它的核心结构。根据引用[4],数组属于线性表,元素具有相同特性,所以需要强调元素类型一致和有限序列的特点。接下来是特性部分,需要包括顺序存储、随机访问、固定大小这些关键点。引用[4]提到线性表的特性,可以结合数组的物理结构来补充,比如内存连续分配,这样访问效率高。同时,引用[3]提到的变长数组在C99中的情况,可能需要注意不同语言中的数组实现差异,但用户问题比较基础,可能不需要深入这里,只需提到固定长度或动态数组的区别即可。应用场景方面,引用[1]和[2]都提到了数组在编程中的常见用途,比如数据集合存储、矩阵运算、缓存系统等。需要具体举例,比如图像处理中的二维数组,或者算法中的排序使用。同时,引用[4]提到的线性表应用场景可以作为补充,比如队列、栈的实现基础。还要注意用户可能对多维数组感兴趣,因为引用[1]专门比较了一维和多维数组的区别,所以在应用场景中可以提到多维数组的应用,比如表格数据或游戏地图。但用户的问题主要是基本概念,所以可能需要简要提及,不过分展开。 需要确保使用正确的中文术语,避免技术术语错误。比如“索引”或“下标”要统一,根据引用[2]中的描述,使用“索引”比较合适。同时,代码示例可能需要用Python或其他常见语言,但用户提供的引用中有Java和C的例子,可能需要选择一种通用的语言,比如Python,但要看用户之前的提问历史。不过用户这次没有指定语言,所以可能用伪代码或通用描述更好。另外,用户要求生成相关问题,需要围绕数组的定义、特性、应用场景来设计问题,可能涉及与其他数据结构比较(如链表)、动态数组的实现、多维数组的应用等。参考引用中的内容,比如引用[1]比较一维和多维数组,引用[3]讨论变长数组,引用[4]提到线性表,可以生成相关问题如数组与链表的区别,动态数组如何工作,多维数组的使用场景等。 最后,检查LaTeX格式是否符合要求,所有数学表达式如时间复杂度需要用$...$,独立公式用$$...$$。例如,访问时间复杂度是O(1),可以写成$O(1)$,而插入操作的平均情况可能需要写成$O(n)$。不过用户提供的示例中没有使用太多数学公式,可能需要根据内容适当添加,但确保正确无误。总结回答结构:定义、特性、应用场景分点说明,每个部分简明扼要,引用对应的引用来源,比如在特性中提到内存连续引用[4],应用场景中的矩阵运算引用[1]等。然后生成相关问题,覆盖基本概念、比较、应用和优化等方面。</think>### 数组的定义、特性及应用场景 #### 一、数组的定义 数组是一种**线性数据结构**,由**相同类型**的元素按**顺序排列**组成,通过**索引**(下标)可直接访问任意元素[^4]。例如,一维数组可表示为: $$ \text{arr} = [a_0, a_1, ..., a_{n-1}] $$ 其中每个元素$a_i$占用连续的内存空间,索引从$0$开始。 --- #### 二、数组的核心特性 1. **顺序存储** 元素在内存中连续分配,物理结构与逻辑结构一致[^4],例如: ```c int arr[3] = {1, 2, 3}; // 内存地址连续 ``` 2. **随机访问** 通过索引可直接计算元素地址,时间复杂度为$O(1)$[^2]。例如,访问`arr[i]`的地址公式为: $$ \text{基地址} + i \times \text{元素大小} $$ 3. **固定长度** 传统数组长度在定义时确定(如C语言),但动态数组(如Java的`ArrayList`)支持自动扩容[^3]。 --- #### 三、数组的应用场景 1. **数据集合存储** - 存储一组数(如温度记录)或对象(如用户信息)[^2]。 - 示例:统计学生成绩的平均。 2. **矩阵运算** - 二维数组表示矩阵,适用于图像处理、游戏地图等[^1]。 ```python matrix = [[1, 2], [3, 4]] # 2x2矩阵 ``` 3. **算法实现** - 快速排序、二分查找等依赖数组的随机访问特性[^4]。 - 哈希表底层通常用数组实现桶存储。 4. **缓存与临时存储** - 利用内存连续性提升数据加载效率(如CPU缓存行)[^3]。 --- #### 四、数组的局限性 1. **插入/删除效率低** 需要移动元素,平均时间复杂度为$O(n)$。 2. **静态长度限制** 传统数组扩容需手动复制数据,动态数组虽优化此问题,但仍有性能开销[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要努力的小菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值