数组

简介: 数组

一、JVM内存模型



image.png

JVM内存模型


JVM内存划分,人为的根据不同内存空间的存储特点以及存储的数据(不是实际就有这样的空间)。


程序计数器:当前线程所执行的字节码的行号指示器。


本地方法栈:为虚拟机使用的native方法服务。


方法区:线程共享的内存区域,存储已被虚拟机加载的类信息、常量、静态变量即时编译器编译后的代码数据等(这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载)。


Java虚拟机栈:简称栈,每个方法被执行的时候都会同时创建一个栈帧用于存储该方法的局部变量、操作栈、动态链接、方法出口等信息。


每当调用一个方法时,创建一个栈帧,存放了当前方法的局部变量,当方法调用完毕,该方法的栈帧就被销毁了。


Java堆:被所有线程共享的一块内存区域,在虚拟机启动时创建。所有的对象实例以及数组都要在堆上分配。


每次使用new关键字,就表示在堆内存中开辟一块新的存储空间。

GC(Garbage Collection),垃圾回收器。


      Java的自动垃圾回收机制可以简单理解为,不需要程序员手动的去控制内存的释放。当JVM内存资源不够用的时候,就会自动地去清理堆中无用对象(没有被引用到的对象)所占用的内存空间。


二、数组


1、什么是数组


所谓数组,把具有相同类型的多个常量值有序组织起来的一种数据形式。这些按一定顺序排列的多个数据称为数组。而数组中的每一个常量值称之为数组元素,数组中使用索引来表示元素存放的位置,索引从0开始,步长是1,有点像Excel表格的行号。


2、定义语法


数组的定义语法:


数组元素类型[]  数组名;  如   int[] ages; 
另一种方式:int ages[]; 不推荐


理解:

  1. 可以把int[]看成是一种数据类型——int类型的数组类型。
  2. int[] 数组可以看出,该数组中的元素类型是int类型的。
  3. String[] 数组可以看出,该数组中的元素是String类型的。


3、数组的初始化


数组在定义后,必须初始化才能使用。所谓初始化,就是在堆内存中给数组分配存储空间,并为每一个元素赋上初始值,有两种方式:


  • 静态初始化;
  • 动态初始化;


3.1静态初始化


程序员直接为每一个数组元素设置初始化值,而数组的长度由系统(JVM)决定。

语法:数组元素类型[]  数组名 = new 数组元素类型[]{元素1,元素2,元素3,.......};


int[] nums = new  int[]{1,3,5,7,9};
简单写法:
int[] nums = {1,3,5,7,9};//简单写法,定义和初始化必须同时写出来


3.2 动态初始化


程序员只设置数组元素个数,而数组的元素的初始值由系统(JVM)决定。


语法:数组元素类型[]  数组名 = new 数组元素类型[length];


int[] nums = new  int[5];


不能同时指定元素值和数组长度,反例如下:


int[] nums = new int[5]{1,3,5,7,9};


不同数据类型的初始值:


image.png


图片 55.png


int[] arr1 = new int[3];        int类型数组,每一个元素的初始值为0
double[] arr2 = new double[5];  double类型数组,每一个元素初始值为0.0
String[] arr3 = new String[2];  String类型数组,每一个元素的初始值为null


4、数组的遍历


int[] nums = new int[] { 1, 3, 5, 7 };
for (int index = 0; index < nums.length; index++) {
    int ele = nums[index];//index依次是    0、1、2、3
    System.out.println(ele);
}

使用for-each(增强for循环)操作数组


for(数组元素类型 变量: 数组){
    //TODO
}


使用for-each操作数组更简单,因为可以不关心索引,其底层原理依然是上述的for循环操作数组。


int[] nums = new int[] { 1, 3, 5, 7 };
for (int ele : nums) {
    System.out.println(ele);
}


三、二维数组


1、二维数组的定义和初始化


定义和静态初始化一维数组的语法:

数组元素类型[] 数组名 = new 数组元素类型[]{值1,值2,值3,...};如:


int[] nums = new int[]{1,3,5,7};


定义和静态初始化二维数组的语法:


数组元素类型[][] 数组名 = new 数组元素类型[][]{数组1,数组2,数组3,...};


注意,二维数组中的元素类型是一维数组,把数组元素类型[]看成一个整体,表示数据类型。


public class ArrayInArrayDemo1 {
    public static void main(String[] args) {
        //定义三个一维数组
        int[] arr1 = { 1, 2, 3 };
        int[] arr2 = { 4, 5 };
        int[] arr3 = { 6 };
        //把三个一维数组存储到另一个数组中,那么该数组就是二维数组
        int[][] arr = new int[][] { arr1, arr2, arr3 };
    }
}


定义和动态初始化二维数组的语法:

数组元素类型[][] 数组名 = new 数组元素类型[x][y];


x表示二维数组中有几个一维数组

y表示每一个一维数组中有几个元素。


int[][] arr = new int[3][5];
System.out.println(arr.length);     //输出3


获取二维数组的元素


因为二维数组表示数组的中的数组,如果要获取数组的每一个元素值,则需要两个循环嵌套。


//二维数组
int[][] arr = new int[][] { 
    { 1, 2, 3 }, 
    { 4, 5 }, 
    { 6 } 
};


使用for循环:


for (int index = 0; index < arr.length; index++) {
    //取出每一个一维数组
    int[] arr2= arr[index];
    //迭代一维数组
    for (int j = 0; j < arr2.length; j++) {
        int ele = arr2[j];
        System.out.println(ele);
    }
    System.out.println("-----");
}


使用for-each:


for (int[] arr2 : arr) {
    //arr2为每次遍历出来的一维数组
    for (int ele : arr2) {
        //ele为从arr2一维数组中遍历出来的元素
        System.out.println(ele);
    }
    System.out.println("-----");
}



相关文章
JavaWeb - Request 之 Header Key 大小写是否敏感?
JavaWeb - Request 之 Header Key 大小写是否敏感?
2791 0
|
8月前
|
机器学习/深度学习 自然语言处理 算法
大模型和机器学习
本文系统解析大模型与机器学习的关系,指出大模型是机器学习在“大参数、大数据、大算力”下的进化形态,二者为包含与被包含关系。文章从技术本质、能力特点、应用场景等10个维度对比分析,强调两者非替代而是互补,并展望融合发展趋势。
887 3
|
2月前
|
人工智能 JSON 文字识别
金融AI技能库:104个开源Skill即插即用
零API费用的金融AI技能库:104个场景纯Python实现,毫秒级响应 当金融AI遇上"账单焦虑" 金融行业的AI落地,存在一个被长期忽视的悖论:业务方要的是"即时可用",技术方给的是"先接API再说"。 一个发票查验场景,接入第三方OCR服务,单次调用0.3元,日均10万笔,月账单9万。一个财报分析需求,调用大模型API,单次Token消耗折合0.8元,季报期间批量处理500份,
|
10月前
|
人工智能 安全 调度
一文详解容器服务面向大模型和 AI Agent 的技术变革
在生成式人工智能迅猛发展的浪潮下,企业应用正加速从模型研究走向业务落地。无论是大规模的数据处理、超大参数模型的训练与推理,还是部署能够自动完成任务的 AI Agent,这些场景都需要稳定、高效且可弹性伸缩的资源调度与管理能力。容器凭借环境一致性、跨平台部署和高效调度等优势,天然契合 AI 场景对多样化算力、快速迭代和规模化分发的要求,成为 AI 时代事实上的原生基石。然而,要满足在生产规模下的需求,产品及技术形态需随之演进。
880 3
|
5月前
|
机器学习/深度学习 文字识别 自动驾驶
不会深度学习也能玩转视觉?用 OpenCV + Python,带你从0做出目标检测!
不会深度学习也能玩转视觉?用 OpenCV + Python,带你从0做出目标检测!
352 2
|
5月前
|
自然语言处理 算法 知识图谱
高维数据新突破!大语言模型赋能特定领域文本分类标注,效率精准双提升
合肥高维数据提出“大模型+工具箱”专业文本标注新方法:为LLM配备7类查询接口,支持术语查解、知识积累与专家协同;结合流程化工作流与遗传算法优化指令,显著提升医疗、金融、法律等领域的标注准确率与自动化水平。(239字)
380 4
|
6月前
|
安全 数据挖掘 API
如何在不依赖在线API的情况下,批量、快速地查询海量IP的归属地?
面对百万至千万级IP查询需求,依赖在线API易致延迟、不稳定与数据泄露。本地离线方案将IP库部署于内网,毫秒级批量解析,零调用费、高安全、强扩展,支持Python/Java/Go多语言,适配风控、画像、审计等核心场景。
405 1
|
10月前
|
传感器 人工智能 编解码
2025年11月,全球数字人技术竞技场与数字化应用技术指南
2025年,全球数字人技术进入多维竞技时代。中美中东等地在技术深度、场景广度与生态厚度上全面比拼,推动数字人从“形似”到“神似”、从营销工具到产业赋能、从技术单打独斗到价值共生的跃迁,掀起一场重塑产业与人文交互的创新浪潮。
|
10月前
|
Dubbo Java 测试技术
【Lattice】设计原理
Lattice 是一个轻量级业务扩展调用框架,通过模块化架构实现复杂业务定制的高效管理。支持动态发现、加载与执行扩展,提供清晰的分层设计,集成 Spring、Dubbo 等主流技术,助力企业应用灵活扩展。
945 0
|
人工智能 监控 安全
微信怎么无限制加人?有这种技术吗
微信无限制加人技术解析与合规实践指南