当前位置: 首页 > news >正文

数组基础知识

文章目录

  • 基础内容
  • 内存
  • 数组异常
  • 数组工具类 java.util.Arrays 类
    • 常用方法

基础内容

  1. 数组定义:连续的空间,存储同一类型的多个数据。
  2. 数组是引用数据类型,用来存储一个引用值(可理解为地址)
  3. 如果数组没有初始化,直接使用会编译报错
  4. 数组长度一旦确定就无法改变
  5. 静态初始化:
  6. 注意:不能在中括号里明确数组长度
数据类型[] 数组名 = new 数组类型[]{元素1,元素2……};数组类型[] 数字名 = {元素1,元素2……}

内存

  1. 直接打印数组是输出地址
System.out.println(arr);//输出的结果为 地址// 如果有数据,每次输出的地址都不同/* 输出结果为:[I@15db9742
* [ : 当前的空间是一个数组类型
* I : 当前数组容器中所存储的数据类型
* @ : 分隔符
* 15db9742 : 堆空间十六进制内存地址
*/
  1. 内存构成 (这种图要会画)
  • 数组名标识的那块内存(栈空间),存放了一个引用值(地址值),通过该地址值可以找到堆空间相应内存(用来存放数组中所有元素)。

  • 数组在创建时,会开辟2块内存,数组名对应栈空间那块内存,数组元素会存放在堆空间。
    堆空间数组每一个元素位置上,存在相应的默认值,要么为0,要么为0.0,要么为null。

  • 默认值
    堆空间内存存在默认初始化:
    整形数初始化为0,
    浮点数0.0,
    引用类型null,
    字符类型初始化 \u0000,
    布尔类型是false(布尔类型在数组中占1个字节)
    在这里插入图片描述
    变量是 在栈内,方法也是在栈内,

  1. 内存结构图
  • 两个数组的内存结构图
    在这里插入图片描述
  • 一个数组赋值的内存结构图
    在这里插入图片描述
  1. arr2 = arr1; //不是复制,是指向同一个地址。数组是引用数据类型
int[] arr1 = {1,2,3};
int[] arr2 = {4,5,6};arr2 = arr1 ;//arr2 = {1,2,3};  不是将arr2的内容改为1,2,3;而是将 arr2的地址指向arr1的地址。此时原先的arr2的4,5,6没有指向,会被JVM垃圾回收机制 回收。
arr2[0] = 10;//因此 无论改arr1还是 arr2的值,都改的是同一个地址的值。
arr1[0].sout;//10

arr2 = arr1 ;//arr2 = {1,2,3}; 不是将arr2的内容改为1,2,3;而是将 arr2的地址指向arr1的地址。此时原先的arr2的4,5,6没有指向,会被JVM垃圾回收机制 回收。

数组异常

  1. 数组越界:程序运行后,将会抛ArrayIndexOutOfBoundsException数组越界异常。
    解决方法:将错误的索引修改为正确的索引范围内即可
  2. 空指针:只要变量为null,使用对象/调用方法的时候就会报空指针异常
    arr = null 这行代码,意味着变量arr将不再保存数组的内存地址,我们通过arr这个标识符再也找不到堆空间数组元素,因此运行的时候会抛出NullPointerException 空指针异常

数组工具类 java.util.Arrays 类

常用方法

  1. 都是静态方法,所以是 类名.方法名 进行调用
  2. sout才能看见
  • Arrays.toString(arr); //返回类型是String
  • Arrays.copyOf(需要拷贝的数组,新数组的长度);//数组扩容
int[] arr = {1,2};
int[] arr2 = Arrays.copyOf(arr1,5);
//所以新数组 arr2 = {1,2,0,0,0};
  • Arrays.sort(arr);//升序
  • Arrays.binarySearch(数组,值);//二分查找
    • 有序数组中,查找指定的值,返回这个指定的值在- 数组中的下标。
    • 可以使用sort方法先进行排序
    • 找不到会返回一个负数
  • copyOfRange方法(了解):从指定下标复制
  • fill方法(了解):用特定值填充数组
http://www.lqws.cn/news/524215.html

相关文章:

  • IBMS 智能化系统:让建筑提前进入 AIoT 智慧纪元​
  • Linux基本指令篇 —— mv指令
  • 时序数据库 TDengine 助力华锐 D5 平台实现“三连降”:查询快了,机器少了,成本也低了
  • 以太坊执行客户端和共识客户端各自的作用及意义
  • java 对接ETH(以太坊) 交易相关资料
  • 区间求最值问题高效解决方法
  • Linux下使用docker nginx部署vue前端项目工程
  • vue2 使用el-form中el-form-item单独绑定rules不生效问题
  • IoT/HCIP实验-5/基于NB-IoT的智慧农业实验(平台侧开发+端侧编码+基础调试分析)
  • LOOP如何让长周期交互LLM代理在复杂环境中实现突破?
  • 正则表达式匹配实现
  • Boosting:从理论到实践——集成学习中的偏差征服者
  • Prompt:面向目标的提示词
  • WeakAuras Lua Script [ICC BOSS 12 - The Lich King]
  • Objective-C面向对象编程:类、对象、方法详解(保姆级教程)
  • 自动驾驶数据特征提取实战:用Python打开智能驾驶的新视角
  • 深入理解残差网络(ResNet):原理与PyTorch实现
  • Mysql数据库操作大全万字详解
  • 【Redis】Redis的下载安装和配置
  • 检查StringBuilder是否包含字符串
  • ARM内核之CMSIS
  • 【机器学习】非参数贝叶斯回归方法 GPR
  • ipfs在windows下载和安装
  • JSON框架转化isSuccess()为sucess字段
  • C++(智能指针)
  • Liunx操作系统笔记2
  • linux-修改文件命令(补充)
  • IT运维效率提升: 当IT监控遇上3D可视化
  • 三步实现B站缓存视频转MP4格式
  • 记一次AWS 中RDS优化费用使用的案例