JavaSE学习笔记5-数组

数组

数组是相同类型数据的有序集合,每个数据称作数组元素,可以通过下标来访问。

数组是引用类型,存在默认初始化

一、声明和创建

    //声明=创建数组(new)
    int[] numbers = new int[2];   //[2]表示长度为2
    //给数组元素赋值
    numbers[0] = 100;
    //通过下标取值,从0开始
    System.out.println(numbers[0]); //100
    System.out.println(numbers[1]); //未赋值的,为默认值

二、初始化及内存分析

  • 堆:存放new的对象和数组(创建部分)

  • 栈:存放基本变量类型、引用变量的地址(声明部分)

  • 方法区:包含所有class和static变量

        //静态初始化:创建+赋值
        int[] num1 = {1,2,3,4};
        //动态初始化:包含默认初始化
        int[] num2 = new int[10];
    }
    

三、下标越界

数组的长度是确定的,下标越界会报错:ArrayIndexOutOfBoundsException

int[] nums = {1,2,3}; //只有下标0,1,2
System.out.println(nums[3]);//下标越界

四、数组的使用

  • 遍历数组

    int[] nums = {1,2,3,4,5};
    //遍历数组(获取数组长度:numbers.length)
    for (int i = 0; i < nums.length; i++) {
        System.out.println(nums[i]);
    }
    //遍历数组,该方法无法用下标获取
    for (int array:nums){
        System.out.println(array);
    }
    
  • 反转数组

    public static int[] reverse(int[] arrays){
        int[] result = new int[arrays.length];
        for (int i = 0, j = arrays.length-1; i < arrays.length; i++,j--) {
            result[j] = arrays[i];
        }
        return result;
    }
    

五、二维数组

//二位数组:int[][]=new int[2][5]
int[][] array = {{1,11},{2,22},{3,33}};
//遍历
for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array[i].length; j++) {
        System.out.println(array[i][j]);
    }
}

六、Arrays类

可以查看jdk帮助文档:https://docs.oracle.com/javase/8/docs/api/

导入包:import java.util.Arrays;

int[] nums = {1222,244,31,41,5};
//打印数组元素:Arrays.toString()
System.out.println(Arrays.toString(nums));
//排序:升序
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
//填充:指定索引位置
Arrays.fill(nums,2,4,0);//第3和第4个变成0
System.out.println(Arrays.toString(nums));
//填充:全部
Arrays.fill(nums,0); //所有数组元素值变成0
System.out.println(Arrays.toString(nums));

七、冒泡排序

时间复杂度:O(n^2)

//冒泡排序
public static int[] sort(int[] array){
    int temp = 0;
    //遍历数组
    for (int i = 0; i < array.length-1; i++) {
        //两个数字比大小,交换位置
        for (int j = 0; j < array.length-1-i; j++) {
            if (array[j+1]<array[j]){
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
    }
    return array;
}

八、稀疏数组

当一个数组中大部分元素为0或者为同一个值时,可以用稀疏数组来保存。

处理方式:

  • 记录数组一共有几行、几列、有多少个不同的值
  • 把具有不同值的元素的行、列、值记录在一个小规模的数组中,从而缩小程序的规模
public static void main(String[] args) {    //棋盘:创建二维数组11*11,0表示没有棋子,1表示黑棋,2表示白棋    int[][] array = new int[11][11];    array[1][2] = 1;    array[2][3] = 2;    //输出原始数组    System.out.println("输出原始数组:");    for (int[] ints : array) {        for (int anInt : ints) {            System.out.print(anInt+"\t");        }        System.out.println();    }    System.out.println("==============================");    //转换为稀疏数组    //获取有效值的个数    int sum = 0;    for (int i = 0; i < 11; i++) {        for (int j = 0; j < 11; j++) {            if(array[i][j]!=0){                sum++;            }        }    }    System.out.println("有效值的个数:"+sum);    //创建稀疏数组    int[][] array1 = new int[sum+1][3];//3列分别是:行数,列数,值    array1[0][0] = 11;    array1[0][1] = 11;    array1[0][2] = sum;    //遍历二维数组将非0的值存放到稀疏数组中    int count = 0;    for (int i = 0; i < array.length; i++) {        for (int j = 0; j < array[i].length; j++) {            if (array[i][j]!=0){                count++;                array1[count][0] = i;                array1[count][1] = j;                array1[count][2] = array[i][j];            }        }    }    //输出稀疏数组    System.out.println("输出稀疏数组:");    for (int i = 0; i < array1.length; i++) {        System.out.println(array1[i][0]+"\t"+array1[i][1]+"\t"+array1[i][2]+"\t");    }    System.out.println("==============================");    //还原    int[][] array2 = new int[array1[0][0]][array1[0][1]];    for (int i = 1; i < array1.length; i++) {        array2[array1[i][0]][array1[i][1]] = array1[i][2];    }    System.out.println("输出还原的稀疏数组:");    for (int[] ints : array2) {        for (int anInt : ints) {            System.out.print(anInt+"\t");        }        System.out.println();    }}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

aoliaoliaoo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值