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

Java的数组是啥?

1.数组是啥?

数组是一块连续的内存,用来存储相同类型的数据

(1)如何定义数组?

1.int[] array = {1,2,3,4} = new int[]{1,2,3,4};//这里的new是一个关键字,用来创建对象

2.数组就是一个对象

动态初始化

int[] array = new int[10];//这个数组没有初始化时,默认将数组初始化为0

静态初始化

 T[] 数组名称 = {data1, data2, data3, ..., datan};

还可以这样初始化

int[] array4;//局部变量
array4 = new int[10];

错误初始化

 

 可以改成这样:

int[] array5 = null;//存储类型是引用类型时,用null

各类型数组初始化

(2)数组的创建

T[] 数组名 = new T[N];//N是数组长度

(3)数组越界

 int[] array = {1,2,3,4}

 获取数组长度:

int len = array.length;
System.out.println(len);

(4)遍历数组

        //第一种遍历方式int[] array = {1,2,3,4};for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}System.out.println();
        //第二种:增强for循环:for-eachfor(int x: array){//在遍历这个数组的时候,把数组中的元素进行赋值给xSystem.out.print(x + " ");}System.out.println();

区别:for遍历数组有带下标,for-each没有


2.数组是引用类型

(1)JVM的内存分布

虚拟机栈 (JVM Stack): 与方法调用相关的一些信息, 每个方法在执行时,都会先创建一个栈帧 ,栈帧中包含有:局部变量表 操作数栈 动态链接 返回地址 以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了
(Heap) : JVM 所管理的最大内存区域 . 使用 new 创建的对象都是在堆上保存 ( 例如前面的 new int[]{1, 2, 3} ) 堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销

(2)数组-->引用

public static void func() {int a = 10;int b = 20;int[] arr = new int[]{1,2,3};//描述为arr这个引用指向了一个数组对象
}

 

用arr里面的地址去操作对象里面的值


尝试分析下面的代码

    public static void func() {int[] array1 = new int[3];array1[0] = 10;array1[1] = 20;array1[2] = 30;int[] array2 = new int[]{1,2,3,4,5};array2[0] = 100;array2[1] = 200;array1 = array2;array1[2] = 300;array1[3] = 400;array2[4] = 500;for (int i = 0; i < array2.length; i++) {System.out.println(array2[i]);}}

 

⚠array1和array2的值都是地址 

 array2的值把array1原来的值顶掉了,array1从原来的0x89变成0x99

所以,通过array1这个引用,可以修改array2这个引用所指向的对象


(3)null 

array = null 表示当前引用不指向任何对象,所以谈长度是没道理的


⚠Java里面null和0号地址没有任何关联

⚠一个引用不能同时指向多个对象(跟变量一样,只能一一对应存对象)

⚠对象不能指向对象,只有引用才能指向对象


3.数组的应用 

(1)作为函数参数

(改变引用的值?改变引用对象的值?)

public static void main(String[] args) {int[] array = {1,2,3,4};/*当我 分开调用func1和 func2func1();func2();array这个数组 里面的值 分别是多少?*///func1(array);func2(array);for (int x : array) {System.out.print(x+" ");}System.out.println();}public static void func1(int[] array) {array[0] = 99;}public static void func2(int[] array) {array = new int[]{11, 22, 33, 44, 55};}

运行结果

1.99 2 3 4

2.1 2 3 4

func1修改的是实参array下标为0的元素,打印出来就是99,2,3,4

 

而func2把形参从指向{1,2,3,4}改成指向{11,22,33,44,55},不影响实参,实参该是什么就是什么,所以是1,2,3,4 

(2)作为函数返回值

    public static void main(String[] args) {int[] ret = func3();for (int i = 0; i < ret.length; i++) {System.out.println(ret[i]);}}public static int[] func3(){int[] ret = new int[2];ret[0] = 99;ret[1] = 199;return ret;//作为返回值的形式进行传递}

4.数组练习

(1)数组转字符串

一个打印数组比较便捷的方式,比for循环快多了

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

 (2)数组排序

使用Array的包

Arrays.sort(array,0,3);//区间排序,在[0,3)这个区间里面从大到小排序

 我们自己做一个数组打印方法

    public static String myToString(int[] array){if (array == null){return "null";}if (array.length == 0){return "[]";}String ret = "[";for (int i = 0; i < array.length; i++) {ret += array[i];if (i != array.length-1){//最后一个不打印","ret+=", ";}}ret += "]";return ret;}

(3)不妨再做一个sort的方法(冒泡排序)

排序[8,12,5,7,9]

现在已经是有序状态,但是系统不一定知道已经是有序的,所以我们要给机器一个验证

i是趟数,j是交换的次数

    public static void bubbleSort(int[] array){if(array == null){return;}//i代表遍历趟数for (int i = 0; i < array.length-1; i++) {//每次比上一次少一个,优化:比较趟数boolean flg = false;//优化:比较结果//j代表元素下标,相当于C里面的指针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;}}}public static void main(String[] args) {int[] array = {8,12,5,7,9};System.out.println(myToString(array));bubbleSort(array);System.out.println(myToString(array));}

 

 (4)逆置数组排序

    public static void reverse(int[] array){if (array == null){return;}int i = 0;int j = array.length-1;while(i < j){int tmp = array[i];array[i] = array[j];array[j] = tmp;i++;j--;}}

5.数组拷贝

    public static void main(String[] args) {int[] array1 = {2, 4, 6, 3};int[] array2 = {2,4,6,3,10};System.out.println(Arrays.equals(array1, array2));//equals判断数组是否相同int[] array = new int[10];System.out.println(Arrays.toString(array));Arrays.fill(array, 9);Arrays.fill(array, 0, 3, 9);System.out.println(Arrays. toString(array));}
    public static void func(){// copyOf方法在进行数组拷贝时,创建了一个新的数组// arr和newArr引用的不是同一个数组arr[0] = 1;newArr = Arrays.copyOf(arr, arr.length);//扩容System.out.println(Arrays.toString(newArr));// 因为arr修改其引用数组中内容时,对newArr没有任何影响arr[0] = 10;System.out.println(Arrays.toString(arr));System.out.println(Arrays.toString(newArr));// 拷贝某个范围.int[] newArr2 = Arrays.copyOfRange(arr, 2, 4);System.out.println(Arrays.toString(newArr2));int[] copy = new int[array1.length];System.arraycopy(array1,0,copy,0,array1.length);}

arraycopy的底层代码

6.二维数组

如何创建二维数组?

        int[][] array = {{1,2,3},{4,5,6}};//System.out.println(array[1][2]);int[][] array2 = new int[][]{{1,2,3},{4,5,6}};int[][] array3 = new int[2][3];//定义二维数组行不能省略//int[][] array4 = new int[][3];这种是错误的//不规则二维数组int[][] array5 = new int[2][];

打印二维数组

我们常规以为的二维数组

所以就有下面的打印代码 

        for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {System.out.print(array[i][j] + " ");}System.out.println();}

而真正的二维数组是这样的

        int[][] array = {{1,2,3},{4,5,6}};System.out.println(array.length);System.out.println(array[1].length);System.out.println(array[2].length);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();}

 还有另外一种写法

        for (int[] tmp:array) {for (int x : tmp) {System.out.println(x + " ");}System.out.println();}

给这个二维数组规定每行有哪些数

 

 

相关文章:

Java的数组是啥?

1.数组是啥&#xff1f; 数组是一块连续的内存&#xff0c;用来存储相同类型的数据 &#xff08;1&#xff09;如何定义数组&#xff1f; 1.int[] array {1,2,3,4} new int[]{1,2,3,4};//这里的new是一个关键字&#xff0c;用来创建对象 2.数组就是一个对象 动态初始化 …...

我的私人笔记(安装hadoop)

1.安装hadoop01环境 注需安装最小安装和使用英文界面 2.安装群集 // 获得网关IP&#xff1a;192.168.80.2 获得子网掩码&#xff1a;255.255.255.0 // 获得网段&#xff1a;[起始IP地址]192.168.128 --- [结束IP地址]192.168.80.254 // 计划集群的ip和主机名 //192.168.80.…...

【板栗糖GIS】——360浏览器的下载图标隐藏在内部不方便,怎么修改

目录 1. 设置前的本来样子 2. 登录360的皮肤中心 3. 使用se13的经典皮肤 最近edge浏览器最近使用bilibili和notion都非常卡&#xff0c;时不时崩溃&#xff0c;不得不换浏览器使用&#xff0c;试来试去360浏览器最得我心&#xff0c;只不过广告太多&#xff0c;调教也是花了…...

SpringMVC之文件上传和下载

文章目录 前言一、文件下载二、文件上传总结 前言 实现下载文件和上传文件的功能。 一、文件下载 使用ResponseEntity实现下载文件的功能 RequestMapping("/testDown") public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOEx…...

简单了解OSI网络模型

目录 一、协议是什么&#xff1f; 二、OSI七层模型 三、TCP/IP五层模型 一、协议是什么&#xff1f; 协议顾名思义就是通过大家伙一起协商讨论达成的统一规则和标准。网络协议就是规定用户数据信息如何在网络上传播以及实现某种网络技术所要遵循的统一标准和规则。 二、OSI…...

服务网格实施周期缩短 50%,丽迅物流基于阿里云 ACK 和 ASM 的云原生应用管理实践

作者&#xff1a;王夕宁、 刘强、 华相 公司介绍 丽迅物流是百丽旗下专注于时尚产业、为企业提供专业物流及供应链解决方案的服务商。其产品服务主要包括城市落地配、仓配一体、干线运输及定制化解决方案。通过自研智能化物流管理平台&#xff0c;全面助力企业合作集约化发展…...

bpmnjs Properties-panel拓展(属性设置篇)

最近有思考工作流相关的事情&#xff0c;绘制bpmn图的工具认可度比较高的就是bpmn.js了&#xff0c;是一个基于node.js的流程图绘制框架。初始的框架只实现了基本的可视化&#xff0c;想在xml进行客制化操作的话需要拓展&#xff0c;简单记录下几个需求的实现过程。 修改基础 …...

Debian系统上通过NFS挂载远程服务器硬盘

步骤 1&#xff1a;配置远程服务器 在拥有硬盘内容的远程服务器上&#xff0c;进行以下配置&#xff1a; 安装NFS服务器软件&#xff1a; sudo apt-get update sudo apt-get install nfs-kernel-server编辑NFS服务器配置文件 /etc/exports&#xff0c;添加需要共享的目录及其权…...

【Linux】以太网协议以及MTU

以太网协议 数据链路层的功能以太网的数据格式MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对TCP协议的影响 数据链路层的功能 数据链路层的主要功能是&#xff1a;控制链路。包括数据链路的建立、链路的维护和释放。MAC寻址也是它的功能&#xff0c;寻址是指计算机网卡的MAC地…...

UE5打完包后,启动程序不能全屏

最近看到ue5的打包程序后不能默认自动全屏&#xff0c;效果如下&#xff0c;发现并不是全屏的&#xff0c;而且就算点击放大也不是全屏 解决办法&#xff1a;设置如下之后在打包就可以了 但是会一直打印错误的日志&#xff0c;不过这个不影响使用...

财务部发布《企业数据资源相关会计处理暂行规定》

导读 财务部为规范企业数据资源相关会计处理&#xff0c;强化相关会计信息披露&#xff0c;根据《中华人民共和国会计法》和相关企业会计准则&#xff0c;制定了《企业数据资源相关会计处理暂行规定》。 加gzh“大数据食铁兽”&#xff0c;回复“20230828”获取材料完整版 来…...

引用(个人学习笔记黑马学习)

1、引用的基本语法 #include <iostream> using namespace std;int main() {int a 10;//创建引用int& b a;cout << "a " << a << endl;cout << "b " << b << endl;b 100;cout << "a "…...

卷积神经网络实现运动鞋识别 - P5

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;Pytorch实战 | 第P5周&#xff1a;运动鞋识别&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 目录…...

C#安装“Windows 窗体应用(.NET Framework)”

目录 背景: 第一步: 第二步: 第三步&#xff1a; 总结: 背景: 如下图所示:在Visual Studio Installer创建新项目的时候&#xff0c;想要添加windows窗体应用程序&#xff0c;发现里面并没有找到Windows窗体应用(.NET Framework)模板&#xff0c;快捷搜索也没有发现&#…...

SQL高阶语句

目录 1、概念 1.1、概述 1.2、常见的MySQL高阶语句的概念&#xff1a; 1.3、 SQL高阶语句的作用 2、常用查询 2.1、按关键字排序 2.1.1、概述和作用 2.1.2、 &#xff08;1&#xff09;语法 2.1.3、模板表&#xff1a;ky30 ​编辑2.1.4、分数按降序排列 2.1.5、ORDER…...

【交换机】如何通过Web方式登陆交换机

一、华为交换机web登陆配置 Web网管是一种对交换机的管理方式&#xff0c;它利用交换机内置的Web服务器&#xff0c;为用户提供图形化的操作界面。用户可以从终端通过HTTPS登录到Web网管&#xff0c;对交换机进行管理和维护&#xff0c;同时也非常方便。 一、配置思路&#xff…...

Flink CDC学习笔记

第一章 CDC简介 1.1 什么是CDC ​ CDC (Change Data Capture 变更数据获取&#xff09;的简称。核心思想就是&#xff0c;检测并获取数据库的变动&#xff08;增删查改&#xff09;&#xff0c;将这些变更按发生的顺序记录下来&#xff0c;写入到消息中间件以供其它服务进行订…...

NEOVIM学习笔记

GitHub - blogercn/nvim-config: A pretty epic NeoVim setup 一直使用vim&#xff0c;每次到了新公司都要配置半天&#xff0c;而且常常配置失败&#xff0c;很多插件过期不好用。偶然看到别人的NEO VIM&#xff0c;就试着用了一下&#xff0c;感觉还不错。 用来开发和阅读C代…...

Docker三剑客之docker-compose

docker-compose 是 Docker 生态系统中的一个重要成员&#xff0c;它允许开发人员使用一个简单的配置文件来定义和运行多个 Docker 容器。通过 docker-compose&#xff0c;你可以定义应用程序的各个组件、容器之间的依赖关系以及网络配置&#xff0c;从而实现在一个命令中启动、…...

单调队列

目录 一&#xff0c;单调队列 二&#xff0c;模板实现 三&#xff0c;OJ实战 剑指 Offer 59 - I. 滑动窗口的最大值 一&#xff0c;单调队列 单调队列是双端队列的拓展&#xff0c;支持尾部插入&#xff0c;双端删除&#xff0c;其中的数据始终维持单调性&#xff0c;从而…...

影刀RPA跨境店群运营架构:TikTok Shop多节点高并发调度与Python环境隔离实战

大家好&#xff0c;我是林焱。 太有意思了&#xff0c;刚刷朋友圈&#xff0c;看到一个在跨境圈子里被疯狂转发的消息。 有几个当年和我一样&#xff0c;在南充念工程测量技术出身的 00 后学弟&#xff0c;最近跑回母校干了件特别硬核的事。 他们没有像传统的成功校友那样&a…...

3个核心功能:用HSTracker将炉石传说数据转化为你的制胜优势

3个核心功能&#xff1a;用HSTracker将炉石传说数据转化为你的制胜优势 【免费下载链接】HSTracker A deck tracker and deck manager for Hearthstone on macOS 项目地址: https://gitcode.com/gh_mirrors/hs/HSTracker 在炉石传说的竞技场上&#xff0c;每一张卡牌的抽…...

如何用嘎嘎降AI处理汉语言文学论文:文学类毕业论文降AI免费完整操作教程

如何用嘎嘎降AI处理汉语言文学论文&#xff1a;文学类毕业论文降AI免费完整操作教程 帮同学处理过汉语言文学论文降AI教程&#xff0c;流程基本是固定的&#xff0c;记录下来供参考。 主推工具&#xff1a;嘎嘎降AI&#xff08;www.aigcleaner.com&#xff09;&#xff0c;4.…...

ODT怎么转PDF?2026年实测5种转换方法与在线工具对比

ODT&#xff08;OpenDocument Text&#xff09;是开源办公软件默认的文档格式&#xff0c;但在实际工作和分享中&#xff0c;PDF的通用性和防篡改特性让它成为更优选择。很多人拿到ODT文件后都会面临同一个问题&#xff1a;怎样才能快速转成PDF&#xff1f;本文将从多个角度展示…...

教育机构搭建ai编程辅导平台时如何通过taotoken管理多学生密钥

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 教育机构搭建AI编程辅导平台时如何通过Taotoken管理多学生密钥 在AI编程辅导平台的构建中&#xff0c;教育机构常常面临一个核心的…...

如何为Hermes Agent配置Taotoken作为自定义模型供应商并写入环境变量

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 如何为Hermes Agent配置Taotoken作为自定义模型供应商并写入环境变量 基础教程类&#xff0c;详细说明在Hermes Agent中配置Taotok…...

3大功能让Mac永不停歇:自动鼠标移动器的终极指南

3大功能让Mac永不停歇&#xff1a;自动鼠标移动器的终极指南 【免费下载链接】automatic-mouse-mover a minimalistic go library/app to keep your mac active and alive 项目地址: https://gitcode.com/gh_mirrors/au/automatic-mouse-mover 你是否曾在重要视频会议中…...

Python大麦抢票神器:告别手速焦虑,智能自动化抢票方案

Python大麦抢票神器&#xff1a;告别手速焦虑&#xff0c;智能自动化抢票方案 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为抢不到心仪的演唱会门票而烦恼吗&#xff1f;面对热门演出秒光…...

用MATLAB和Python搞定二维热传导仿真:从ADI算法到FFT快速求解器的保姆级对比

MATLAB与Python热传导仿真实战&#xff1a;从算法选择到性能调优 在工程仿真领域&#xff0c;热传导问题一直是个经典课题。无论是电子设备散热分析、建筑热工设计还是材料加工模拟&#xff0c;二维热传导方程的求解都是基础中的基础。对于需要在不同编程环境中实现这类仿真的工…...

深入解析Godot PCK解包技术:从二进制黑盒到可编辑资源的完整指南

深入解析Godot PCK解包技术&#xff1a;从二进制黑盒到可编辑资源的完整指南 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 还在为Godot引擎生成的PCK文件无法访问而烦恼吗&#xff1f;想要深入分析…...