(JavaSE) 数组

news2024/12/19 19:04:14

文章目录

  • 1. 数组的作用
  • 2. 数组的创建及初始化
    • 2.1 数组的创建
    • 2.2 数组的初始化
  • 3. 数组的使用
    • 3.1 数组中元素的访问
    • 3.2 遍历数组方法
  • 4. 数组是引用类型
    • 4.1 JVM中的内存有那些
    • 4.2 数组如何开辟空间
    • 4.3 数组 null 的意思
    • 4.4 引用不能同时指向多个对象
    • 4.5 数组作为方法返回值
  • 5. 二维数组
    • 5.1 二维数组的使用
    • 5.2 遍历打印二维数组
    • 5.3 不规则数组

1. 数组的作用


当我们要对打印几位学生其中一门科目的成绩时

public class Blogs {
    public static void main(String[] args) {
        int score1 = 60;
        int score2 = 69;
        int score3 = 79;
        int score4 = 83;
        int score5 = 99;
        System.out.println(score1);
        System.out.println(score2);
        System.out.println(score3);
        System.out.println(score4);
        System.out.println(score5);
    }
}

在这里插入图片描述这样写是没问题的,但是当我们要打印全校的学生成绩呢,那就会很麻烦,
值得注意的是成绩的类型都是一样的,这时我们就可以使用数组进行打印。


2. 数组的创建及初始化


2.1 数组的创建

在这里插入图片描述

int[] array1 = new int[5];  //创建一个可以容纳5个 int 类型元素的数组
double[] array2 = new double[5]; //创建一个可以容纳5个double类型元素的数组
char[] array3 = new char[5]; //创建一个可以容纳5个char类型元素的数组


2.2 数组的初始化

初始化的三种方式

public class Blogs2 {
    public static void main(String[] args) {
        //第一种初始化方式
        int[] array1 = {1, 2, 3, 4, 5, 6, 10};
        //第二种初始化方式
        int[] array2 = new int[]{1, 2, 3, 4, 5, 6, 10};
        //第三种初始化方式
        int[] array3 = new int[7];
        System.out.println(array1.length); //同过 数组名.length 计算数组长度
    }
}
  1. 第一、二种初始化方式为静态初始化,静态初始化即在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定,即在初始化时编译器会根据 {} 中元素个数确定数组长度,第二种中 T[] 的 [] 中不能输入具体的数字。
  2. 第一种其实是和第二种是一样的,这样写就是省略了 new int[] 但是编译器在编译代码时会还原。
  3. 第三种为动态初始化,动态初始化即在创建数组时,直接指定数组中元素的个数,T[] 的 [] 中必须指明数组长度,当我们没有对其进行赋值时,默认为类型对应的 0 值,如果数组中存储元素类型为引用类型,默认值为null。
  4. 计算数组长度方法,数组名.length

注意:使用静态初始化分两行写时不可以省略 new T[]

int[] array1;
array1 = new int[]{1, 2, 3, 4,};

3. 数组的使用


3.1 数组中元素的访问

数组的下标是从 0 开始的,通过下标可以访问和修改元素,如下图:

在这里插入图片描述

public class Main {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        array[2] = 19; //下标为2的元素变为19
        System.out.println(array[2]); //打印下标为2的元素
    }
}

下标为 2 的元素被改变了,即元素 3 变为 19
在这里插入图片描述



3.2 遍历数组方法

所谓 “遍历” 是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作

1. 使用 for 循环进行遍历。

public class Main {
	public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }
}

在这里插入图片描述


2. 使用 for-each 进行遍历

public class Main{
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        for (int x : array) { //将 array 中元素值从0下标开始逐一赋值给x
            System.out.print(x + " ");
        }
    }
}

在这里插入图片描述

这个意思是每循环一次 array 就会把一个值赋给 x ,直到数组中元素都赋值一遍,需要注意的是冒号左边的类型需要和 array 数组类型一致

3. 使用 Arrays 工具类的方法进行遍历


toString()用法

import java.util.Arrays;
public class Main{
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        String ret = Arrays.toString(array); //会返回一个字符串,需要接收
        System.out.println(ret);
    }
}

结果

1. 传入数组会返回一个字符串的表达方式
2. 使用 Arrays.toString(); 时需要在开头写 import java.util.Arrays; 原因是使用库的工具类时需要说明。
3. 使用时会返回一个字符串,所以要用一个 String 引用类型进行接收



4. 数组是引用类型


4.1 JVM中的内存有那些

内存是一段连续的存储空间,主要用来存储程序运行时数据的。比如:

  1. 程序运行时代码需要加载到内存
  2. 程序运行产生的中间数据要存放在内存
  3. 程序中的常量也要保存
  4. 有些数据可能需要长时间存储,而有些数据当方法运行结束后就要被销毁
  5. 如果对内存中存储的数据不加区分的随意存储,那对内存管理起来将会非常麻烦。

JVM内存分布

4.2 数组如何开辟空间

public class Main{
    public static void main(String[] args) {
        int[] array = {2, 3, 6, 19};
    }
}

以下是 array 开辟空间过程:
在这里插入图片描述

我们试着打印 array 这个变量,它会是一个地址。

public class Main{
    public static void main(String[] args) {
        int[] array = {2, 3, 6, 19};
        System.out.println(array);
    }
}

在这里插入图片描述


4.3 数组 null 的意思

int[] array = null; 代表这个引用 不指向任何对象
public class Main{
    public static void main(String[] args) {
        //int[] array = 0;   错误的,
        int[] array = null;   //代表 array 这个引用不指向任何对象
        System.out.println(array.length);	// 错误,array 不指向任何对象,没有长度
        System.out.println(array[0]);  // 错误,和上面一个道理
    }
}

让我们再来看看以下程序:

import java.util.Arrays;
public Main {
    public static void main(String[] args) {
        int[] array1 = {1, 2, 3, 4};
        int[] array2 = array1;
        System.out.println("array1=" + Arrays.toString(array1));
        System.out.println("array2=" + Arrays.toString(array2));
    }
}

在这里插入图片描述

int[] array2 = array1; 代表 array2这个引用 引用/指向了 array1 所引用/指向的对象,同时可以通过array2 来修改 array1,它们存着一样的地址,下面我们来画画图理解:

在这里插入图片描述

4.4 引用不能同时指向多个对象

我们来看看为什么

import java.util.Arrays;
public class Main{
    public static void main(String[] args) {
        int[] array = {1, 2, 4};
        array = new int[]{1, 3, 9};
        array = new int[]{2, 0, 3};
        System.out.println(Arrays.toString(array));
    }
}

可以猜猜这个数组最后打印了什么,下面我们来画画图,这里我们简略画一下就好

在这里插入图片描述

4.5 数组作为方法返回值

public class Main {
    public static int[] array() {
        int[] array = {1, 2, 4};
        return array;
    }
    public static void main(String[] args) {
        int[] ret = array();
        System.out.println(Arrays.toString(ret));
    }
}

我们来画图理解:
在这里插入图片描述


5. 二维数组


5.1 二维数组的使用

public class Main {
    public static void main(String[] args) {
        int[][] array1 = {{1, 2, 3}, {3, 2, 1}};
        
        int[][] array2 = new int[][]{{1, 2, 3}, {3, 2, 1}};
        
        int[][] array3 = new int[2][3];
    }
}

5.2 遍历打印二维数组

1. 使用 for 循环打印

    public static void main(String[] args) {
        int[][] array = {{1, 2, 3}, {3, 2, 1}};
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }
    }

在这里插入图片描述

二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组。

在这里插入图片描述所以代码可改成

    public static void main(String[] args) {
        int[][] array = {{1, 2, 3}, {3, 2, 1}};
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }
    }

2. 使用 for-each 进行遍历打印

    public static void main(String[] args) {
        int[][] array = {{1, 2, 3}, {3, 2, 1}};
     //因为二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组,所以我们用一维数组接收
        for (int[] array1 : array) {
            for (int x : array1) {
                System.out.print(x + " ");
            }
            System.out.println();
        }
    }

解释:因为二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组,所以我们用一维数组接收,一维数组接收后再经过每一次循环从 0 下标开始逐一将元素赋值给 x


3. 使用 Arrays.deepToString()

public class Main {
    public static void main(String[] args) {
        int[][] array = {{1, 2, 3}, {3, 2, 1}};
        System.out.println(Arrays.deepToString(array));
    }
}

在这里插入图片描述

5.3 不规则数组


当我们这样写时,编译器不会报错
int[][] array = new int[2][];

它是长这样的
在这里插入图片描述
那我们再来看看

import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        int[][] array = new int[2][];
        array[0] = new int[]{1, 2};
        array[1] = new int[]{1, 2, 3, 4};
        System.out.println(Arrays.deepToString(array));
    }
}

在这里插入图片描述
我们可以看到这就是不规则数组。

我们来画图看看
在这里插入图片描述

好的,到这里本章节就结束了,如发现有错误,请各位大佬及时指出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【一键生成】3DMAX配景楼生成插件使用教程

3DMAX室外设计师常常需要创建各种场景配楼&#xff0c;为了解决大场景制作难的情况&#xff0c;3dMax配景楼生成插件是一款傻瓜式的插件或许更能快速让你从繁重的体力劳动中解脱出来&#xff01; 【安装方法】 方法一&#xff1a;拖动插件文件到3dMax窗口。 方法二&#xff1a;…

MySQL 主要线程

文章目录MySQL 主要线程1. Master thread2. io thread3. purge thread4. page Cleaner ThreadMySQL 主要线程 1. Master thread Master thread有四大循环&#xff0c;分别是loop,background loop&#xff0c;suspend loop&#xff0c;flush loop。且四大循环的作用如下: loop…

第二篇 基于自然语言处理的漏洞检测方法综述

杨伊等 来源&#xff1a;计算机研究与发展 目录 1 相关技术 1.1 自然语言处理 1.2 漏洞检测与分析 据2021年CVE漏洞趋势安全报告&#xff0c;当前漏洞类型占比最大的5类漏洞分别是代码执行、拒绝服务、溢出、跨站脚本以及信息获取。基于自然语言处理技术实现漏洞检测的研究…

STM32F103实现激光测距传感器测距WT-VL53L0 L1

目录 本博客将采用标准库和HAL库实现 所用设备选择 引脚说明 与单片机的接线表 标准库实现 HAL库实现 本博客将采用标准库和HAL库实现 所用设备选择 单片机型号&#xff1a;STM32F103C8T6 激光测距传感器型号&#xff1a;WT-VL53L0 L1 采用串口TTL电平输出&#xff0c;可…

CSDN云IDE初次测评体验

CSDN云IDE初次测评体验 文章目录CSDN云IDE初次测评体验一、前言二、云IDE产品介绍三、云IDE使用教程1、尝试编写Python爬虫代码2、尝试编写Python可视化代码3、尝试连接MySQL数据库四、最后我想说一、前言 最近一直有收到CSDN官方私信参加这个测评云IDE活动&#xff0c;刚好这…

YOLOv5剪枝 | 模型剪枝理论篇 | 1/2

文章目录 1. 前言2. 摘要精读3. 背景4. 本文提出的解决方式5. 通道层次稀疏性的优势6. 挑战7. 缩放因素和稀疏性惩罚8. 利用BN图层中的缩放因子9. 通道剪枝和微调10. 多通道方案11. 处理跨层连接和预激活结构12. 实验结果12.1 CIFAR-10数据集剪枝效果12.2 CIFAR-100数据集剪枝效…

Kafka图形管理界面Kafka-eagle安装配置详解

Kafka Eagle是一款结合了目前大数据Kafka监控工具的特点&#xff0c;重新研发的一块开源免费的Kafka集群优秀的监控工具。它可以非常方便的监控生产环境中的offset、lag变化、partition分布、owner等。 官方网址&#xff1a;EFAK 点击下载&#xff0c;将安装包下载到电脑本地&…

pytoch安装

1、安装 Anaconda 2、检查显卡&#xff0c;驱动&#xff08;检查是否较新&#xff09; winR——cmd&#xff0c;进入命令行&#xff0c;输入&#xff1a; nvidia-smi 如果版本不够&#xff0c;去官网下载Release Notes :: CUDA Toolkit Documentation (nvidia.com) 3、创建P…

【飞桨PaddleSpeech语音技术课程】— 语音识别-流式服务-模型部分

(以下内容搬运自飞桨PaddleSpeech语音技术课程&#xff0c;点击链接可直接运行源码) 流式语音识别模型 Deepspeech2 与 Conformer 1. 前言 1.1 背景知识 语音识别(Automatic Speech Recognition, ASR) 是一项从一段音频中提取出语言文字内容的任务。 (出处&#xff1a;DLHL…

开源监控软件Zabbix5部署实战

系列文章目录 文章目录系列文章目录一、zabbix介绍一、zabbix部署1、zabbix环境2、安装zabbix的安装包安装zabbix_server安装被监控方 web001一、zabbix介绍 百度百科&#xff1a;Zabbix 是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。它是一…

2022-10-27 工作记录--Swiper/React-解决swiper处理动态数据出现样式紊乱、抖动问题

Swiper/React-解决swiper处理动态数据出现样式紊乱、抖动问题 First of all&#xff0c;检查自己在push数据前是否先清空了数组&#xff1a; 若已清空&#xff0c;请直接往下看&#x1f441;&#x1f441;哦&#xff1b;若未清空&#xff0c;请先清空数组&#xff08;可查看我的…

机器学习笔记:支持向量机SVM

1 一些概念 1.1 线性可分 在二维空间上&#xff0c;两类点被一条直线完全分开叫做线性可分。严谨的说法是&#xff1a; D0和 D1 是 n 维欧氏空间中的两个点集。如果存在 n 维向量 w 和实数 b&#xff0c;使得所有属于 D0 的点 xi 都有 wxib>0 &#xff0c;而对于所有属于 …

【面试题】 ES6知识点详细解析

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 &#x1f354;let const 其他知识点补充 块级作用域的补充 const 不可以在循环体里面声明变量给大家推荐一个实用面试…

从零备战蓝桥杯——动态规划(背包dp篇)

双非刷leetcode备战2023年蓝桥杯&#xff0c;qwq加油吧&#xff0c;无论结果如何总会有收获&#xff01;一起加油,我是跟着英雄哥的那个思维导图刷leetcode的&#xff0c;大家也可以看看所有涉及到的题目用leetcode搜索就可以哦&#xff0c;因为避让添加外链&#xff0c;一起加…

【JavaWeb】之Tomcat介绍、安装与使用

【JavaWeb】Tomcat前言一、Tomcat简介1.什么是Tomcat2.其他常用Web服务器二、Tomcat安装1.下载Tomcat2.配置环境变量三、Tomcat使用1.启动与关闭Tomcat2.修改Tomcat的端口号和主机名称3.使用IDEA搭建Web开发环境4.在Tomcat中部署web项目四、Web项目目录结构五、网站访问流程后记…

【Linux】yum vim 基础工具的使用

文章目录1. Linux环境下的软件包管理器---- yum1.2 什么是软件包1.3 yum源镜像配置1.4 yum查看软件包1.5 yum 如何安装软件1.6 yum 如何卸载软件2. Linux编辑器--vim2.1 vim 简介2.2 . vim的基本操作2.3 vim命令模式下的命令集2.3.1 光标移动2.3.2 编辑2.4 vim末行模式下的命令…

Python入门自学进阶-Web框架——24、DjangoAdmin项目应用-定制页面2

这里要实现点击对应的表名称&#xff0c;显示具体表的详细内容&#xff0c;大致的流程是&#xff1a; 前端显示各个表名&#xff0c;如下&#xff1a; <tbody>{% for table_name,admin in app_tables.items %}<tr class"border-bottom"><td style&…

彻底理解Java并发:volatile关键字

本篇内容包括&#xff1a;volatile 关键字简介、volatile 保证可见性&#xff08;包括&#xff1a;关乎不可见性问题描述、JMM内存模型和不可见性的解决方案&#xff09;以及 volatile 其他特性&#xff08;包括&#xff1a;volatile 不保证原子性、volatile 原子性的保证操作、…

mysql-高级命令(1)和一些函数(悟已往之不谏,知来者之可追)

一、高级命令 1.查询某个字段和多个字段 select 某个字段&#xff08;或者多个字段&#xff0c;中间以逗号间隔&#xff09;from 表名&#xff1b; 2. 去除字段的重复值 3.and 表示&#xff08;两个条件都需要满足&#xff09; 4.or &#xff08;两个条件满足一点&#xff09;…

【Linux】软件包管理器 yum 与编辑器 vim 的基本使用

文章目录一、yum 背景知识1、商业生态2、开源生态3、软件生态本土化二、yum 的基本使用1、查看软件包2、安装软件3、卸载软件三、vim 的基本使用1、vim 的基本概念2、vim 的基本操作2.1 模式间切换2.2 光标定位2.3 文本复制2.4 文本编辑2.5 底行模式的操作四、简单 vim 配置2、…