【Java数据结构】—— 一维数组

一维数组

在计算机语言中数组是非常重要的集合类型,大部分计算机语言中数组具有如下三个基本特性:

  1. 一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。
  2. 有序性:数组中的元素是有序的,通过下标访问。
  3. 不可变性:数组一旦初始化,则长度(数组中元素的个数)不可变。

Java 中数组的下标是从零开始的,很多计算机语言的数组下标从零开始的。

当数组中每个元素都只带有一个下标时,这种 数组 就是“ 一维数组 。 数组是引用数据类型,引用数据类型在使用之前一定要做两件事情:声明和初始化。

声明与初始化

声明数组

要声明一个数组,你需要指定数组的类型,然后在类型后面加上方括号[],最后是数组的名称。

int[] numbers; // 声明一个整型数组
String[] names; // 声明一个字符串数组
初始化数组

数组在创建后需要被初始化才能使用。使用花括号进行初始化。初始化可以包括分配内存并为数组元素赋予初始值。

  • 静态初始化:直接在声明时为数组元素赋值。
int[] numbers = {1, 2, 3, 4, 5};
String[] names = {"Alice", "Bob", "Charlie"};
  • 动态初始化:只指定数组长度,由系统默认初始化(例如,数字默认为0,对象引用默认为null),之后可以单独为每个元素赋值。

    注意:数组的长度是固定的,一旦创建,不能更改。

int[] numbers = new int[5]; // 创建一个长度为5的整型数组
numbers[0] = 1; // 分别赋值

读取和修改数组元素

通过下标索引来访问数组中的元素,切记索引从0开始。

System.out.println(names[0]); // 输出 "Alice"
names[0] = "Ali"   //修改下标为0的元素的内容

查询数组内容

假如我们对数组中包含哪些元素并不了解,只是想知道其中是否含有元素"Alice",应该如何查找这个元素呢?

与读取元素类似,只需从数组开头逐步向后查找就可以了。如果数组中的某个元素为目标元素,则停止查找;否则继续搜索直到到达数组的末尾。

for (int i = 0; i < array.length; i++) {
    if (array[i] == "Alice"){
       System.out.println(i);
    }
}

插入元素

在Java中,由于数组的长度是固定的,直接在数组中间插入数据会导致后续元素的索引发生变化,这在编译时是不允许的,同样也是不建议的,但你可以通过以下几种方式间接实现数组中的插入操作:

1. 创建新数组并复制

最常见的方式是创建一个新的、长度更大的数组,然后将原数组中的数据复制过去,再在指定位置插入新数据。示例代码如下:

public static int[] insertIntoArray(int[] original, int index, int element) {
    // 创建一个新数组,长度为原数组长度加1
    int[] newArray = new int[original.length + 1];
    
    // 将原数组中的元素复制到新数组中,直到插入位置
    System.arraycopy(original, 0, newArray, 0, index);
    
    // 在指定位置插入新元素
    newArray[index] = element;
    
    // 把原数组剩余的部分复制到新数组
    System.arraycopy(original, index, newArray, index + 1, original.length - index);
    
    return newArray;
}
2. 手动管理数据移动

如果你确实需要直接操作原数组,并且知道插入不会超出数组容量限制,也可以手动调整数组元素的位置,但这通常较为繁琐且容易出错。

注意
  • 上述示例展示了如何在数组的某个位置插入数据,但请记住,每次插入操作都可能需要创建一个新的数组,因此如果频繁插入,可能会导致性能问题。

我们发现,如果需要频繁地对数组元素进行插入操作,不仅操作繁琐,且会造成时间的浪费。事实上,另一种数据结构,即链表可以有效解决这个问题,我将在后续的文章中为你介绍。

删除数组元素和插入元素同理,都是不建议进行的操作。

数组长度

使用.length属性获取数组的长度。

System.out.println(numbers.length); // 输出 5

数组遍历

可以使用for循环或者增强型for循环(foreach)遍历数组。

// 使用传统for循环
for(int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);
}

// 使用增强型for循环
for(String name : names) {
    System.out.println(name);
}

注意事项

  • 访问不存在的索引(如负数或超过数组长度)会导致ArrayIndexOutOfBoundsException异常。
  • 数组是Java中最基本的数据结构之一,但功能有限,对于更复杂的操作,通常推荐使用集合框架(如ArrayList, LinkedList等)。

算法题目练习

题目来自力扣:数组和字符串 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台

【练习一】给你一个整数数组 nums ,请计算数组的中心下标 。

数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回最靠近左边的那一个。如果数组不存在中心下标,返回 -1 。

示例 1:

输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。

示例 2:

输入:nums = [1, 2, 3]
输出:-1
解释:
数组中不存在满足此条件的中心下标

示例 3:

输入:nums = [2, 1, -1]
输出:0
解释:
中心下标是 0 。
左侧数之和 sum = 0 ,(下标 0 左侧不存在元素),
右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0 。
public static int pivotIndex(int[] nums) {
    for (int i = 0; i < nums.length; i++) {  //遍历数组
        int sum1 = 0; //记录左边的和
        int sum2 = 0; //记录右边的和
        for (int j = 0; j < i; j++) { //计算左边的和
             sum1 += nums[j];
        }
        for (int j = i+1; j < nums.length; j++) {  //计算右边的和
            sum2 += nums[j];
        }
        if (sum1 == sum2){  // 判断左右之和是否相等
            return i;
        }
    }
    return -1;
}

【练习二】给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

提示 : nums 为无重复元素的升序排列数组

public int searchInsert(int[] nums, int target) {
        for(int i=0;i<nums.length;i++){
            if(nums[i]>=target) 
                return i;
        }
        return nums.length;
    }
  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值