首页 > 其他分享 >数组

数组

时间:2024-08-31 22:48:27浏览次数:3  
标签:nums int System 数组 println out

概述

数组是一个引用类型,是一种容器。

数组存储多个相同数据类型的数据,允许自动类型转换。例如 int 类型的数组,可以存放 byte、short 和 int 类型的数据,double 类型的数组,可以存放 byte、short、int、long、float 和 double 类型的数据。boolean 类型的数据不能存放进 int 类型或者 double 类型的数组中。

程序示例:

public class array1 {
    public static void main(String[] args) {
        double[] hens = {1, 2, 3};   // 定义数组
        // 数组名为 hens,数组的类型为 double[],数组中的元素的类型为 double
        // 遍历数组
        for (int i = 0; i < hens.length; i++) {
            System.out.println(hens[i]);
        }
    }
}

数组定义之后,长度就固定了,不能再发生变化。

获取数组元素个数:数组名.length

数组名是一个地址:

public static void main(String[] args) {
    double[] double1 = {1.1, 2.2, 3, 4, 5};
    System.out.println(double1);            // [D@119d7047
    float[] float1 = {1.1F, 2.2F, 3, 4, 5};
    System.out.println(float1);             // [F@776ec8df
    long[] long1 = {1, 2, 3};
    System.out.println(long1);              // [J@4eec7777
    int[] int1 = {1, 2, 3};
    System.out.println(int1);               // [I@3b07d329
    short[] short1 = {1, 2, 3};
    System.out.println(short1);             // [S@41629346
    byte[] byte1 = {1, 2, 3};
    System.out.println(byte1);              // [B@404b9385
    boolean[] boolean1 = {false, false, true, false, true};
    System.out.println(boolean1);           // [Z@6d311334
    char[] char1 = {'1', '2', '3'};
    System.out.println(char1);              // 123
    String[] String1 = {"Hello", "World"};
    System.out.println(String1);            // [Ljava.lang.String;@682a0b20
}

结果前面的字母指出了数组元素的类型。结果最前面的 [ 表示是一个数组。@ 后面的内容才是真正的地址值,是一个十六进制的值。平时习惯性地将整个结果称为地址,但实际上只有 @ 后面的才是真正的地址。@ 是间隔符号,是一个固定的格式。

对于字符数组,打印数组名得到的结果比较特殊:

public static void main(String[] args) {
    char[] char1 = {'1', '2', '3'};
    System.out.println(char1);              // 123
    char[] char2 = {'1', '2', '3', '9'};
    System.out.println(char2);              // 1239
    char[] char3 = {'9', '8', '7'};
    System.out.println(char3);              // 987
}

数组的动态初始化 1

数组的初始化:在内存中,为数组容器开辟空间,并将数据存入容器中的过程。

数组初始化有两种方式:动态初始化和静态初始化。

动态初始化:初始化时只指定数组的长度,由虚拟机为数组分配初始值。

动态初始化的数组的定义:

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

或者:

数据类型[] 数组名 = new 数据类型[数组长度];  // 两者等价,但是推荐使用这一种

不同数据类型的数组,默认的初始值不同。

int 类型默认初始值为 0

short 类型默认初始值为 0

byte 类型默认初始值为 0

long 类型默认初始值为 0

float 类型默认初始值为 0.0

double 类型默认初始值为 0.0

char 类型默认初始值为 \u0000 (零字符),打印出来就是一个空格。

boolean 类型默认初始值为 false

引用数据类型默认初始值为 NULL

程序示例:

public class array1 {
    public static void main(String[] args) {
        double[] hens = new double[3]; // 定义数组
        int[] kens = new int[4];
        double sumHens = 0;
        int sunKens = 0;
        // 遍历数组
        for (int i = 0; i < hens.length; i++) {
            System.out.print(hens[i] + "\t");
            sumHens += hens[i];
        }
        System.out.println("");
        for (int i = 0; i < kens.length; i++) {
            System.out.print(kens[i] + "\t");
            sunKens += kens[i];
        }
        System.out.println();
        System.out.println(sumHens);
        System.out.println(sunKens);
    }
}

结果:

0.0        0.0        0.0        
0        0        0        0        
0.0
0

程序示例:

public class array1 {
    public static void main(String[] args) {
        byte[] bytes = new byte[10];
        short[] shorts = new short[10];
        int[] ints = new int[10];
        long[] longs = new long[10];
        char[] chars = new char[10];
        boolean[] booleans = new boolean[10];
        float[] floats = new float[10];
        double[] doubles = new double[10];
        String[] Strings = new String[10];

        System.out.println(bytes[0]);           // 0
        System.out.println(shorts[0]);          // 0
        System.out.println(ints[0]);            // 0
        System.out.println(longs[0]);           // 0
        System.out.println(chars[0]);
        System.out.println(booleans[0]);        // false
        System.out.println(floats[0]);          // 0.0
        System.out.println(doubles[0]);         // 0.0
        System.out.println(Strings[0]);         // null
    }
}

执行结果:

0
0
0
0
 
false
0.0
0.0
null

程序示例:

// 空字符 \u0000 打印出来就是一个空格
public class array1 {
    public static void main(String[] args) {
        System.out.println("Hello\u0000World!");    // Hello World!
    }
}
  1. 数组的动态初始化 2

先声明数组,语法:

数据类型 数组名[];

或者:

数据类型[] 数组名;

再创建数组,语法:

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

例如:

int[] a;           // 或者 int a[];   此时还没有在内存中为 a 分配空间,a 是 NULL
a = new int[10];   // 此时在内存中为 a 分配了空间,只有分配了存储空间,才能存放数据,否则报错,显示空指针异常

其实就是把方式 1 分两步写了。

错误代码:

在未分配空间的情况下,访问数组的长度:

public class array1 {
    public static void main(String[] args) {
        double[] a;
        System.out.println(a.length);  // 可能尚未初始化变量 a
    }
}

数组的静态初始化

语法:

完整格式:

数据类型[] 数组名 = new 数据类型[] {元素1, 元素2, ... , 元素n};

例如:

int[] arr1 = new int[]{1, 2, 3};
double[] arr2 = new double[]{1.1, 2.2, 3.3};

简化格式:

数据类型[] 数组名 = {元素1, 元素2, ... , 元素n};

或者:

数据类型 数组名[] = {元素1, 元素2, ... , 元素n};

例如:

int[] a = {1, 2, 3};   // 等价于 int a[] = {1, 2, 3};

程序示例:

// 定义一个数组,存储 1,2,3,4,5
// 遍历数组得到每一个元素,求数组里面所有的数据和
public class array1 {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5};
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        System.out.println(sum);    // 15
    }
}

程序示例:

// 定义一个数组
// 存储 1,2,3,4,5,6,7,8,9,10
// 遍历数组得到每一个元素,统计数组里面一共有多少个能被 3 整除的数字

public class array1 {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] % 3 == 0)
                ++count;
        }
        System.out.println("数组中能被3整除的数字有" + count + "个。");
    }
}

执行结果:

数组中能被3整除的数字有3个。

程序示例:

// 定义一个数组,存储 1,2,3,4,5,6,7,8,9,10
// 遍历数组得到每一个元素。
// 要求:
// 1、如果是奇数,则将当前数字扩大两倍
// 2、如果是偶数,则将当前数字变成二分之一

public class array1 {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        System.out.println("原始数组为:");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "\t");
        }
        // 处理数组
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] % 2 == 0)
                nums[i] /= 2;
            else nums[i] *= 2;
        }
        System.out.println("\n处理之后的数组为:");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "\t");
        }
    }
}

执行结果:

原始数组为:
1        2        3        4        5        6        7        8        9        10        
处理之后的数组为:
2        1        6        2        10        3        14        4        18        5

程序示例:

// 需求:已知数组元素为 {33, 5, 22, 44, 55}
// 请找出数组中最大值并打印在控制台

public class array1 {
    public static void main(String[] args) {
        int[] nums = {33, 5, 22, 44, 55};
        int max = nums[0];
        for (int i = 0; i < nums.length; i++) {
            max = (max > nums[i] ? max : nums[i]);
        }
        System.out.println("最大值为" + max);
    }
}

执行结果:

最大值为55

程序示例:

// 冒泡排序
public class array1 {
    public static void main(String[] args) {
        int[] nums = new int[]{33, 5, 22, 44, 55};
        // i 表示要比较多少趟,总趟数是数组长度减一
        // 同时,i 也表示两个比较大小的元素其中之一的索引
        for (int i = 0; i < nums.length - 1; i++) {
            // j 表示两个比较大小的元素其中之一的索引,表示的是i元素后面的那个元素
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] < nums[j]) {
                    int tmp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = tmp;
                }
            }
        }
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "\t");
        }
    }
}

执行结果:

从大到小进行排序:
55        44        33        22        5

程序示例:

// 需求:生成 10 个 1~100 之间的随机数存入数组。
// 1) 求出所有数据的和
// 2) 求所有数据的平均数
// 3) 统计有多少个数据比平均值小

import java.util.Random;

public class array1 {
    public static void main(String[] args) {
        Random r = new Random();

        int[] nums = new int[10];

        // 打印数组初始值
        System.out.println("数组初始值:");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "\t");
        }

        // 生成数组的值
        for (int i = 0; i < nums.length; i++) {
            nums[i] = r.nextInt(100) + 1;
        }

        // 打印数组现在的值
        System.out.println("\n数组现在的值:");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "\t");
        }

        // 求数组元素之和
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }

        // 求数组元素平均数
        int avg = sum / nums.length;

        // 求数组值小于平均数的个数
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] < avg)
                ++count;
        }

        System.out.println("\n数组元素之和为" + sum);
        System.out.println("数组元素平均值为" + avg);
        System.out.println("数组中元素小于平均值的个数有" + count + "个");
    }
}

执行结果:

数组初始值:
0        0        0        0        0        0        0        0        0        0        
数组现在的值:
72        6        35        98        45        85        16        100        85        47        
数组元素之和为589
数组元素平均值为58
数组中元素小于平均值的个数有5个

程序示例:

// 需求:定义一个数组,存入 1, 2, 3, 4, 5。按照要求交换索引对应的元素。
// 交换前:1, 2, 3, 4, 5
// 交换后:5, 2, 3, 4, 1

public class array1 {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5};
        System.out.println("交换之前的数组:");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "\t");
        }
        // 交换
        // int i = 0, j = nums.length - 1;
        // while (i <= j) {
        //     int tmp = nums[i];
        //     nums[i] = nums[j];
        //     nums[j] = tmp;
        //     ++i;
        //     --j;
        // }
        for (int i = 0, j = nums.length - 1; i <= j; ++i, --j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }

        System.out.println("\n交换之后的数组:");
        for (int k = 0; k < nums.length; k++) {
            System.out.print(nums[k] + "\t");
        }
    }
}

执行结果:

交换之前的数组:
1        2        3        4        5        
交换之后的数组:
5        4        3        2        1

程序示例:

// 需求:定义一个数组,存入 1~9。要求随机打乱数组中所有数据的顺序。

import java.util.Random;

public class array1 {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9};

        System.out.println("初始状态的数组:");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "\t");
        }

        Random r = new Random();
        // 每一次遍历到当前数组元素时,只和后面的随机一个元素进行交换
        for (int i = 0; i < nums.length - 1; i++) {
            int randomIndex = r.nextInt(nums.length - 1 - i - 1 + 1) + i + 1;
            int tmp = nums[i];
            nums[i] = nums[randomIndex];
            nums[randomIndex] = tmp;
        }

        System.out.println("\n方法一打乱之后的数组:");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "\t");
        }

        // 每一次遍历到当前数组元素时,和一个随机元素进行交换
        for (int i = 0; i < nums.length - 1; i++) {
            int randomIndex = r.nextInt(nums.length);
            int tmp = nums[i];
            nums[i] = nums[randomIndex];
            nums[randomIndex] = tmp;
        }

        System.out.println("\n方法二打乱之后的数组:");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "\t");
        }
    }
}

执行结果:

初始状态的数组:
1        2        3        4        5        6        7        8        9        
方法一打乱之后的数组:
9        8        6        2        4        5        1        7        3        
方法二打乱之后的数组:
3        1        9        8        7        4        5        6        2

数组动态或者静态初始化时,允许自动类型转换,能进行自动类型转换的类型可以被赋值给数组元素,不能进行自动类型转换的类型不能赋值给数组元素,否则报错:不兼容的类型。

程序示例:

public class array1 {
    public static void main(String[] args) {
        double[] nums = {1.1, 2.2, 3, 4, 5};    // 此处的静态初始化,利用了自动类型转换
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "\t");
        }
    }
}

执行结果:

1.1        2.2        3.0        4.0        5.0

IDEA 提供了一个快速生成数组遍历的方式:数组名.fori

数组中的数据类型,可以是基本类型或者引用类型。

数组下标越界会报错。编译时不检查是否越界,运行时才报错。

程序示例:

public class array1 {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3};
        System.out.println(nums[3]);  // ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
    }
}

标签:nums,int,System,数组,println,out
From: https://www.cnblogs.com/Chengkai730/p/18390848

相关文章

  • 手把手教你使用C语言实现堆栈数据结构算法-两种方式(链表+数组)
    堆栈定义栈(stack)是一种遵循先入后出逻辑的线性数据结构,常见操作入栈,出栈,访问栈图片来源:https://www.hello-algo.com/栈的实现栈遵循先入后出的原则,因此我们只能在栈顶添加或删除元素。然而,数组和链表都可以在任意位置添加和删除元素,因此栈可以视为一种受限制的数组或链表......
  • 2024-08-31:用go语言,给定一个数组apple,包含n个元素,每个元素表示一个包裹中的苹果数量;
    2024-08-31:用go语言,给定一个数组apple,包含n个元素,每个元素表示一个包裹中的苹果数量;另一个数组capacity包含m个元素,表示m个不同箱子的容量。有n个包裹,每个包裹内装有指定数量的苹果,以及m个箱子,每个箱子的容量不同。任务是将这n个包裹中的所有苹果重新分配到箱子中,最小化所需的......
  • 2024-08-31:用go语言,给定一个数组apple,包含n个元素,每个元素表示一个包裹中的苹果数量;
    2024-08-31:用go语言,给定一个数组apple,包含n个元素,每个元素表示一个包裹中的苹果数量;另一个数组capacity包含m个元素,表示m个不同箱子的容量。有n个包裹,每个包裹内装有指定数量的苹果,以及m个箱子,每个箱子的容量不同。任务是将这n个包裹中的所有苹果重新分配到箱子中,最小化所需的箱子......
  • shell(第四章数组和函数)
    变量里面有索引比如:name=dufeng调用echo${name:0:1}输出的是du数字形索引是数组123123文字形索引是关联数组qwupdufeng定义数组数组名=(数组数组数组)数组名=(`cat/etc/passwd`)#反`优先执行数组名=(`ls/home*`)#只要数组可以输出结果数组名=(数组"......
  • 后缀数组学习笔记
    后缀数组挺好玩的,于是来写后缀数组学习笔记了。什么是后缀数组?后缀数组主要关系到2个数组:\(sa\)和\(rk\)。\(sa[i]\)表示将所有后缀按照字典序从小到大排序,排名第\(i\)的后缀的开头为第\(sa[i]\)个字符。\(rk[i]\)表示将所有后缀按照字典序从小到大排序,后缀开......
  • 【每日一题】LeetCode 1343.大小为K且平均值大于等于阈值的子数组数目(数组、滑动窗口)
    【每日一题】LeetCode1343.大小为K且平均值大于等于阈值的子数组数目(数组、滑动窗口)题目描述给定一个整数数组arr和两个整数k和threshold,要求找出数组中长度为k且平均值大于等于threshold的子数组的数量。输入格式arr:一个整数数组。k:子数组的长度。thres......
  • PHP数组
    数组能够在单个变量中存储多个值数组可以在单个变量中存储多个值,并且您可以根据键访问其中的值。创建数组在PHP中,array()函数用于创建数组:在PHP中,有三种类型的数组:数值数组-带有数字ID键的数组关联数组-带有指定的键的数组,每个键关联一个值多维数组-包含一个......
  • js 数组的常用方法:在头部插入,删除,尾部插入,删除
    arr.push(value),在数组的末尾添加一个或多个元素,并返回数组的新长度。arr.pop()删除索引值最大的元素,即删除数组末尾的元素,并返回被删除的元素。unshift(value)在数组的头部添加一个或多个元素,并返回数组的新长度shift()删除索引为0的元素,并返回删除的元素splice()方法会修......
  • 06.类-数组(array)和string
    6.类-数组(array)和string6.1数组数组是一组连续的内存位置,它们都具有相同的类型。为了指代数组中的特定位置或元素,我们指定数组的名称和特定元素在数组中的位置编号。数组名称遵循与其他变量名相同的约定。下标必须是整数或整数表达式,带下标的数组名是一个左值,它可以在赋值......
  • 用c++以数组的形式实现栈的数据结构
    #include<iostream>usingnamespacestd;//设置数组的最大值#define MaxSize100intA[MaxSize];//栈顶inttop=-1;//入栈voidpush(intx){  //处理溢出的情况  if(top==MaxSize-1){    cout<<"stackoverflow"<<endl;    return; ......