首页 > 其他分享 >数组

数组

时间:2024-03-05 09:11:21浏览次数:21  
标签:arr int System 数组 public out

数组


数组介绍


数组:数组指的是一种容器,可以用来存储同种数据类型的多个值

  • 数组容器在存储数据的时候,需要结合隐式转换考虑。
  • 例如:int类型的数组容器(boolean×、byte√、short√、int√、double×)
  • 例如:double类型的数组容器(byte√、short√、int√、long√、float√、double√)
  • 建议:容器的类型,和存储的数据类型保持一致

数组的定义和静态初始化


数组的定义


  • 格式一:数据类型 [] 数据名

    范例:int [] array

  • 格式二:数据类型 数据名 []

    范例:int array []


数组的初始化


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

数组的静态初始化


  • 完整格式:数据类型 [] 数组名 = new 数据类型[] {元素1,元素2,元素3...};
  • 范例:int [] array = new int []{11,22,33};
  • 范例:double [] array = new double [] {11.1,22.2,33.3};
  • 简化格式:数据类型 [] 数组名 = {元素1,元素2,元素3...};
  • 范例:int [] array = {11,22,33};
  • 范例:double [] array = {11.1,22.2,33.3};
public class ArrayDemo1 {
    public static void main(String[] args) {
        //格式:
        //静态初始化
        //完整格式:
        //数据类型 [] 数组名 = new 数据类型[] {元素1,元素2,元素3...};
        //简化格式:
        //数据类型 [] 数组名 = {元素1,元素2,元素3...};

        //需求1:定义数组存储5个学生的年龄
        int[] arr1 = new int[]{11,12,13,14,15};
        int[] arr2 = {11,12,13,14,15};
        //需求2:定义数组存储3歌学生的姓名
        String[] arr3 = new String[]{"张三","李四","王五"};
        String[] arr4 = {"张三","李四","王五"};
        //需求3:定义数组存储4个学生的身高
        double[] arr5 = new double[]{1.93,1.75,1.73,1.81};
        double[] arr6 = {1.93,1.75,1.73,1.81};
    }
}

数组的地址值


int[] arr = {1,2,3,4,5};
System.out.println(arr);//[I@d03e736 地址值
double[] arr2 = {1.1,2.2,3.3};
System.out.println(arr2);//[D@568db2f2 地址值

数组的地址值表示数组在内存中的位置

扩展:

地址值的格式含义 [D@568db2f2

[:表示当前是一个数组

D:表示当前数组里面的元素都是double类型的

@:表示一个间隔符号。(固定格式)

568db2f2:数组真正的地址值(十六进制)

平时我们习惯性的会把这个整体叫做数组的地址值。


数组的元素访问


格式:


  • 格式:数组名 [索引];

索引


  • 索引:也叫做下标,角标。
  • 索引的特点:从0开始,逐个+1增长,连续不间断
public class ArrayDemo2 {
    public static void main(String[] args) {
        //利用索引对数组中的元素进行访问
        //1.获取数组里面的元素
        // 格式:数组名[索引]
        int[] arr = {1,2,3,4,5};
        //获取数组中的第一个元素
        //其实就是0索引上定义的元素
        int number = arr[0];
        System.out.println(number);//1

        //获取数组中1索引上对应的数据,并直接打印出来
        System.out.println(arr[1]);//2

        //2.把数据存储到数组当中
        //  格式:数组名[索引] = 具体数据或变量
        //细节:一旦覆盖之后,原来的数据就不存在了。

        arr[0] = 100;
        System.out.println(arr[0]);//100
    }
}

数组遍历


  • 数组遍历:将数组中所有的内容取出来,取出来之后可以(打印,求和,判断...)
  • 注意:遍历指的是取出数据的过程,不要局限的理解为,遍历就是打印!
public class ArrayDemo3 {
    public static void main(String[] args) {
        //1.定义数组
        int[] arr = {1,2,3,4,5};
        //2.获取数组里面所有的元素
        //格式:数组名[索引]
        //利用循环改进代码
        //开始条件:0
        //结束条件:数组的长度 - 1(最大索引)
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

        //在Java当中,关于数组的一个长度属性:length
        //调用方式:数组名.length
        System.out.println(arr.length);
        
        //扩展:
        //自动的快速生成数组的遍历方式
        //数组名.fori
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

练习


遍历数组并求和

定义一个数组,存储1,2,3,4,5

遍历数组得到每一个元素,求数组里面所有的数据和

public class ArrTest1 {
    public static void main(String[] args) {
        /*定义一个数组,存储1,2,3,4,5
        遍历数组得到每一个元素,求数组里面所有的数据和
         */

        //分析:
        //1.定义一个数组,并添加数据1,2,3,4,5
        int[] arr = {1,2,3,4,5};

        //求和变量
        int sum = 0;

        //2.遍历数组得到每一个数据,累加求和
        for (int i = 0; i < arr.length; i++) {
            //i 依次表示数组里面的每一个索引
            //arr[i] 依次表示数组里面的每一个元素
            sum += arr[i];
        }
        //当循环结束之后,sum的值就是累加之后的结果
        System.out.println(sum);
    }
}

统计个数

定义一个数组,存储1,2,3,4,5,6,7,8,9,10

遍历数组得到每一个元素,统计数组里面一共有多少个能被3整除的数字

public class ArrTest2 {
    public static void main(String[] args) {
        /*定义一个数组,存储1,2,3,4,5,6,7,8,9,10
        遍历数组得到每一个元素,统计数组里面一共有多少个能被3整除的数字
         */

        //分析:
        //1.定义一个数组,存储1,2,3,4,5,6,7,8,9,10
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        //定义一个变量,用来统计次数
        int count = 0;
        //2.遍历数组得到每一个元素
        for (int i = 0; i < arr.length; i++){
            //3.判断当前的元素是否为3的倍数,如果是那么统计变量就需要自增一次。
            if(arr[i] % 3 == 0){
                count++;
            }
        }
        System.out.println("数组中能被3整除的数字有" + count + "个");
    }
}

变化数据

定义一个数组,存储1,2,3,4,5,6,7,8,9,10

遍历数组得到每一个元素。

要求:

  1. 如果是奇数,则将当前数字扩大两倍

  2. 如果是偶数,则将当前数字变成二分之一

public class ArrTest3 {
    public static void main(String[] args) {
        /*定义一个数组,存储1,2,3,4,5,6,7,8,9,10
        遍历数组得到每一个元素。
        要求:
        1.如果是奇数,则将当前数字扩大两倍
        2.如果是偶数,则将当前数字变成二分之一*/

        //分析:
        //1.定义一个数组,存储1,2,3,4,5,6,7,8,9,10
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        //2.遍历数组得到每一个元素
        for (int i = 0; i < arr.length; i++) {
            //3.对每一个元素进行判断
            if(arr[i] % 2 == 0){
                //偶数 变成二分之一
                arr[i] /= 2;
            }else{
                //奇数 数字扩大两倍
                arr[i] *= 2;
            }
        }
        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

数组动态初始化


  • 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
  • 格式:数据类型[] 数组名 = new 数据类型[数组长度];
  • 范例:int[] arr = new int[3];
public class ArrayDemo4 {
    public static void main(String[] args) {
        /*定义一个数组,用来存班级中50个学生的姓名
        姓名未知,等学生报到之后,在进行添加。
         */

        //格式:数据类型[] 数组名 = new 数据类型[数组长度];
        //在创建的时候,由我们自己指定数组的长度,由虚拟机给出默认的初始化值

        String[] arr = new String[50];
        //添加学生
        arr[0] = "张三";
        arr[1] = "李四";
        //获取
        System.out.println(arr[0]);//张三
        System.out.println(arr[1]);//李四
        System.out.println(arr[2]);//打印出来的是默认初始化值null

        //数组默认初始化值的规律
        //整数类型:默认初始化值0
        //小数类型:默认初始化值0.0
        //字符类型:默认初始化值'/u000' 空格
        //布尔类型:默认初始化值 false
        //引用数据类型:默认初始化值 null
        int[] arr2 = new int[3];
        System.out.println(arr2[0]);//0
        System.out.println(arr2[1]);//0
        System.out.println(arr2[2]);;//0
    }
}

动态初始化和静态初始化的区别


  • 动态初始化:手动指定数组长度,由系统给出默认初始化值。
    • 只明确元素个数,不明确具体数值,推荐使用动态初始化
      • 举例:使用数组容器来存储键盘录入的5个整数。
      • int[] arr = {? ? ? ? ? };
      • int[] arr = new int[5];
  • 静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度。
    • 需求中已经明确了要操作的具体数据,直接静态初始化即可。
      • 举例:将全班的学生成绩存入数组中11, 22, 33
      • int[] arr = {11, 22, 33};

数组常见问题


  • 当访问了数组中不存在的索引,就会引发索引越界异常。
public class ArrayDemo5 {
    public static void main(String[] args) {
        //1.定义一个数组
        int[] = {1,2,3,4,5};
        //长度:5
        //最小索引:0
        //最大索引:4(数组的长度 - 1)
        System.out.println(arr[10]);//报错
        
        //小结:
        //索引越界异常
        //避免:了解索引的范围
    }
}

数组常见操作(练习)


1.求最值


  • 需求:已知数组元素为

    请找出数组中最大值并打印在控制台

  • ①定义max变量准备记录擂台上的变化

    int max = arr[0];

  • ②遍历数组获取每一个元素

    for (int i = 1;i < arr.length;i++);{
        arr[i];
    }
    
  • ③让每一个元素跟max比较

    如果找到更大的,就让max记录该元素

    for (int i = 1;i < arr.length;i++){
        if (arr[i] > max){
            max = arr[i];
        }
    }
    

public class ArrTest4 {
    public static void main(String[] args) {
        //定义数组最大值:33,5,22,44,55

        //1.定义数组用来存储五个值
        int[] arr = {33,5,22,44,55};
        //2.定义一个变量max用来存储最大值
        //临时认为0索引的数据是最大的
        int max = arr[0];
        //3.循环获取数组中的每一个元素
        //用每一个元素跟max进行比较
        for (int i = 1; i < arr.length; i++) {
            if(arr[i] > max){
                max = arr[i];
            }
        }
        //4.当循环结束之后,max记录的就是数组中的最大值
        System.out.println(max);
        //max的初始化值一定要是数组中的值
        //循环的开始条件如果为0,那么第一次循环的时候是自己跟自己比了一下,对结果没有任何影响,但是效率偏低
        //为了提高效率,减少一次循环的次数,循环开始条件可以写1
    }
}

2.遍历数组求和


需求:生成10个1~100之间的随机数存入数组。

1)求出所有数据的和

2)求出所有数据的随机数

3)统计有多少个数据比平均值小

import java.util.Random;

public class ArrTest5 {
    public static void main(String[] args) {
        /*需求:生成10个1~100之间的随机数存入数组。
        1)求出所有数据的和
        2)求出所有数据的随机数
        3)统计有多少个数据比平均值小
         */
        //分析:
        //1.定义数组
        int[] arr = new int[10];
        //2.把随机数存入到数组当中
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            //每循环一次就会生成一个新的随机数
            int number = r.nextInt(1,101);
            //把生成的随机数添加到数组当中
            //数组名[索引] = 数据;
            arr[i] = number;
        }
        //1)求出所有数据的和
        //定义求和变量
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            //循环得到每一个元素
            //并把元素累加到sum当中
            sum += arr[i];
        }
        System.out.println("数组中所有数据的和为:" + sum);

        //2)求出所有数据的随机数
        int avg = sum / arr.length;
        System.out.println("数组中的平均数为:" + avg);

        //3)统计有多少个数据比平均值小
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] < avg){
                count++;
            }
        }
        System.out.println("在数组中,一共有" + count + "个数据,比平均数小");

        //遍历数组,验证答案
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");//println去掉ln,是数据都打印在一行,加空格使数据间隔开
        }
    }
}

3.交换数组中的数据


需求:定义两个变量,交换两个变量记录的值

public class ArrTest6 {
    public static void main(String[] args) {
        /*需求:定义两个变量,交换两个变量记录的值*/
        
        int a = 10;
        int b = 20;

        //定义一个临时的第三方变量
        //把变量a的值,赋值给了temp
        int temp = a;
        //把变量b的值,赋值给了a,那么变量a原来记录的值就被覆盖了
        a = b;
        //把变量a原来的值,赋值给了变量b
        b = temp;
        System.out.println(a);//20
        System.out.println(b);//10
    }
}

需求:定义一个数组,将数组中0索引和最大索引的值进行交换

public class ArrTest7 {
    public static void main(String[] args) {
        /*需求:定义一个数组,将数组中0索引和最大索引的值进行交换*/

        //1.定义一个数组
        int[] arr = {1,2,3,4,5};
        //将数组中0索引和最大索引的值进行交换
        //可以利用第三方变量进行交换
        int temp = arr[0];
        arr[0] = arr[4];
        arr[4] = temp;

        //3.遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

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

交换前:1,2,3,4,5

交换后:5,4,3,2,1

public class ArrTest8 {
    public static void main(String[] args) {
        /*需求:定义一个数组,存入1,2,3,4,5。按照要求交换索引对应的元素。
        交换前:1,2,3,4,5
        交换后:5,4,3,2,1
         */

        //1.定义数组存储数据
        int[] arr = {1,2,3,4,5};
        //2.利用循环交换数据
        for(int i = 0,j = arr.length - 1 ; i < j ; i++,j--){
            //交换变量i和变量j指向的元素
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        //当循环结束之后,那么数组中的数据与实现了头尾交换
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

4.打乱数组中的数据


需求:定义一个数组,存入1-5。要求打乱数组中所有数据的顺序。

import java.util.Random;

public class ArrTest9 {
    public static void main(String[] args) {
        //需求:定义一个数组,存入1-5。要求打乱数组中所有数据的顺序。

        //1.定义数组存储1-5
        int[] arr = {1,2,3,4,5};
        //2.循环遍历数组
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            //生成一个随机索引
            int randomIndex = r.nextInt(arr.length);
            //拿着随机索引指向的元素,跟 i 指向的元素进行交换
            int temp = arr[i];
            arr[i] = arr[randomIndex];
            arr[randomIndex] = temp;
        }
        //当循环结束之后,那么数组中所有的数据已经打乱顺序
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

Java内存分配


  • 栈:方法运行时使用的内存,比如main方法运行,进入方法栈中执行
  • 堆:存储对象或者数组,new来创建的,都存储在堆内存
  • 方法区:存储可以运行的class文件
  • 本地方法栈:JVM在使用操作系统功能的时候使用,和我们开发无关
  • 寄存器:给CPU使用,和我们开发无关

总结:

  1. 只要是new处理的一定是在堆里面开辟了一个小空间
  2. 如果new了多次,那么在堆里面有多歌小空间,没歌小空间中都有各自的数据
  3. 当两个数组指向同一个小空间是,那么其他数组再次访问的时候都时修改之后的结果了

标签:arr,int,System,数组,public,out
From: https://www.cnblogs.com/Y423x/p/18053232

相关文章

  • 数组问题集合--更新中
    1.多个数组长度相加constarrays=[[1,2],[3,4],[5]];//示例数组//使用reduce()函数将所有数组的长度求和constsumOfLengths=arrays.reduce((accumulator,currentArray)=>accumulator+currentArray.length,0);console.log(sumOfLengths);//输出结果为6([......
  • Java数组
    数组概述数组时相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们数组的声明创建首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:d......
  • 数组
    一、二分查找思想:寻找左右指针范围的边界 二、移除元素思想:交换,将与目标值相同的元素赋值为数组最右侧元素值,同时最右侧指针左移,直到当前指针位置=右侧指针位置 三、有序数组的平方思想:双指针最大值只可能在数组的两端产生,不断对比左右指针大小排序 四、长度最小的子......
  • Java数组
    Java数组一、什么是数组数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。【数组下标从0开始】二、数组声明创建首先必须声明数组变量,才能在程......
  • 力扣88.合并两个有序数组
    题目:给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m+n......
  • 力扣80.删除排序数组中的重复项 II
    题目:给你一个有序数组nums,请你删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。实现方法:使用map计数,用快慢指针方法,快指针不断加一,慢指针在计数小于出现次数时加一,再将快指针指向的数赋给慢指针指向的数。funcremoveDuplicates(nums......
  • 关联数组 (Associative Array)
    下方数据结构可以被描述为一个JavaScript对象(Object),其中每个键是一个UUID(UniversallyUniqueIdentifier),值是一个待办事项对象。在编程和数据结构领域,这种组织形式没有一个特定的官方名称,但它通常被称为“字典”、“映射”、“关联数组”或“哈希表”。字典(Dictionary):在Pyth......
  • 数组(基于代码随想录)的随笔
    数组数组基础知识数组是存放在连续内存空间上的相同类型数据的集合。数组的元素是不能删的,只能覆盖。那么二维数组在内存的空间地址是连续的么?Java的二维数组在内存中不是3*4的连续地址空间,而是四条连续的地址空间组成!数组的经典题目二分法二分法时间复杂度:O(logn)......
  • 蓝图数组的操作
    基础使用数组元素获取查找项目元素添加,移除遍历数组......
  • 二维数组和坐标系的对应关系
    题目链接城堡问题这题需要你在二维数组上建立坐标系,并找出上下作用分别对应\((x,y)\)的变化关系。对应关系----------->y|||\/xCode#include<iostream>#include<cstring>#include<algorithm>#include<queue>usingnamespacestd;constintN=60;typed......