数组

本文深入讲解了Java中数组的概念,包括一维数组、二维数组及多维数组的创建、初始化、使用及基本操作,如遍历、填充、排序、复制和查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组是具有相同数据类型的一组数据的集合,在Java中数组同样可看做是一个对象。根据维度的不同,分为一维数组,二维数组,多维数组

一、一维数组的创建与使用

1. 创建一维数组

数组作为对象允许使用new关键字进行内存分配。使用数组之前,要首先定义数组变量所属的类型。创建数组有两种形式:

(1)先声明,在用new运算符进行内存分配

声明一维数组也有两种形式,分别为:

数组元素类型 数组名字[];

数组元素类型[] 数组名字[];

int arr[];
String[] arr;

通常使用第一种形式,声明数组后,还不能立即访问它的任何元素,还需要为数组分配内存。结构如下:

数组名字 = new 数组元素类型[数组元素的个数]

  • 数组名字:被连接到数组变量的名称
  • 数组元素个数:指定数组中变量的个数,即数组的长度 
arr = new int[5];

表示一个有五个元素的数组,数组名为arr。数组的索引是从0开始的。注意,分配内存后,整型数组是有初始值的为0.

(2)声明的同时为数组分配内存

数组元素类型 数组名 = new 数组元素类型[数组元素的个数];

int month[] = new int[12];

 

2. 初始化一维数组

数组的初始化有一下两种形式:

int arr[] = new int[]{1,2,3,4};     // 第一种初始化方式
int arr2[] = {3,4,5,6};             // 第二种初始化方式

数组的初始化就是包括在大括号之内用逗号分开的表达式列表。用逗号(,)分开。 

3. 使用一维数组

public class GetDay {
    public static void main(String[] args) {
        // 创建并初始化一维数组
        int day[] = new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
        for (int i = 0; i < 12; i++){
            System.out.println((i + 1) + "月有" + day[i] + "天");
        }
    }
}

1月有31天
2月有28天
3月有31天
4月有30天
5月有31天
6月有30天
7月有31天
8月有31天
9月有30天
10月有31天
11月有30天
12月有31天

二、二维数组的创建与使用

如果一维数组中的各个元素仍然是一个数组,那么它就是一个二维数组,二维数组常用于表示表,表中的信息有行和列的形式。第一下标代表元素所在的行,第二个下标代表元素所在的列。

1. 二维数组的创建

二维数组的可以看做特殊的一维数组,声明方式也有两种。

(1)先声明,在用new运算符进行内存分配

数组元素类型 数组名字[][];

数组元素类型[][] 数组名字;

int myarr[][];

然后对数组进行分配内存,有两种不同的形式,一种是直接为每一维分配内存,一种分别为每一维分配内存

// 第一种
a = new int[2][4];

// 第二种
a = new int[2][];
a[0] = new int[2];
a[1] = new int[3];

 

2. 二维数组初始化

二维数组的初始化和一维数组类似,都是使用大括号,不同的是大括号中的元素是多个大括号。

int myarr[][] = {{12,3},{45,4}};

 

3. 使用二维数组

public class Matrix {
    public static void main(String[] args) {
        int a[][] = new int[3][4];
        for (int i = 0; i < a.length; i++){
            for (int j = 0; j < a[i].length; j++){
                System.out.print(a[i][j]);
            }
            System.out.println();
        }
    }
}

0000
0000
0000

三、数组的基本操作

1. 遍历数组

数组的遍历就是获取数组中的每一个元素,通常使用for循环实现,我们使用for循环来遍历二维数组。

public class Trap {
    public static void main(String[] args) {
        int b[][] = new int[][]{{1},{2,3},{4,5,6}}; // 创建二维数组
        for (int k = 0; k < b.length; k++){
            for (int c = 0; c < b[k].length; c++){
                System.out.print(b[k][c]);
            }
            System.out.println();
        }
    }
}

在使用foreach语句遍历二维数组。

public class Taulog {
    public static void main(String[] args) {
        int arr2[][] = {{4, 3}, {1, 2}};
        System.out.println("数组中的元素是:");
        for (int x[] : arr2){
            for (int e : x){
                if(e == x.length) {
                    System.out.print(e);
                }else {
                    System.out.print(e + " 、");
                }
            }
        }
    }
}


数组中的元素是:
4 、3 、1 、2

2. 填充替换数组元素

数组中的元素定义完成后,可通过Arrays类的静态方法fill()来对数组中的元素进行替换。该方法可以通过重载的形式完成任意类型的数组元素的替换。

(1)fill(int[] a, int value):将指定的int值分配给int型数组的每个元素

import java.util.Arrays;
public class Swap {
    public static void main(String[] args) {
        int arr[] = new int[5];
        Arrays.fill(arr, 8);
        for (int i = 0; i < arr.length; i++){
            System.out.println("第" + i + "个元素是:" + arr[i]);
        }
    }
}

第0个元素是:8
第1个元素是:8
第2个元素是:8
第3个元素是:8
第4个元素是:8

(2)fill(int[] a, int fromIndex, int toIndex, int value):将指定的int值分配给int型数组指定范围中的每个元素,填充的范围从索引fromIndex(包括)一直到索引toIndex(不包括)。如果formIndex == toIndex,则填充范围为空。

import java.util.Arrays;
public class Displace {
    public static void main(String[] args) {
        int arr[] = new int[]{45, 12, 2, 10};
        Arrays.fill(arr, 1, 2, 8);
        for (int i = 0; i < arr.length; i++){
            System.out.println("第" + i + "个元素是:" + arr[i]);
        }
    }
}

第0个元素是:45
第1个元素是:8
第2个元素是:2
第3个元素是:10

3. 对数组进行排序

通过Arrays类的静态sort()方法可以实现对数组的排序,可对任意类型的数组进行升序排序。

import java.util.Arrays;

public class Taxis {
    public static void main(String[] args) {
        int arr[] = new int[]{23, 42, 12, 8};
        Arrays.sort(arr);
        for (int i = 0; i < arr.length; i++){
            System.out.println(arr[i]);
        }
    }
}

8
12
23
42

Java中的String类型数组的排序算法是根据字典编排顺序排序的,,因此数字排在字母前面,大写字母排在小写字母前面。 

4. 复制数组

Arrays类的copyOf()方法与copyOfRange()方法可以实现对数组的复制。copyOf()方法时复制数组至指定长度,copyOfRange()方法则将指定数组的指定长度复制到一个新数组中。

(1)copyOf()方法:满足不同类型数组的复制

语法:copyOf(arr, int newlength)

  • arr:要进行复制的数组

newlength:int 型常量,指复制后的新数组的长度,如果新数组的长度大于数组arr的长度,则用0填充。如果复制后的数组长度小于数组arr的长度,则会从数组arr的第一个元素开始截取至满足新数组长度为止。

import java.util.Arrays;
public class Cope {
    public static void main(String[] args) {
        int arr[] = new int[]{23, 42, 12};
        int newarr[] = Arrays.copyOf(arr, 5);
        for (int i = 0; i < newarr.length; i++){
            System.out.println(newarr[i]);
        }
    }
}

23
42
12
0
0

(2)copyOfRange()方法

语法:copyOfRange(arr, int formIndex, int tolndex)

  • arr:要进行复制的数组对象
  • formIndex:指定开始复制数组的索引位置,新数组包括索引是formIndex的元素

toIndex:要复制范围的最后索引位置,新数组不包括索引是toIndex的元素

import java.util.Arrays;
public class Repeat {
    public static void main(String[] args) {
        int arr[] = new int[]{23, 42, 12, 84, 10};
        int newarr[] = Arrays.copyOfRange(arr, 0, 2);
        for (int i = 0; i < newarr.length; i++){
            System.out.println(newarr[i]);
        }
    }
}

23
42

 

5. 数组查询

Arrays类的binarySearch()方法,可使用二分搜索法来搜索指定数组。以获取指定对象。返回搜索元素的索引值。

(1)binarySearch(Object[] a, Object key)

  • a:要搜索的数组
  • key:要搜索的值

如果key包含在数组中,则返回搜索值的索引;否则返回-1或“-”(插入点)。插入点是搜索键将要插入数组的那一点,即第一个大于此键的元素索引。

import java.util.Arrays;
public class Example {
    public static void main(String[] args) {
        int ia[] = new int[]{1, 8, 9, 4, 5};
        Arrays.sort(ia);
        int index = Arrays.binarySearch(ia, 4);
        System.out.println("4的索引位置是:" + index);
    }
}

4的索引位置是:1

(2)binarySearch(Object[], int fromIndex, int toIndex, Object key)

  • a:要进行检索的数组
  • fromIndex:指定范围的开始索引(包含)
  • toIndex:指定范围的结束处索引(不包含)
  • key:要搜索的元素 
import java.util.Arrays;
public class Rakel {
    public static void main(String[] args) {
        String str[] = new String[]{"ab", "cd", "er", "yz"};
        Arrays.sort(str);
        // 在指定的范围内搜索元素“cd”的索引位置
        int index = Arrays.binarySearch(str, 0, 2, "cd");
        System.out.println("cd的索引位置是:" + index);
    }
}

cd的索引位置是:1

 

内容概要:本文针对火电厂参与直购交易挤占风电上网空间的问题,提出了一种风火打捆参与大用户直购交易的新模式。通过分析可再生能源配额机制下的双边博弈关系,建立了基于动态非合作博弈理论的博弈模型,以直购电价和直购电量为决策变量,实现双方收益均衡最大化。论文论证了纳什均衡的存在性,并提出了基于纳什谈判法的风-火利益分配方法。算例结果表明,该模式能够增加各方收益、促进风电消纳并提高电网灵活性。文中详细介绍了模型构建、成本计算和博弈均衡的实现过程,并通过Python代码复现了模型,包括参数定义、收益函数、纳什均衡求解、利益分配及可视化分析等功能。 适合人群:电力系统研究人员、能源政策制定者、从事电力市场交易的工程师和分析师。 使用场景及目标:①帮助理解风火打捆参与大用户直购交易的博弈机制;②为电力市场设计提供理论依据和技术支持;③评估不同政策(如可再生能源配额)对电力市场的影响;④通过代码实现和可视化工具辅助教学和研究。 其他说明:该研究不仅提供了理论分析,还通过详细的代码实现和算例验证了模型的有效性,为实际应用提供了参考。此外,论文还探讨了不同场景下的敏感性分析,如证书价格、风电比例等对市场结果的影响,进一步丰富了研究内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值