数组和数组扩容

数组

我们可以使用数组来保存同一个数据类型的多个数据

数组的特点

​ ①数组的长度一旦确定就不能改变

​ ②一个数组中元素的数据类型都是一样的

数组的初始化

动态初始化

格式

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

例如:

	int[] arr = new int[10];//动态初始化了一个长度为10的数组,数组元素为int类型

静态初始化

格式

​ 标准格式:

​ 数据类型[] 数组名 = new 数据类型[] {元素值1,元素值2,元素值3,…};

例如:

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

​ 省略格式(推荐使用):

​ 数据类型[] 数组名 = {元素值1,元素值2,元素值3,…};

例如:

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

总结

​ 静态初始化和动态初始化都可以实现对数组的初始化,那么我们在需要创建数组的时候应该如何选择呢?

​ 如果数组元素都确定好了,并且个数有限的情况下我们可以使用静态初始化,因为更方便。如果只能确定数组的长度,数组的元素值需要后面再赋值的话可以使用动态初始化。

数组元素的表示

格式

​ 数组名[索引值]

例如:

	  int[] arr = {1,2,3,4};
	  //输出数组arr的第一个元素
	  System.out.println(arr[0]);
	  //把数组arr的第3个元素值修改为5
	  arr[2] = 5;

注意

​ 索引值就是一个int数字,代表数组当中元素的编号。

​ 索引值从0开始,一直到“数组的长度-1”为止。例如长度为5的数组他的索引范围为0到4

数组的内存结构

观察下面代码的输出结果

int[] arr = new int[5];
arr[0] = 1;
arr[1] = 2;
int[] arr2 = arr;
arr2[2] = 3;
arr2[3] = 4;
System.out.println(arr2[0]);
System.out.println(arr[3]);

如果想要弄明白上面代码的输出结果就需要知道一个数组在内存中是如何存储的。

实际上,数组的实体保存在堆中,数组名实际保存的是数组实体的地址值。

数组长度

在java中我们可以非常方便的获取到数组的长度,格式如下:

数组名.length

例如:

	  int[] arr = {1,2,3,4};
	  //输出数组长度
	  System.out.println(arr.length);

数组的遍历

我们在操作数组的时候很多时候需要对数组的每个元素挨个操作一遍,这种情况下我们就可以对数组进行遍历操作。

int[] arr={1,2,3,4,5,7};
//遍历输出数组元素
for(int i=0;i<arr.length;i++){
	System.out.println(arr[i]);
}

常见问题

1.观察下面程序的执行结果 ArrayIndexOutOfBoundsException 数组索引越界

int[] arr = new int[3];
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;
System.out.println(arr[2]);

练习题

1.数组的动态扩容并实现增删改查

package com.stx.p10.lianghong;

import java.util.Scanner;

/**
 * @author : lianghong
 * @version 1.0
 * @date : 2023/9/20 9:16
 * @description: TODO
 */
public class ArrayCrud {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);//定义扫描器
        int[] arr = {1, 2, 3};//给数组赋值
        while (true) {
            System.out.println("请选择:1.添加\t2.遍历\t3.删除\t4.修改\t0.退出");
            String choose = sc.next();
            if ("0".equals(choose)) {
                System.out.println("BYE");
                break;
            }
            switch (choose) {
                case "1":
                    arr = add(arr, sc);
                    System.out.println("添加成功");
                    break;
                case "2":
                    show(arr);
                    break;
                case "3":
                    arr = remove(arr, sc);
                    System.out.println("删除成功");
                    break;
                case "4":
                    update(arr, sc);
                    System.out.println("修改成功!");
                    break;
                case "0":
                    System.out.println("退出");
                    break;
                default:
                    System.out.println("输入错误!");
                    break;
            }
        }
    }



    /**
     * 添加
     */
    private static int[] add(int[] arr, Scanner sc) {
        System.out.println("请输入要添加的数字:");
        int num = sc.nextInt();
        int[] copy = new int[arr.length + 1];//数组扩容,原数组上加1
        System.arraycopy(arr, 0, copy, 0, arr.length);//把旧数组上面的数组拷贝到新数组上面
        copy[arr.length ] = num;
        return copy;
    }
    /**
     * 删除
     */
    private static int[] remove(int[] arr, Scanner sc) {
        System.out.println("请输入要删除的数:");
        int num = sc.nextInt();
        int index = findNum(arr, num);
        if (index == -1) {
            System.err.println("该数字不存在..");
            return arr;
        }
        int[] copy = new int[arr.length - 1];
        for (int i = 0; i < index; i++) {
            copy[i] = arr[i];
        }
        for (int i = index; i < copy.length; i++) {
            if (index != (arr.length - 1)) {
                copy[i] = arr[i + 1];
            }
        }
        return copy;
    }

    /**
     * 查询
     *
     * @param arr
     */
    private static void show(int[] arr) {
        for (int i : arr) {
            System.out.print(i);
        }
        System.out.println();
    }

    /**
     * 修改
     */
    private static void update(int[] arr, Scanner sc) {
        System.out.println("请输入你需要修改的数字:");
        int num = sc.nextInt();
        int i = findNum(arr, num);
        System.out.println("请输入你修改之后的数字:");
        int nexted = sc.nextInt();
        arr[i] = nexted;
    }

    /**
     * 查找
     */
    public static int findNum(int[] arr, int num) {
        for (int i = 0; i < arr.length; i++) {
            if (num == arr[i]) {
                return i;
            }
        }
        return -1;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 数组传参 在程序设计中,当需要将数据集合作为一个整体传递给函数或方法时,通常会采用数组作为参数。数组传参的方式主要有两种: #### 1. **值复制传参** 这种方式下,当你将数组作为参数传递时,实际上只是传递了一个指向数组首元素的引用,并不会创建一个新的副本。因此,对传递过来的数组进行修改会影响到原始数组的数据。 例如,在C++中,函数定义可能如下所示: ```cpp void modifyArray(int arr[], int n) { // 对数组arr进行操作 } ``` 若在主函数中传递数组`int myArr[] = {1, 2, 3};`并调用上述函数,则原数组`myArr`会被修改。 #### 2. **指针传参** 另一种常见的情况是通过传递指针来处理数组。在这种情况下,你传递的是数组的起始地址。这种方式允许更高效地访问数组元素,尤其对于大型数组而言。 例如,在C语言中: ```c void processArray(int *arr, int size) { for (int i = 0; i < size; ++i) { // 处理每个元素 } } ``` 在这个例子中,`processArray`函数可以安全地遍历整个数组而不改变其内容。 ### 数组输出格式 数组输出通常涉及打印数组的内容到控制台或其他输出设备。这通常是通过循环遍历数组元素完成的。在大多数编程语言中,你可以使用基本的循环结构(如for循环、while循环等)结合数组索引来实现这一目的。 **示例代码**(假设使用Python): ```python def print_array(arr): # 输出数组内容 for element in arr: print(element) # 定义一个数组 numbers = [1, 2, 3, 4, 5] # 调用函数打印数组 print_array(numbers) ``` 这段代码展示了如何使用`for`循环来迭代数组中的每个元素,并将其打印出来。 --- ## 相关问题: 1. **在何种场景下应该优先选择值复制传参而非指针传参?** - 当你需要保证原数组不受改动并且不想增加内存消耗时,应选择值复制传参。 2. **如何优化大型数组的性能?** - 使用指针传参可以提高性能,因为它们不需要额外的空间开销。此外,避免频繁的数组复制操作也能提升效率。 3. **在处理动态数组大小时,应当注意哪些事项?** - 确保在函数内部正确管理数组的大小,尤其是在向数组添加新元素时,防止数组越界错误。合理使用扩容机制(如自动增长的数组或堆分配空间),以及在结束操作前释放不再使用的内存资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值