【Java】数组中值得说的那些事

news2024/12/28 18:45:47

文章目录

  • 前言
  • 一、数组的创建及初始化
    • 🌳1、数组的创建
    • 🌳2、数组的初始化
      • 🍑(1)动态初始化
      • 🍑(2)静态初始化
  • 二、数组的使用
    • 🌳1、数组中元素访问
    • 🌳2、遍历数组
      • 🍑(1)使用for循环
      • 🍑(2)使用for-each遍历
  • 三、数组与引用类型
    • 🌳1、初识JVM内存分布
    • 🌳2、基本类型变量与引用类型变量
    • 🌳3、认识null
  • 四、二维数组
    • 🌳1、二维数组的创建和初始化
    • 🌳2、不规则二维数组
    • 🌳3、二维数组的遍历
      • 🍑(1)for循环遍历
      • 🍑(2)使用for-each遍历
  • 五、常用的数组方法
    • 🌳1、toString()
    • 🌳2、copyOf()
    • 🌳3、copyOfRange()
    • 🌳4、fill()
    • 🌳5、equals()
    • 🌳6、sort()
    • 🌳7、binarySearch()
    • 🌳8、deepToString()
  • 总结


前言

如果你学过C语言,谈到数组,想必你一定对此非常熟悉了,那么在Java阶段还有介绍的必要吗?当然有了,不然我还写这篇博客干嘛对吧😁其实对于Java中的数组还是有一些值得说一说的东西的,下面我就撇开大家熟悉的概念,总结一下Java数组中值得说一说的那些事!

------------------ (正文开始)------------------


一、数组的创建及初始化

🌳1、数组的创建

Java数组语法格式:

在这里插入图片描述

数组的创建举例:

int[] array1 = new int[10]; // 创建一个可以容纳10个int类型元素的数组
double[] array2 = new double[5]; // 创建一个可以容纳5个double类型元素的数组
String[] array3 = new double[3]; // 创建一个可以容纳3个字符串元素的数组

🌳2、数组的初始化

🍑(1)动态初始化

在创建数组时,直接指定数组中元素的个数
语法格式:T[] 数组名 = new T[整形];

int[] array1 = new int[10];//10个int类型元素的数组
boolean[] array2 = new boolean[3];//3个boolean类型元素的数组

对于动态初始化的方式,指定数组的大小后,数组中元素有其默认值:

类型默认值
byte0
short0
int0
long0
float0.0f
double0.0
char/u0000
booleanfalse

说明:'/u0000'是一个Unicode码的字符。‘/u0000’ 是一个空的字符,它与null和""不同,是特殊的“空”,是不可打印的。
注: 如果数组中存储元素类型为引用类型,默认值为null

🍑(2)静态初始化

在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定
语法格式: T[] 数组名称 = {data1, data2, data3, ..., datan};

int[] array1 = new int[]{0,1,2,3,4,5,6,7,8,9};
double[] array2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 = new String[]{"Hello", "Java", "!!!"};

省略格式:

int[] array1 ={0,1,2,3,4,5,6,7,8,9};
double[] array2 ={1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 ={"Hello", "Java", "!!!"};

注意:

  1. 静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
  2. 静态初始化时, {}中数据类型必须与[]前数据类型一致。
  3. 静态初始化可以简写,省去后面的new T[]。(只是表面上省略了,在编译阶段还是会还原new T[])

注: 静态和动态初始化也可以分为两步,但是省略格式不可以,省略格式只能一步到位。

int[] array1;
array1 = new int[10];

int[] array2;
array2 = new int[]{10, 20, 30};

//省略格式:
int[] array3={1,2,3};
// 注意省略格式不可以拆分, 否则编译失败
// int[] array3;
// array3 = {1, 2, 3};

二、数组的使用

🌳1、数组中元素访问

和C语言一样,数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素。

public static void main(String[] args) {
    int[]array = new int[]{10, 20, 30};
    //通过下标访问
    System.out.print(array[0]+" ");
    System.out.print(array[1]+" ");
    System.out.println(array[2]);
    // 也可以通过[]对数组中的元素进行修改
    array[0] = 100;
    System.out.println(array[0]);
}

注意:

  1. 数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素
  2. 下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常。

🌳2、遍历数组

🍑(1)使用for循环

注意:在数组中可以通过 数组对象.length 来获取数组的长度

public static void main(String[] args) {
    int[]array = new int[]{10, 20, 30, 40, 50};
    for(int i = 0; i < array.length; i++){
        System.out.print(array[i]+" ");
    }
}

🍑(2)使用for-each遍历

for-eachfor 循环的另外一种使用方式. 能够更方便的完成对数组的遍历. 可以避免循环条件和更新语句写错。

public static void main(String[] args) {
    int[] array = {1, 2, 3,4,5,6,7};
    for (int x : array) {
        System.out.print(x+" ");
    }
}


三、数组与引用类型

🌳1、初识JVM内存分布

想要了解引用类型,我们首先了解一下内存的分配。为了便于内存的管理,JVM也对所使用的内存按照功能的不同进行了划分:


现在我们只需简单关心堆和虚拟机栈这两块空间,简单了解一下方法区,后序还会对JVM有更详细介绍。

🌳2、基本类型变量与引用类型变量

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

数组是引用类型

📝例1:基本类型变量与引用类型变量的内存分布

public static void main(String[] args) {
    int a=10;
    int[] array=new int[]{1,2,3};
}

上面代码中 aarray,都是函数内部的变量,因此其空间都在main方法对应的栈帧中分配。a内置类型的变量,因此其空间中保存的就是给该变量初始化的值。array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。

注: 引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象。

📝例2:引用指向对象而不指向引用

public static void main(String[] args) {
    int[] array1=new int[]{1,2,3};
    int[] array2=new int[]{100,200,300,400};

    array1=array2;//表示array1这个引用指向array2这个引用指向的对象
    array1[1]=99;
}

总结:

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

🌳3、认识null

null 在 Java 中表示 “空引用” , 也就是一个不指向对象的引用,它的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置。因此不能对这个内存进行任何读写操作。一旦尝试读写, 就会抛出NullPointerException


四、二维数组

🌳1、二维数组的创建和初始化

//静态初始化
int[][] array1=new int[][]{{1,2,3},{4,5,6}};
int[][] array2={{1,2,3},{4,5,6}};//省略形式
//int[][] array={1,2,3,4,5,6,7};这种方式是错误的
//动态初始化
int[][] array3=new int[2][3];

🌳2、不规则二维数组

在Java中我们可以由此创建出不规则的二维数组:
方式1:

//在Java中行不能省略,列能省略
public static void main16(String[] args) {
    //不指定列时,默认为null
    int[][] array=new int[2][];
    System.out.println(array[0]);
    System.out.println(array[1]);
    
    //这里充分体现了Java中二维数组是特殊的一维数组
    array[0]=new int[]{1,2,3};
    array[1]=new int[]{4,5,6,7};
}

方式2:

int[][] array={{1,2,3},{4,5,6,7}};

注:Java中充分体现了二维数组是特殊的一维数组。 如图:

🌳3、二维数组的遍历

🍑(1)for循环遍历

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

  1. array,length相当于二维数组的行号。
  2. array[i].length相当于每一行的列号。

🍑(2)使用for-each遍历

public static void main(String[] args) {
    for (int[] ret : array) {
        for (int x : ret) {
            System.out.print(x+" ");
        }
    	System.out.println();//换行
    }
}

在二维数组中还有一些其他的用法,不过和一维数组并没有明显差别, 同理, 还存在 “三维数组”, “四维数组” 等更复杂的数组, 只不过出现频率都很低,因此这里就不再赘述了。


五、常用的数组方法

在java.util包为我们提供了一个Arrays类,导入包后(import java.util.Arrays;)我们就可以直接使用Arrays提供的一些方法,下面我就为大家介绍一下Arrays类下常用的方法:

🌳1、toString()

作用:以字符串打印一维数组
语法格式:toString(数组名);

🌳2、copyOf()

作用:数组拷贝,扩容
语法格式:copyOf(数组名,新数组长度);

在这里插入图片描述

🌳3、copyOfRange()

作用:范围拷贝,起始下标与终止下标遵循左闭右开[起始下标 , 终止下标)
语法格式:copyOfRange(数组名 , 起始下标 , 终止下标);

🌳4、fill()

作用:数组填充
语法格式
fill(数组名,填充值);
fill(数组名,起始下标 , 终止下标,填充值);

🌳5、equals()

作用:判断数组对应元素是否相同,相同返回true,否则返回false
语法格式:equals(数组名1,数组名2);

🌳6、sort()

作用:升序排序数组
语法格式:sort(数组名);

🌳7、binarySearch()

作用:二分查找(前提数组有序),找到返回下标,找不到返回负数
语法格式:binarySearch(数组名,查找值);

🌳8、deepToString()

作用:以字符串打印二维数组
语法格式:deepToString(二维数组名);


总结

本篇全部内容到这里就全部结束了,简单回顾一下,本篇着重介绍了Java中数组的创建及使用,初步了解了引用类型,最后盘点了数组中常用的一些方法。相信通读全文,你一定有所收获!

------------------ (下期见!)------------------

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣LeatCode算法题-两数之和(二)

力扣算法题第二题&#xff0c;两数相加算法题&#xff1a; 要求&#xff1a; //给出两个 非空 的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照 逆序 的方式存储的&#xff0c;并且它们的每个节点只能存储 一位 数字。 //如果&#xff0c;我们将这两个数…

企业使用有线和5G主备双链路上网配置案例

场景介绍 典型的企业分支通常还是采用有线链路作为主链路&#xff0c;例如以太链路、MPLS专线等。为了提升分支站点的可靠性&#xff0c;企业一般都会部署两条上行链路&#xff0c;一条为主链路&#xff0c;一条为备链路。如果两条上行链路都采用有线&#xff0c;成本会比较高&…

JVM StringTable

文章目录学习资料StringTableString的基本特性String的内存分配StringTable为什么要调整&#xff1f;String的基本操作字符串拼接操作拼接操作与append操作的效率对比intern()的使用学习资料 【尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟机&#xff09;】 【阿里巴巴Ja…

prometheus exporter 监控主机

前提要求部署Grafana 前言 有许多库和服务器可以帮助将第三方系统中的现有指标导出为Prometheus指标。在无法直接使用Prometheus度量(例如&#xff0c;HAProxy或Linux系统统计数据)对给定系统进行检测的情况下&#xff0c;这是非常有用的。 node-exporter Linux操作系统采集&…

【Hack The Box】windows练习-- Scrambled

HTB 学习笔记 【Hack The Box】windows练习-- Scrambled &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &…

第2-3-5章 删除附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

文章目录5.4 接口开发-根据id删除附件5.4.1 接口文档5.4.2 代码实现5.4.3 接口测试5.4.4 测试ALI和FAST_DFS以及MINIO上传和删除的接口5.4.4.1 阿里云OSS上传和删除5.4.4.2 FastDFS上传和删除5.4.4.3 Minio上传和删除5.5 接口开发-根据业务类型/业务id删除附件5.5.1 接口文档5.…

[附源码]SSM计算机毕业设计成都团结石材城商家协作系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

力扣(LeetCode)6. Z 字形变换(C++)

数学构造 ZZZ 字形变换类似情报加密。找规律解密&#xff0c;就能得到构造的方法。 第 000 行相邻的数&#xff0c;取 n4n4n4 如上图&#xff0c;观察第 000 行和第 333 行 相邻的数&#xff0c;组成等差数列&#xff0c;公差 d62n−2d62n-2d62n−2 2n−22n-22n−2 是说 &…

【小程序】微信小程序云开发笔记详细教程(建议收藏)

1- 前言 1.1 微信云开发是什么&#xff1f; 微信云开发是微信团队联合腾讯云推出的专业的小程序开发服务。 开发者可以使用云开发快速开发小程序、小游戏、公众号网页等&#xff0c;并且原生打通微信开放能力。 开发者无需搭建服务器&#xff0c;可免鉴权直接使用平台提供的…

Spring Cloud | 实现Eureka Server 高可用服务注册中心全套解决方案

目录1、在搭建Eureka Server&#xff0c;配置高可用服务注册中心&#xff0c;配置3个Eureka Server:2、因为是在本地实现的话&#xff0c;需要在localhost加入三个服务&#xff0c;需要改变etc/hosts&#xff0c;linux系统通过vim /etc/hosts&#xff0c;3、如果是在测试或者是…

最优孤岛划分下含分布式电源配电网可靠性评估附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

小学生python游戏编程arcade----坦克大战(1)

小学生python游戏编程arcade----坦克大战&#xff08;1&#xff09;前言坦克类&#xff0c;地图&#xff0c;角色的控制&#xff0c;声音等前期学习的汇总1、坦克类2、title地图加载2.1设置&#xff0c;tank类的引入2.2 角色的引入2.3 效果图2.4 代码实现总结源码获取前言 接上…

kafka学习之基本概念

一、kafka常用基本概念 producer&#xff1a;生产者&#xff0c;生产并发送消息的一方。 consumer&#xff1a;消费者&#xff0c;接收消费消息的一方。 topic&#xff1a;一类消息的集合。在kafka中&#xff0c;消息以主题为单位进行归类&#xff0c;producer负责将消息发送…

云服务器 宝塔部署SpringBoot前后端分离项目

&#x1f986;博主介绍&#xff1a;小黄鸭技术 &#x1f308;擅长领域&#xff1a;Java、实用工具、运维 &#x1f440; 系列专栏&#xff1a;&#x1f4e2;开发工具 Java之路 八股文之路 &#x1f4e7;如果文章写作时有错误的地方&#xff0c;请各位大佬指正&#xff0c;一起进…

舆情监控究竟是什么?怎么运作的?

本文首发于&#xff1a;行者AI谛听 随着互联网的加速变化&#xff0c;舆论已成为影响国家政治、社会生活和公众情绪的重要因素&#xff0c;也是影响企业形象和长远发展的重要因素。能及时收集精准措施以及预防减少和消除舆论带来的影响&#xff0c;是行业长远发展的关键条件。下…

泰凌微蓝牙 HCI层事件的注册和使用

Controler HCI event是通过HCI将Controller所有的event报告给Host HCI event是按BLE Spec标准设计的&#xff0c;是BLE Controller和Host用来交互的事件&#xff1b;GAP event是BLE host定义的一些协议栈流程交互时间通知型事件。 HCI event类型 #define HCI_EVT_DISCONNEC…

【Hack The Box】windows练习-- Object

HTB 学习笔记 【Hack The Box】windows练习-- Object &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1…

链表oj题(第一弹)

通过前两篇博客我们了解了链表的实现&#xff0c;那么今天我们来看看链表的oj题是如何完成的。 1、移除链表元素 题目要求我们删掉与val相同的节点。 方法一&#xff1a;我们可以写一个循环&#xff0c;首先创建两个节点&#xff0c;一个头节点&#xff0c;一个尾节点&#x…

Jmeter常用函数__V和__intSum

文章目录一、__V详解1、作用2、示例二、__intSum详解1、作用2、示例三、示例--随机用户名四、示例--随机对应的用户名和密码一、__V详解 1、作用 执行变量表达式&#xff0c;并返回执行的结果可以执行嵌套函数 2、示例 1、固定值和随机数组合 ${__V(1.${__Random(1,10,)})}…

[附源码]java毕业设计民宿客栈管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…