数组的定义与使用

2023/11/30 8:38:06

文章目录

  • 数组的基本概念
    • 为什么要使用数组
    • 什么是数组
    • 数组的创建及初始化
      • 数组的创建
      • 数组的初始化
    • 数组的使用
      • 数组中元素的访问
      • 遍历数组
  • 数组是引用类型
    • 基本数据类型与引用类型变量的区别
    • 认识null
  • 数组的应用场景
    • 保存数据
    • 作为函数的参数
      • 参数传基本数据类型
      • 参数传数组类型
    • 作为函数的返回值
  • 数组练习
    • 数组转字符串
    • 数组拷贝
  • 二维数组

数组的基本概念

为什么要使用数组

假设我们要储存五名同学的数学成绩,并对其进行输出,

public class Test {


    //为什么要使用数组
    public static void main(String[] args) {
        int student1 = 89;
        int student2 = 82;
        int student3 = 68;
        int student4 = 90;
        int student5 = 73;
        System.out.println(student1);
        System.out.println(student2);
        System.out.println(student3);
        System.out.println(student4);
        System.out.println(student5);
    }
}

在这种情况下,我们发现我们需要重复的创建变量,这大大降低了我们写代码的效率。我们发现这些数据的类型是相同的,这时我们就可以使用变量。

什么是数组

数组:相同类型元素大的一个集合。 在内存中是一段连续的空间。
【数组的特点】

  • 数组中存放的元素类型相同;
  • 数组的空间的是连在一起的;
  • 每个空间都有自己单独的编号,其初始位置是0,即数组的下标。

那么我们如何创建数组呢?

数组的创建及初始化

数组的创建

T[] 数组名 = new T[N];

T:表示数组存放元素的类型
T[]:数组的数据类型;
N:表示数组的长度。

【数组创建的示例】

//数组创建的示例
    public static void main(String[] args) {
        int[] array2 = new int[5];
        double[] array3 = new double[3];
    }

数组的初始化

数组的初始化主要分为两种类型:动态初始化和静态初始化

  1. 动态初始化:在创建数组的时候,直接指定数组中元素的个数

int[] array = new int[10];

  1. 静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定

int[] array = new int{1,2,3,4,5,6};
int[] array = {1,2,3,4,5,6};

【注意事项】

  • 静态初始化虽然没指定数组的长度,编译器在编译时会根据{}中的元素个数来确定数组的长度;
  • 静态初始化时,{}中数据类型必须与[]前数据类型一致;
  • 静态初始化可以简写,省略后面的new T[]. (但是在编译器编译代码时还是会还原,自动加上省略的部分);
  • 数组也可以按照C语言一样创建数组,但是我们不会去使用这种方法,但是语法是支持的。

int[] array = new int[5];
int array[] = new int[5]; //语法支持,但不推荐;
int array[5] = new int[5];//语法不支持

  • 静态和动态初始化可以分为两步,但是不可以省略格式;

int[] array1;
array1 = new int[10];
int[] array2;
array2 = new int[]{10,20,30};
//array2 = {1,2,3} 这种格式是错误的。

  • 如果没有对数组进行初始化,数组中元素有其默认值,1. 如果数组中储存元素类型为基类类型,默认为基类类型对应的默认值:比如:byte\short\int\long 类型默认值为 0float 默认值为 0.0f double 默认值为 0.0char 类型默认值为 /u0000, ***boolean 默认值为 false ***. 2.如果数组中储存元素类型为引用类型,其默认值为 null

数组的使用

数组中元素的访问

//数组元素的访问
    public static void main(String[] args) {
        int[] array = new int[]{1,2,3,4,5};
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }

【注意事项】

  1. 数组是一段连续的内存空间,因此支持随机访问,即通过下标可快速访问任意元素
  2. 下标从0开始,介于[0,N)

遍历数组

遍历:是指将数组中的所有元素都访问一遍。
【三种遍历数组的方法】

//数组元素的访问
    public static void main(String[] args) {
        int[] array = new int[]{1,2,3,4,5};
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
        for (int x: array) {
            System.out.println(x);
        }
        System.out.println(Arrays.toString(array));
    }

第一种遍历的方式,我们能够轻松理解;
第二种我们可以使用 for-each 遍历数组;
第三种我们可以使用 java 提供的包内的方法来遍历数组。
在这里插入图片描述

数组是引用类型

基本数据类型与引用类型变量的区别

基本变量:基本数据类型所创立的变量,空间存放的是所对应的值;
引用变量:引用数据类型说创建的变量,其空间中储存的是对象所在空间的地址。

//基本数据类型和引用数据类型所存放的位置
    public static void main(String[] args) {
        int a = 29;
        int b = 99;
        double[] array = new double[]{3.14, 1.56, 4.99};
    }

在上述代码中a\b\array,都是函数内部的变量,因此其开辟的空间都在main方法对应的栈帧中分配。

  • a\b都是内置类型的变量,其空间中储存的都是该变量的值。
  • array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。
    在这里插入图片描述
    引用变量不直接储存数据的值,而是在堆区开辟新的空间,在堆区存放数据,而在栈中存放对应堆区的地址。

认识null

***null 在Java中表示“空引用”,也就是一个不指向对象的引用。

//null
    public static void main(String[] args) {
        int[] array = null;
        System.out.println(array[0]);
    }

在这里插入图片描述
null 的作用类似于C语言的空指针,都是表示一个无效的内存地址,如果我们对它进行操作会导致空指针异常问题(NullPointerException)

Java中没有约定 null 与 0 号地址有任何关系。

数组的应用场景

保存数据

//数组的应用场景 保存数据
    public static void main(String[] args) {
        int[] students = {99, 100, 66};
        for (int x: students) {
            System.out.print(x + " ");
        }
    }

作为函数的参数

参数传基本数据类型

  //参数传基本数据类型
    public static int func(int num) {
        num = 0;
        return num;
    }

    public static void main(String[] args) {
        int num = 20;
        func(num);
        System.out.println(num);
    }

在这种情况下,形参只是实参的临时拷贝,我们修改形参的值,并不会影响实参。

参数传数组类型

    //参数传数组类型
   public static int[] func (int[] array) {
       for (int i = 0; i < array.length; i++) {
           array[i] = i;
       }
       return array;
   }

   public static void main(String[] args) {
       int[] array = {10, 20, 30};
       func(array);
       for (int x: array) {
           System.out.print(x + " ");
       }
   }

我们发现,如果对引用类型进行数值上的修改,数组的内容会真的改变。
总结:所谓的引用本质上只是存了一个地址。Java中将数组设定成引用类型,这样的话后续进行数组参数传参,***其实只是将数组的地址传到函数的形参当中,但是使用的仍让是堆上相同的空间。
在这里插入图片描述

作为函数的返回值

示例:获取斐波那契数列的前N项

 //作为方法的返回值 获取斐波那契数列的前N项
    public static int[] fibonacci (int num) {
        int[] array = new int[num];
        array[0] = 1;
        array[1] = 1;
        for (int i = 2; i < num; i++) {
            array[i] = array[i-1] + array[i-2];
        }
        return array;
    }

    public static void main(String[] args) {
        int n = 9;
        System.out.println(Arrays.toString(fibonacci(n)));
    }

数组练习

数组转字符串

 //数组转字符串
    public static void main(String[] args) {
        int[] array = {10, 20, 30, 40, 50};
        String str = Arrays.toString(array);
        System.out.println(str);

    }

Java中提供了 Java.util.Arrays 包,其中包含了一些操作数组的常用方法。

数组拷贝

//数组拷贝
    public static void main(String[] args) {
        int[] array = {10, 20, 30, 40, 50, 60};
        //copyOf 方法进行拷贝,并会建立一个新的数组
        int[] newArr1 = Arrays.copyOf(array, array.length);
        System.out.println(Arrays.toString(newArr1));
        //拷贝某个范围
        int[] newArr2 = Arrays.copyOfRange(array, 2, 5);
        System.out.println(Arrays.toString(newArr2));
    }

二维数组

二维数组本质上就是一维数组,只不过每个元素又是一个一维数组。
【基本语法】

数据类型[][] 数组名称 = new 数据类型[行数][列数]{初始化数据类型};

【代码示例】

 //二维数组
    public static void main(String[] args) {
        int[][] array1 = {{1,2}, {3,4}};
        int[][] array2 = new int[][]{{1,2}, {3,4}};
        int[][] array3 = new int[2][2];
        int[][] array4 = new int[2][];
    }

二维数组创建的方式有四种,第一种和第二种直接初始化,第三种和第四种指定元素的个数,但不能初始化,这里与C语言有点不一样,Java中不要指定列数,指定相应的行数即可
二维数组我们在此处只做简单的了解。


http://www.jnnr.cn/a/124863.html

相关文章

jupyter notebook安装中文及使用

jupyter notebook 一&#xff1b;下载 首先下载jupyter库&#xff08;pip install jupyter&#xff09;&#xff0c;下载完后&#xff0c;在命令行直接输入jupyter notebook就能进入页面了。 …… 二&#xff1b;设置中文 jupyter notebook刚开始的时候是英文&#xff0c;…

Linux 学习笔记 2022-11-12---------Linux基础

目录1. 用户类型2. 终端 terminal2.1 终端类型2.2 查看当前的终端设备3. 交互式接口3.1 交互式接口类型3.2 什么是shell3.3 Shell 是如何连接用户和内核的&#xff1f;3.4 Shell 还能连接其它程序3.5 Shell 也支持编程3.6 Shell 是一种脚本语言4. 修改主机名5. 命令提示符 prom…

SpringBoot SpringBoot 基础篇 4 基于 SpringBoot 的SSMP 整合案例 4.8 业务层标准开发【基础CRUD】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 基础篇 文章目录SpringBootSpringBoot 基础篇4 基于 SpringBoot 的SSMP 整合案例4.8 业务层标准开发【基础CRUD】4.8.1 业务…

Android Studio App开发之服务Service的讲解及实战(包括启动和停止,绑定与解绑,推送服务到前台实现音乐播放器,附源码)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、服务的启动和停止 服务Service是Android的四大组件之一&#xff0c;它常用于页面的高级场合&#xff0c;这些系统服务平时几乎感觉不到它们的存在&#xff0c;却是系统不可或缺的重要组成部分。 既然Android自带了系统…

入门3dsmax游戏建模你需要掌握的基础规范

很多游戏建模初学者&#xff0c;在开始学习3dsmax的时候&#xff0c;模型制作上&#xff0c;这里比例不对&#xff0c;那里穿模。 掌握规范&#xff0c;掌握技巧&#xff0c;才能更好有效创造与学习。 在朋友圈里&#xff0c;找找数字&#xff1a;❷0❸❽❽❸❽❷❸❻ 各种高清…

day02_python快速入门

day02_快速入门1. 编码2. 编程初体验3. 类型转换4. 变量4.1 变量名的规范4.2 变量内存指向关系5. 今日练习1. 编码 当我们在电脑上输入一段话&#xff0c;并保存到电脑中&#xff0c;在计算机中则会将中文内存转换为01010100100101...这样的形式&#xff0c;最终存储到硬盘上。…

机器学习笔记 十八:基于3种方法的随机森林模型分析房屋参数重要性

这里写自定义目录标题1. 探索性数据分析1.1 数据集分割&#xff08;训练集、测试集&#xff09;1.2 模型拟合2. 特征重要性比较2.1 Gini Importance2.2 Permutation Importance2.3 Boruta3. 特征比较3.1 Gini Importance3.2 Permutation Importance3.3 Boruta4. 模型比较将机器…

论NFV的六大用例

虚拟化正在改变整个IT领域。简而言之&#xff0c;它允许将物理对象转换为其逻辑“虚拟”对象。IT资源虚拟化可以减少运营和资本支出&#xff0c;最大程度地减少停机时间&#xff0c;可以更快地进行配置等等。 这场虚拟化革命的最佳用例显然是在计算上。通过使用服务器并为其创建…

数据挖掘面试经总结【私人版,仅供参考】

1特征归一化 1.1为什么需要对数值类型的特征做归一化&#xff1f; 线性函数归一化零均值归一化 1.2在对数据进行预处理时&#xff0c;应该怎样处理类别型特征&#xff1f; 序号编码独热编码二进制编码 1.3什么是组合特征&#xff1f;如何处理高维组合特征&#xff1f; 例…

聊聊工作中,如何提升自己的编程能力?

在工作中&#xff0c;我们大部分的时间都是在阅读代码&#xff0c;阅读别人的代码也是我们工作中的一部分&#xff0c;真正花在写代码上的时间其实并不多。 我们应该都有这样的体会&#xff0c;那就是刚入职一家新公司&#xff0c;需要维护公司的一些项目代码&#xff0c;这个…

性能测试场景设计之 阶梯性能场景(负载测试场景)

「负载测试&#xff1a;」 逐步增加并发用户数。看服务器的最大拐点区间在哪里。再缩小拐点区间&#xff0c;找出最大并发用户数。 使用方式&#xff1a; 安装 jpgc插件 添加线程组 每次递增10个并发 This group will start&#xff1a;给定当前负载的并发用户数First, wait …

docker 入门篇 (镜像制作+数据卷)

1 docker 镜像制作 以制作自定义 tomcat 为例 拉取tomcat镜像 docker pull tomcat 启动tomcat docker run -it -p 8899:8080 tomcat 启动另外一个线程来修改tomcat 的默认首页信息 docker exec -it 8192 /bin/bash 修改默认首页信息 webapps-》ROOT-》index.html 创建镜像 …

图论刷题记录

[NOIP2003 提高组] 神经网络 - 洛谷P1038 [NOIP2003 提高组] 神经网络 容鄙人说一下&#xff0c;这是鄙人刷过最caodan的一个题&#xff0c;我就没见过这么刁钻的数据.. 传入层的出度可以是0&#xff0c;但是&#xff0c;他依然可以传导&#xff0c;并且还应该被当做答案输出…

Matlab之机载雷达系统中的空时自适应处理(STAP)技术(附源码)

目录 一、介绍 二、系统设置 2.1 天线定义 2.2 雷达设置 2.3 目标 2.4 杂波 2.5 传播路径 三、模拟循环 3.1真实目标范围、角度和多普勒 3.2 使用 DPCA 消除器进行杂波抑制 ​四、总结 五、程序 本例简要介绍了空时自适应处理&#xff08;STAP&#xff09;技术&…

Navigation 组件使用入门

Navigation 组件使用入门https://developer.android.google.cn/guide/navigation/navigation-getting-started 添加依赖 dependencies {def nav_version "2.5.2"implementation "androidx.navigation:navigation-fragment:$nav_version"} 创建导航图 …

【强化学习】深入浅出强化学习--机器人找金币

文章目录Grid_mdp.py定义和初始化从环境状态构建观测值ResetStepRenderingClose注册环境参考文章Grid_mdp.py 定义和初始化 首先自定义环境&#xff0c;自定义的环境将继承gym.env环境。在初始化的时候&#xff0c;可以指定环境支持的渲染模式&#xff08;例如human,rgb_arra…

【python】云打印实现

这两天为了实现云打印功能找了很多相关的文章 记录一下这一篇&#xff0c;python云打印实现-朝花夕拾&#xff0c;代码通过监听文件夹有无产生新文件来判断是否执行&#xff0c;我尝试运行了下没问题&#xff0c;于是打算转载一下 程序运行结果 由于对方的代码和我实现的有点出…

Hive笔记-01 架构概述

文章目录1.概述2.Metadata/Metastore的作用3 Metastore三种配置方式3.1 Hive配置参数说明3.1.1 基本配置参数3.1.2 其他配置参数3.2 内嵌模式&#xff08;Embedded&#xff09; 3.2.1 hive-site.xml配置说明 3.2.2 hive-site.xml配置样例3.2.3 启动方式3.2.4 缺点3.3 本地模式&…

74.【JavaWeb -02】

JavaWeb(十二)、Cookie36.会话37.保存会话的两种技术38.编码和解码&#xff08;养成习惯&#xff09;(十三)、Session(重点)39.session详解:(十四)、JSP原理刨析40.什么是JSP&#xff1f;41.JSP原理42.JSP基础语法1.依赖2.JSP表达式:3.热部署设置4.JSP脚本片段5.HTML内嵌JAVA&a…

【有趣的Python小程序】Python多个简单上手的库制作WalkLattice 走格子游戏 (思路篇)下

在上一篇的分析当中&#xff0c;我们已经基本上完成了基本模块的代码&#xff0c;接下来&#xff0c;我们就为这个代码增添更多好玩有趣的小功能吧。那么还没有看过代码篇和思路篇的朋友们可以点击下方链接直接跳转到代码篇去的哈 文章目录文件地址编程前的准备功能实现下一关卡…
最新文章