文章目录

  • 前言
  • 一、数组的基本概念
    • 1.1 数组的创建和初始化
    • 1.2 数组的基本使用
  • 二、数组是引用类型
    • 2.1 初始JVM的内存分布
      • JVM内存划分(按功能分区)
    • 2.2 基本类型变量与引用类型变量的区别
    • 2.3 再谈引用变量
    • 2.4 认识null
  • 三、数组作为函数的参数和返回值
  • 四、数组的应用场景
    • 4.1 数组转字符串
    • 4.2 数组的拷贝
    • 4.3 深拷贝和浅拷贝问题
    • 4.3 冒泡排序的小优化
    • 4.4 数组逆序
    • 4.5 数组逆序
    • 4.6 数组练习
  • 五、二维数组
    • 5.1 普通二维数组
    • 5.2 不规则的二维数组
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

在Java编程的征途中,数组作为基础却至关重要的数据结构,是每个开发者必须掌握的核心技能。它不仅是存储同类型元素的​​高效容器​​,更是算法实现、数据处理的​​底层基石​​。从简单的成绩管理系统到复杂的矩阵运算,数组以其简洁的内存模型和快速的随机访问能力,奠定了程序逻辑的基本骨架。本篇博客将深入剖析Java数组的特性、应用场景及性能要点,帮助您从语法本质到实战技巧全面驾驭这一编程利器。

注意:和c语言内容大致相同的部分会简单带过或者不讲解


提示:以下是本篇文章正文内容,下面案例可供参考

一、数组的基本概念

1.1 数组的创建和初始化

数组的创建:

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

T:表⽰数组中存放元素的类型
T[]:表⽰数组的类型
N:表⽰数组的⻓度

public class array {public static void main(String[] args) {int[] array1=new int[10];double[] array2=new double[10];String[] array3=new String[10];}
}

数组的初始化:
数组的初始化主要分为动态初始化以及静态初始化

  1. 动态初始化:在创建数组时,直接指定数组中元素的个数,只开辟空间但是不赋初值
  2. 静态初始化:在创建数组时不直接指定数据元素个数,⽽直接将具体的数据内容进⾏指定
    示例代码:
public class array {public static void main(String[] args) {int[] array1=new int[]{0,1,2,3,4,5,6};double[] array2=new double[]{1.0,2.0,3.0,4.0,5.0,6.0};String[] array3=new String[]{"hello"};int[] array4={1,2,3,4};}
}

【注意事项】:

  • 静态初始化虽然没有指定数组的⻓度,编译器在编译时会根据{}中元素个数来确定数组的⻓度。
  • 静态初始化时,{}中数据类型必须与[]前数据类型⼀致。
  • 静态初始化可以简写,省去后⾯的new T[]。

**
静态和动态初始化也可以分为两步,但是省略格式不可以。
示例代码如下:**

public class array {public static void main(String[] args) {int[] array1;array1=new int[4];int[] array2;array2=new int[]{1,2,3};//下面方式不可行int[] array3;array3={1,2,3};}
}

在这里插入图片描述
如果没有对数组进⾏初始化,数组中元素有其默认值:
在这里插入图片描述
如果数组中存储元素类型为引⽤类型,默认值为null
在这里插入图片描述

1.2 数组的基本使用

通过代码来演示数组的使用:

public class array {public static void main(String[] args) {String[] array1=new String[]{"hhh","aaa","zzz"};array1[2]="dzj";for (String str: array1) {System.out.println(str);}}
}

遍历数组:

public class array {public static void main(String[] args) {String[] array1=new String[]{"hhh","aaa","zzz"};array1[2]="dzj";//遍历方式一for (String str: array1) {System.out.println(str);}//遍历方式二for (int i = 0; i < array1.length; i++) {System.out.println(array1[i]);}}
}

二、数组是引用类型

2.1 初始JVM的内存分布


JVM也对所使用的内存按照功能的不同进行了划分
在这里插入图片描述

JVM内存划分(按功能分区)

  1. 程序计数器(PC Register)

    • 占用极小的内存空间
    • 核心功能:保存下一条要执行的指令地址
    • 线程私有,每个线程独立存储
  2. 虚拟机栈(JVM Stack)

    • 存储方法调用相关的运行时数据
    • 方法执行机制:
      • 每个方法执行时创建对应的栈帧
      • 栈帧包含五部分:
      • 局部变量表(方法参数和局部变量)
      • 操作数栈(执行引擎的工作区)
      • 动态链接(指向运行时常量池的方法引用)
      • 返回地址(方法结束后的返回位置)
      • 附加信息(如调试数据)
    • 生命周期:
      • 方法开始执行 → 栈帧入栈
      • 方法执行结束 → 栈帧出栈销毁
  3. 本地方法栈(Native Method Stack)

    • Native方法(本地方法) 提供服务
    • 功能与虚拟机栈类似
    • 特殊说明:在HotSpot等JVM实现中与虚拟机栈合并
  4. 堆(Heap)

    • JVM管理的最主要内存区域(占比最大)
    • 存储特性:
      • 所有new创建的对象都在堆上分配(包括数组对象)
      new int[]{1, 2, 3} // 堆内存分配
      
      • 对象存储要求:
      • 被引用对象不会被销毁
      • 未被引用对象由GC回收
    • 生命周期管理:
      • JVM启动时创建
      • 程序运行期间动态调整大小
      • JVM退出时销毁
  5. 方法区(Method Area)

    • 核心存储内容:
      已被加载的类元数据(类名/字段/方法/父类/接口等)
      运行时常量池(字符串常量等)
      静态变量(static修饰的类变量)
      即时编译器编译后的代码(JIT优化产物)
    • 特殊说明:字节码指令(编译后的方法代码)存储在此区域

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

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
⽽引⽤数据类型创建的变量,⼀般称为对象的引⽤,其空间中存储的是对象所在空间的地址。

在这里插入图片描述

在这里插入图片描述

注意:java中是不能获取到变量的地址的,也就是说java中并没有指针的概念

2.3 再谈引用变量

public class array {public static void main(String[] args) {int[] array2 = new int[]{1,2,3,4};int[] array1=array2;array1[0]=100;array1[1]=200;array1[2]=300;array1[3]=400;for (int i = 0; i < array2.length; i++) {System.out.println(array2[i]);}}
}

注意:这里的array1=array2是地址赋值,所以改变array1中的数组值所以array2中的内容也会发生改变,两个引用变量此时指向了同一块内存空间

2.4 认识null

null 在Java中表⽰"空引⽤",也就是⼀个不指向对象的引用

int[] arr = null;System.out.println(arr[0]);// 执⾏结果Exception in thread "main" java.lang.NullPointerExceptionat Test.main(Test.java:6)

在这里插入图片描述
null 的作⽤类似于C语⾔中的NULL(空指针),都是表⽰⼀个无效的内存位置.因此不能对这个内存进⾏任何读写操作.⼀旦尝试读写,就会抛出NullPointerException.

JAVA中并没有规定null是零地址

三、数组作为函数的参数和返回值

参数传数组类型(引用数据类型)

public class array {public static void main(String[] args) {int[] arr={1,2,3,4,5,6};fix(arr);for (int x:arr) {System.out.println(x);}}public static void fix(int[] arr){for (int i = 0; i < arr.length; i++) {arr[i]=i*100;}}
}

总结:所谓的"引用"本质上只是存了⼀个地址.Java将数组设定成引用类型,这样的话后续进行数组参数传参,其实只是将数组的地址传入到函数形参中.这样可以避免对整个数组的拷贝(数组可能⽐较长,那么拷贝开销就会很大).

数组作为函数的返回值
比如:获取斐波那契数列的前N项

public class array {public static void main(String[] args) {int[] array=fib(20);assert array != null;for (int x:array) {System.out.println(x);}}public static int[] fib(int n){if(n<=0){return null;}int[] array=new int[n];array[0]=array[1]=1;for (int i = 2; i <array.length ; i++) {array[i]=array[i-1]+array[i-2];}return array;}
}

在这里插入图片描述

四、数组的应用场景

4.1 数组转字符串

import java.util.Arrays;
import java.util.Scanner;public class array {public static void main(String[] args) {int[] array={1,2,3,4,5,6};String ret=Arrays.toString(array);System.out.println(ret);}public static void main1(String[] args) {Scanner scanner=new Scanner(System.in);int[] array = {2,6,4,1};System.out.println(sequence(array));}public static boolean sequence(int[] array) {boolean flag = true;int count=0;for (int i = 0; i <array.length-3 ; i++) {if(array[i]%2!=0){count++;if(count==3){return true;}}else{count=0;}}return false;}
}

在这里插入图片描述

4.2 数组的拷贝

    public static void main(String[] args) {int[] array={1,2,3,4,5,6};int[] array1=Arrays.copyOf(array,array.length);//扩容操作int[] array2=Arrays.copyOf(array,array.length*2);int[] array3=Arrays.copyOfRange(array,2,5);String ret1=Arrays.toString(array1);System.out.println(ret1);String ret2=Arrays.toString(array2);System.out.println(ret2);String ret3=Arrays.toString(array3);System.out.println(ret3);}

在这里插入图片描述

注意:数组当中存储的是基本类型数据时,不论怎么拷⻉基本都不会出现什么问题,但如果存储的是引⽤数据类型,拷⻉时需要考虑深浅拷⻉的问题,

源码部分展示:
在这里插入图片描述

4.3 深拷贝和浅拷贝问题

深拷贝和浅拷贝通常只出现在引用数据类型的范畴之上,基本数据类型不存在深拷贝和浅拷贝问题!!

当拷贝内容为引用数据类型的时候,浅拷贝指的是拷贝数组的内容仅仅是拷贝变量的值,而没有存储对象本身所存储的内容,而深拷贝恰恰相反。
在这里插入图片描述

图片左边是浅拷贝,右边是深拷贝

4.3 冒泡排序的小优化

    public static void main(String[] args) {int[] array={4,6,3,2,1,7,8,11,23,22,42,21};bubbleSort(array);for (int x: array) {System.out.print(x+" ");}}public static void bubbleSort(int[] array){for(int i=0;i<array.length-1;i++){boolean flg=false;for (int j = 0; j < array.length-1-i; j++) {if(array[j]>array[j+1]){int tmp=array[j];array[j]=array[j+1];array[j+1]=tmp;flg=true;}}if(!flg){return;}}}

在这里插入图片描述

冒泡排序本身时间复杂度比较高,使用java内置的sort函数即可:

public static void main(String[] args) {int[] array={4,6,3,2,1,7,8,11,23,22,42,21};Arrays.sort(array);for (int x: array) {System.out.print(x+" ");}}

在这里插入图片描述

4.4 数组逆序

    public static void main(String[] args) {int[] array={1,2,3,4,5,6};reverse(array);for (int x: array) {System.out.print(x+" ");}}public static void reverse(int[] array){int left=0;int right=array.length-1;while(left<right){int tmp=array[left];array[left]=array[right];array[right]=tmp;left++;right--;}}

在这里插入图片描述

4.5 数组逆序

调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。
如数组:[1,2,3,4,5,6]
调整后可能是:[1, 5, 3, 4, 2, 6]

public static void main(String[] args) {int[] array={1,2,3,4,5,6};change(array);for (int x: array) {System.out.print(x+" ");}}public static void change(int[] array){int left=0;int right=array.length-1;while(left<right){while(left<right&&array[left]%2!=0){left++;}while(left<right&&array[right]%2==0){right--;}int tmp=array[left];array[left]=array[right];array[right]=tmp;}}

4.6 数组练习

在这里插入图片描述
异或的特点是:

1、n ^ n = 0;即两个相同的数字异或是0

2、0 ^ n = n;即0和任何数字进行异或,结果就是那个任何数字。

public static void main(String[] args) {int[] array={4,1,2,1,2};int num=getNum(array);System.out.println(num);}public static int getNum(int[] array){int ret=0;for (int i = 0; i < array.length; i++) {ret^=array[i];}return ret;}public static void main6(String[] args) {int[] array={1,2,3,4,5,6};change(array);for (int x: array) {System.out.print(x+" ");}}

在这里插入图片描述

五、二维数组

5.1 普通二维数组

基本语法:

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

注意:二维数组行不可以省略,但是列可以省略

public static void main(String[] args) {int[][] array = new int[3][];}

代码示例:

public static void main(String[] args) {int[][] array = {{1,2,3},{4,5,6},{7,8,9}};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();}}

在这里插入图片描述

5.2 不规则的二维数组

不规则的⼆维数组指的是,⼆维数组的列在定义的时候,没有确定。

int[][] array = new int[3][];
public static void main(String[] args) {int[][] array = new int[2][];array[0]=new int[3];array[1]=new int[5];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();}}

在这里插入图片描述
在这里插入图片描述

总结

作为Java编程的​​基础支柱​​,数组的价值远超出其简单的语法形式。它不仅提供了数据的高效组织方式,更通过多维数组支持复杂数据建模,借助Arrays工具类实现强大操作能力。尽管集合框架在现代开发中日益普及,但在性能敏感的底层系统、算法实现以及内存优化场景中,数组仍展现着不可替代的优势。真正掌握数组的内存机制、遍历技巧与异常处理,将使您的代码在严谨性和效率上实现质的飞跃——这正是构建健壮程序的关键一步。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python图像处理与计算机视觉:OpenCV实战指南

引言 在当今数字化时代&#xff0c;图像处理和计算机视觉技术已经渗透到我们生活的方方面面&#xff0c;从智能手机的人脸识别解锁&#xff0c;到自动驾驶汽车的路况感知&#xff0c;再到医疗影像辅助诊断系统。作为这一领域最流行的开源库之一&#xff0c;OpenCV (Open Sourc…

OCCT基础类库介绍:Modeling Algorithm - Features

Features 特征 This library contained in BRepFeat package is necessary for creation and manipulation of form and mechanical features that go beyond the classical boundary representation of shapes. In that sense, BRepFeat is an extension of BRepBuilderAPI …

【前端AI实践】DeepSeek:开源大模型的使用让开发过程不再抓头发

有时候你可能正对着屏幕发呆&#xff0c;不知道怎么下手一个 Vue 的流式请求功能。这时候&#xff0c;DeepSeek 就像是你的“编程外挂”&#xff0c;帮你把模糊的需求变成清晰的代码。 下面我们就以几个常见的开发场景为例&#xff0c;看看 DeepSeek 能帮我们做点啥。 解答技…

SAP S/4HANA 的“Smart Core”:在现实与理想之间实现敏捷扩展

摘要&#xff1a; 在 SAP S/4HANA 的实施过程中&#xff0c;“Clean Core”&#xff08;干净核心&#xff09;已成为热门话题&#xff0c;指的是通过简化和优化系统架构&#xff0c;减少技术债务、提升性能并增强可升级性。尽管这是 SAP 推动云转型的核心理念之一&#xff0c;…

Python 量化金融与算法交易实战指南

https://www.python.org/static/community_logos/python-logo-master-v3-TM.png 金融数据获取与处理 使用yfinance获取市场数据 python 复制 下载 import yfinance as yf import pandas as pd# 下载苹果公司股票数据 aapl yf.Ticker("AAPL") hist aapl.histo…

【StarRocks系列】join查询优化

目录 Join 类型 和 Join 策略 1. Join 类型&#xff08;Join Type&#xff09; 2. Join 策略&#xff08;Join Strategy&#xff09; 分布式 Join 策略 (核心) 1. Colocate Join (本地 Join - 最优): 2. Bucket Shuffle Join: 3. Broadcast Join (复制广播): 4. Shuffl…

【论文解读】ZeroSearch: 零API成本激活大模型Web搜索

1st author: Hao Sun 孙浩 - PhD Candidate Peking University - Homepage paper: [2505.04588] ZeroSearch: Incentivize the Search Capability of LLMs without Searching code: Alibaba-NLP/ZeroSearch: ZeroSearch: Incentivize the Search Capability of LLMs without…

JAVA网络编程中HTTP客户端(HttpURLConnection、Apache HttpClient)

HTTP 客户端是 Java 中实现网络请求的核心工具,主要用于与 Web 服务器交互(如获取网页、提交表单、调用 REST API 等)。Java 生态中有两种主流的 HTTP 客户端实现:​​HttpURLConnection(JDK 原生)​​ 和 ​​Apache HttpClient(第三方库)​​。以下是两者的详细解析、…

C# Process.Start多个参数传递及各个参数之间的空格处理

最近做一个软件集成的事情&#xff0c;有多个之前做的软件&#xff0c;集成到一起自己用&#xff0c;使用了 Process.Start&#xff08;“*.exe”&#xff09;的方式&#xff0c;然而遇到了传递参数的问题。 这里汇总后的程序叫main.exe&#xff0c;要汇总的软件之一是pro1.…

【Python】Excel表格操作:ISBN转条形码

一、效果 原始文件&#xff1a; 输出文件&#xff1a; 二、代码 import os import logging from openpyxl import load_workbook from openpyxl.drawing.image import Image as ExcelImage from barcode import EAN13 from barcode.writer import ImageWriterlogging.basicCo…

【Fargo】mediasoup发送2:码率分配、传输基类设计及WebRtcTransport原理

Fargo 使用了mediasoup的代码,搬运了他的架构架构精妙,但是似乎是为了sfu而生,【Fargo】mediasoup发送1:控制与数据分离的分层设计和原理我本地用来发送测试,因此需要进一步梳理: 通过分析这段代码,我来详细解释: 一、sfu 需要码率级别的分配控制 1. DistributeAvail…

矩阵置零C++

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 思路&#xff1a; 1、让首行首列记录哪一行哪一列有0 2、于是可以直接遍历非首行首列的元素&#xff0c;若该元素对应的首行首列为0&#xff0c;说明…

大内存对电脑性能有哪些提升

在科技飞速发展的今天&#xff0c;电脑已经成为我们生活和工作中不可或缺的伙伴。无论是日常办公、追剧娱乐&#xff0c;还是进行复杂的游戏和专业设计&#xff0c;电脑的性能都至关重要。而在影响电脑性能的众多因素中&#xff0c;内存大小常常被人们忽视。 多任务处理更流畅…

【StarRocks系列】Update语句

目录 简要流程 详细流程 1. UPDATE 语句执行流程 2. 如何更新表的数据 3. 是否支持事务 总结关键点 简要流程 前端处理&#xff08;FE&#xff09;&#xff1a; 解析 SQL 并验证主键条件生成包含主键列表和新值的更新计划按主键哈希分发到对应 BE 后端执行&#xff08…

计算机三级Linux应用与开发

第 1 章 计算机体系结构与操作系统 1.1 计算科学与计算机系统 冯诺依曼体系的结构要点&#xff1a; 计算机数制采用二进制&#xff0c;程序指令和数据统一存储&#xff0c;计算机应按照程序顺序执行。按照冯诺依曼结构设计的计算机由 控制器&#xff0c;运算器&#xff0c;存…

Web攻防-XSS跨站Cookie盗取数据包提交网络钓鱼BEEF项目XSS平台危害利用

知识点&#xff1a; 1、Web攻防-XSS跨站-手工代码&框架工具&在线平台 2、Web攻防-XSS跨站-Cookie盗取&数据提交&网络钓鱼 演示案例-WEB攻防-XSS跨站-Cookie盗取&数据提交&网络钓鱼&Beef工具 1、XSS跨站-攻击利用-凭据盗取 条件&#xff1a;无防…

自力更生式养老VS三大新型养老:在时代裂变中重构银发生存法则

在岁月长河中&#xff0c;父母曾为子女遮风挡雨&#xff0c;当他们步入暮年&#xff0c;养老问题成为家庭与社会共同关注的焦点。 “父母的养老终究是自力更生”&#xff0c;这句话道出了养老的本质内核。 然而&#xff0c;在自力更生的基础上&#xff0c;选择合适的养老方式…

计算机网络学习笔记:Wireshark观察TCP通信

文章目录 前言一、前置准备二、三报文握手过程抓包2.1、第一次握手2.2、第二次握手2.3、第三次握手 三、通信过程抓包3.1、报文 44379 – 客户端发数据&#xff08;PSH, ACK&#xff09;3.2、 报文 44380 – 服务端确认收到数据&#xff08;ACK&#xff09;3.3、报文 44469 – …

在Linux中,Iptables能做什么?

概述 背景说明 在运维工作中&#xff0c;Iptables是一个不可或缺的工具&#xff0c;它提供了强大的网络流量控制和管理能力。 问题呈现 iptables是一个不可获取的工具&#xff0c;你对其了解多少&#xff1f;该工具你是否真的会用&#xff1f;详细功能对应的应用场景你是否…

Linux——linux的基本命令

目录 一、linux的目录结构 二、绝对路径和相对路径 三、文件类型&#xff08;linux下所有东西都可看作文件&#xff09; 四、文件的权限 五、文件权限的修改&#xff08;chmod&#xff09; 六、linux常用的命令 七、文件查看命令 八、文件编辑命令 九、文件压缩与解压…