JAVA小知识17:数组,从0基础到掌握

        数组,无论在哪种编程语言当中都是最基础,最广泛使用的一种线性表数据结构,这篇文章将从多个角度来从浅入深的讲述数组。

        本文讲述了数组的概念,定义,初始化方法以及如何遍历数组,如何赋值,关于数组越界的问题以及数组在JVM内存中的知识。

一、数组的基本知识 

1.1、数组的概念

  • 数组指的是一种容器,可以用来存储 同种数据类型 的多个值。
  • 数组在存储数据的时候需要结合 隐式转换 来考虑。
  • 数组中若有 整形 和 浮点型 数据,则Boolean类型的数据都存不进去。
  • 数组一旦创建,长度是固定的,无法动态改变

隐式转换

简单数据类型(不包括boolean):
        在Java中整型、实型(常量)、字符型被视为简单数据类型,由低级到高级分别为:
        (byte,short,char) -> int -> long -> float -> double

隐式转换:

        在java中这些简单数据类型从低级转换到高级就是隐式转换,例如如果是double类型的数组,则可以存储所有的简单数据类型,这些比double低级的数据会隐式的转换为double类型存储。

        但是如果是int类型的数组,则 long、float、double都不能存入进去。

1.2、数组的定义 

1.3、数组的初始化  

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

  • 静态初始化:
    • 完整格式:数据类型[ ]  数组名 = new 数据类型[ ]{元素1,元素2,元素3...}
      范例:int []  array = new int[ ]{1,2,3 }
    • 简化格式:数据类型[ ] 数组名 = {元素1,元素2,元素3}
      范例:int[ ] array = {11,22,33 };
  • 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
    • 格式:数据类型[ ] 数组名=new 数据类型[数组长度];
    • 范例:dataType[ ] arrayRefVar = new dataType[arraySize];
  • 区别:
    • 动态初始化:手动指定数组长度,由系统给出默认初始化值,只明确元素个数;
          使用场景:不明确具体数据,推荐使用动态初始化;
    • 静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度;
          使用场景:需求中已经明确了要操作的具体数据,直接静态初始化即可;

数组默认初始化值的规律

整数类型:默认初始化值0
小数类型:默认初始化值0.0
字符类型:默认初始化值 '/u0000' 也就是 空格

布尔类型:默认初始化值 false

引用数据类型:默认初始化值 null

1.4、数组的地址值

        数组的地址值就是数组在内存中的位置。 一般的数组打印之后会呈现以下形式: [D@22927a81

[:    表示当前是一个数组

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

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

22927a81:才是数组真正的地址值,(十六进制)

二、数组的元素访问 

2.1、数组的获取   

        数组的元素是通过索引访问的。数组索引从 0 开始。我们可以将数组理解为一个个整齐排列的单元格,每个单元格里面存放着一个元素。

数组[a,b,c,d,e]
数组[a,b,c,d,e]

        如何获取数组中第一个元素?我们来看看代码。以此类推,我们最多能获得 数组长度-1 个元素。

public static void main(String[] args) {
    String[] arr = {"a", "b", "c", "d", "e"};
    // 获取数组中第一个元素
    String s0 = arr[0];
    System.out.println(s0); // a
}

 2.2、数组的赋值

         通过下面代码我们就能理解如何赋值,但是注意的是:该索引元素赋值后原先元素就不存在了。

public static void main(String[] args) {
    String[] arr = {"a", "b", "c", "d", "e"};
    // 赋值数组中第一个元素
    arr[0]="a1";
    System.out.println(arr[0]); // a1
}

 2.3、数组的遍历

        数组的遍历方法有很多种,我们来展示三种方法:

public static void main(String[] args) {
    String[] arr = {"a", "b", "c", "d", "e"};
    // 方法一:普通for循环
    for(int i = 0; i <arr.length;i++){
        System.out.println(arr[i]);
    }
    // 方法二:增强for循环
    for (String s : arr) {
        System.out.println(s);
    }
    // 方法三、foreach+lamdba表达式
    Arrays.stream(arr).forEach(e-> System.out.println(e));
}

三、数组的常见问题 

 3.1、数组越界问题

        在开发中我们经常能遇见到数组越界问题,这也是一个很常见的问题,他会抛出一个:java.lang.ArrayIndexOutOfBoundsException 异常,这个就是数组越界异常,我们来看看是如何造成的。

        下列代码中,数组arr共有5个元素,那么他的数组长度为5,索引到4,如果查询索引5,则会造成数组越界异常。

四、数组的高级知识 

4.1、数组在JVM中的内存 

 在JAM虚拟机中有如下区域分布:

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

一般形式的栈内存与堆内存

定义一个数组的内存图 

        当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改之后的结果了。

        将arr1赋值给arr2,实际上是将地址值引用给了arr2,更改arr2也会影响arr1.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4. Revit API UI 之 Ribbon(界面)

4. Revit API UI 之 Ribbon&#xff08;界面&#xff09; 第二篇中&#xff0c;我们提到了IExternalApplication&#xff0c;该接口需要实现两个方法&#xff1a;Revit启动时调用的OnStartup 方法&#xff0c;和Revit关闭时调研的OnShutdown 方法。文中还给了个例子&#xff0…

剧透!「飞凌嵌入式技术创新日」3大亮点抢先看

6月25日&#xff0c;飞凌嵌入式技术创新日&#xff08;北京站&#xff09;即将开幕&#xff0c;一场嵌入式前沿科技的高端局就在眼前。 飞凌嵌入式作为国内较早专业从事嵌入式技术的企业&#xff0c;凭借18年的行业深耕和丰富的技术积累&#xff0c;已在业界赢得了广泛的影响力…

LabVIEW电源适应能力检测系统

随着工业自动化程度的提高&#xff0c;电源质量直接影响设备的稳定运行。利用LabVIEW开发一个单相电源适应能力检测系统&#xff0c;该系统通过智能化和自动化测试&#xff0c;提高了测试效率&#xff0c;减少了人为错误&#xff0c;保证了电源质量的可靠性。 项目背景 在现代…

大厂面试必备:如何轻松实现分布式Session管理?

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!​​​​​​​ 大家好,我是小米,一个29岁的技术爱好者,喜欢分享各种技术干货。今天我们来聊一聊阿里巴巴面试中的一个经典问题:如何实现分布式Sess…

HCIA12 NAT网络地址转换实验

NAT&#xff08;Network Address Translation&#xff09;是将 IP 报头中的 IP 地址转换为另一个 IP 地址的过程。主要俩好处&#xff1a; • 有效避免来自外网的攻击&#xff0c;可以很大程度上提高网络安全性。 • 控制内网主机访问外网&#xff0c;同时也可以控制外网…

你的医书是假的!批评《DDD诊所——聚合过大综合症》(合集)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 &#xff08;《你的医书是假的&#xff01;》原文写于2023年8月&#xff0c;以系列文章方式发表&#xff0c;现合并成一篇文章&#xff09; 一、说在前面 这两天在“ Thoughtworks洞见…

Mac vscode could not import github.com/gin-gonic/gin

问题背景&#xff1a; 第一次导入一个go的项目就报红 问题分析&#xff1a; 其实就是之前没有下载和导入gin这个web框架包 gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确。 问题解决&#xff1a; 依次输入以下命令。通…

【STM32】输入捕获应用-测量脉宽或者频率(方法1)

图1 脉宽/频率测量示意图 1 测量频率 当捕获通道TIx 上出现上升沿时&#xff0c;发生第一次捕获&#xff0c;计数器CNT 的值会被锁存到捕获寄存器CCR中&#xff0c;而且还会进入捕获中断&#xff0c;在中断服务程序中记录一次捕获&#xff08;可以用一个标志变量来记录&#…

阿里最强开源大模型本地部署、API调用和WebUI对话机器人

阿里巴巴通义千问团队发布了Qwen2系列开源模型&#xff0c;该系列模型包括5个尺寸的预训练和指令微调模型&#xff1a;Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B以及Qwen2-72B。对比当前最优的开源模型&#xff0c;Qwen2-72B在包括自然语言理解、知识、代码、数学及多…

新加坡裸机云多IP服务器为何适合跨境外贸业务

新加坡裸机云多IP服务器在跨境外贸业务中展现出了卓越的适配性&#xff0c;其独特优势为外贸企业提供了强大的支持。以下将详细阐述为何新加坡裸机云多IP服务器是跨境外贸业务的理想选择。 首先&#xff0c;新加坡裸机云多IP服务器在性能上表现出色。由于去除了虚拟化层的开销&…

聚观早报 | 粉笔将推AI智能老师;比亚迪宋L DM-i车型官宣

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 6月13日消息 粉笔将推AI智能老师 比亚迪宋L DM-i车型官宣 真我GT7 Pro配置全面升级 理想发布最新单周销量榜单 …

如何免费用 Qwen2 辅助你翻译与数据分析?

对于学生用户来说&#xff0c;这可是个好消息。 开源 从前人们有一种刻板印象——大语言模型里好用的&#xff0c;基本上都是闭源模型。而前些日子&#xff0c;Meta推出了Llama3后&#xff0c;你可能已经从中感受到现在开源模型日益增长的威力。当时我也写了几篇文章来介绍这个…

SMT智能车间MES系统的实施方案

SMT行业中MES系统实施的关键特征&#xff1a; SMT包括上下板设备&#xff0c;印刷设备&#xff0c;贴片设备&#xff0c;回流焊炉&#xff0c;AOI。AOI的全称是自动光学检查&#xff0c;它基于光学原理来检测焊接生产中遇到的常见缺陷。测试设备&#xff0c;测试设备等MES解决…

Java多商户商城系统/pc商城/公众号/h5/小程序

>>>系统简述&#xff1a; 基于java vue uniapp 开发的一套 新零售商城系统就是集客户关系管理营销电商系统&#xff0c;能够真正帮助企业基于微信公众号、小程序、移动端等&#xff0c;实现会员管理、数据分析,精准营销的电子商务管理系统。可满足企业新零售、批发…

Vite 为什么这么火?

大家好&#xff0c;我是前端宝哥。 最近&#xff0c;Vite 真是火得不行&#xff0c;几乎每天都能看到关于它的讨论。这个工具到底有多厉害&#xff1f;它为什么这么火&#xff1f; 自从 2020 年 4 月发布以来&#xff0c;Vite 的人气一路飙升。在 GitHub 上已经获得了 64k 的星…

VUE之重定向redirect

VUE之路由和重定向redirect 这个小知识点是在学习做项目的时候遇到的一个问题&#xff0c;借鉴了一个他人的项目&#xff0c;是一个酒店管理系统&#xff0c;拿到源码之后导到我的vscode里。 参考链接 导的过程比较顺利&#xff0c;正常安装&#xff0c;加依赖&#xff0c;没有…

PHP调用快递地址解析接口助力项目优化

快递地址智能解析是日常开发中一个重要的工具&#xff0c;可以帮助快递公司提高效率&#xff0c;减少错误&#xff0c;进行数据分析。也可以帮助网购用户快速输入收货地址&#xff0c;提升用户体验。 看完以下操作文档&#xff0c;可以让你在开发中以最快时间完成这个功能&…

一维信号的时频分析(Python)

代码较为简单&#xff0c;很容易读懂。 Importing the required libraries import os import numpy as np import pywt import pandas as pd import pickle as pkl from matplotlib import pyplot as plt Parameters or Required Variables DATA_POINTS_PER_FILE 2560 TIM…

Elasticsearch搜索引擎(初级篇)

1.1 初识ElasticSearch | 《ElasticSearch入门到实战》电子书 (chaosopen.cn) 目录 第一章 入门 1.1 ElasticSearch需求背景 1.2 ElasticSearch 和关系型数据库的对比 1.3 基础概念 文档和字段 索引和映射 第二章 索引操作 2.0 Mapping映射属性 2.1 创建索引 DS…