java数组2023014

news2024/9/21 16:28:01

数组:首先数组也是一种类型
Java的数组要求所有的数组元素具有相同的数据类型。因此,在 一个数组中,数组元素的类型是唯一的,即一个数组里只能存储一种数据类型的数据,不能存储多种数据类型的数据。
注意: 因为Java语言是面向对象的语言,而类与类之间可以支持继承关系,这样可能产生一个数组里可以存放多种数据类型的假象。例如有一个水果数组,要求每个数组元素都是水果,实际上数组元素 既可以是苹果,也可以是香蕉(苹果、香蕉都继承了水果,都是一 种特殊的水果),但这个数组的数组元素的类型还是唯一的,只能是水果类型。
一旦数组的初始化完成,数组在内存中所占的空间将被固定下来,因此数组的长度将不可改变。即使把某个数组元素的数据清空, 但它所占的空间依然被保留,依然属于该数组,数组的长度依然不变。
Java的数组既可以存储基本类型的数据,也可以存储引用类型的数据,只要所有的数组元素具有相同的类型即可。值得指出的是,数组也是一种数据类型,它本身是一种引用类型。例如int是一个基本类型,但int[](这是定义数组的一种方式)就是一种引用类型了。
学生提问:int[]是一种类型吗?怎么使用这种类型呢?
答:没错,int[]就是一种数据类型,与int类型、String类型类似, 一样可以使用该类型来定义变量,也可以使用该类型进行类型转换 等。使用int[]类型来定义变量、进行类型转换时与使用其他普通类 型没有任何区别。int[]类型是一种引用类型,创建int[]类型的对象也就是创建数组,需要使用创建数组的语法。

数组的初始化有如下2种方式。
1.静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。
三种形式来进行静态初始化。
在这里插入图片描述

因为Java语言是面向对象的编程语言,能很好地支持子类和父类的继承关系:子类实例是一种特殊的父类实例。在上面程序中,String类型是Object类型的子类,即字符串是一种特殊的Object实例。
除此之外,静态初始化还有如下简化的语法格式:
在这里插入图片描述

使用上面静态初始化简化语法执行初始化的数组不能使用var定义数组变量。
2.动态初始化:
初始化时程序员只指定数组长度,由系统为数组元素分配初始值。
动态初始化的语法格式如下:
在这里插入图片描述

在上面语法中,需要指定一个int类型的length参数,这个参数指定了数组的长度,也就是可以容纳数组元素的个数。与静态初始化相似的是,此处的type必须与定义数组时使用的type类型相同,或者是定义数组时使用的type类型的子类。下面代码示范了如何进行动态初始化。执行动态初始化时,程序员只需指定数组的长度,即为每个数组元素指定所需的内存空间,系统将负责为这些数组元素分配初始值。

数组指定初始值时,系统按如下规则分配初始值。
1.数组元素的类型是基本类型中的整数类型(byte、short、int和long),则数组元素的值是0。
2.数 组 元 素 的 类 型 是 基 本 类 型 中 的 浮 点 类 型 ( float 、double),则数组元素的值是0.0。
3.数组元素的类型是基本类型中的字符类型(char),则数组元素的值是’\u0000’。
4.数组元素的类型是基本类型中的布尔类型(boolean),则数组元素的值是false。
5.数组元素的类型是引用类型(类、接口和数组),则数组元素的值是null。
注意:
不要同时使用静态初始化和动态初始化,也就是说,不要在进行数组初始化时,既指定数组的长度,也为每个数组元素分配初始值。
在定义数组类型的局部变量时,同样可以使用var来定义变量—只要在定义该变量时为其指定初始值即可,这样编译器就可推断出该变量的类型。

内存
涉及到内存,那就要知道内存是什么?怎么分的?为什么有栈内存和堆内存之分?
答:当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁。因此,所有在方法中定义的局部变量都是放在栈内存中的;在程序中创建一个对象时,这个对象将被保 存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(在方法的参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它。
如果堆内存中数组不再有任何引用变量指向自己,则这个数组将成为垃圾,该数组所占的内存将会被系统的垃圾回收器回收。因此,为了让垃圾回收器回收一个数组所占的内存空间,可以将该数组变量主动赋为null,也就切断了数组引用变量和实际数组之间的引用关系,实
际的数组也就成了垃圾。只要类型相互兼容,就可以让一个数组变量指向另一个实际的数
组,这种操作会让人产生数组的长度可变的错觉。必须牢记:定义并初始化一个数组后,在内存中分配了两个空间,一个用于存放数组的引用变量,另一个用于存放数组本身。
看待一个数组时,一定要把数组看成两个部分:一部分是数组引用,也就是在代码中定义的数组引用变量;另一部分是实际的数组对象,这部分是在堆内存里运行的,通常无法直接访问它,只能通过数组引用变量来访问。

数据元素类型为基本数据类型/引用类型
数组元素为基本类型没什么可说,数组元素为引用类型只需要记住一个图,回忆场景即可;
在这里插入图片描述

二维数组,实际上是一维数组的一维数组,有点怪异:
语法格式
Int[][] 数组名称 = new int[行数][列数];
Int[][] arr = new int[2][3];
初始化了一个长度为2的一维数组,且元素都是长度为3的数组;数据类型int的2行3列的二维数组;
由于二维数组的本质仍是一个一维数组,所以初始化时也是在初始化一维数组,那么,当不确定“第二维度”的数组元素数量时,在赋值符号右侧,创建数组对象的第二个中括号中可以留空。但是在使用此二维数组前必须对第二维度的数组(留空的括号)进行初始化。不然会出现空指针异常—NullPointerException。
主要记住初始化的时候:int[][] arr = new int[4][],初始化这样写,代表数组的长度是4,即4行,然后再进行列的初始化:arr[0] = new int[3];//初始化“第二维度”的一维数组
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1] = new int[2];
相当于:
1.创建了一个名为arr的一维数组 长度为4,arr的第一个元素为数组,长度为3
2.这个数组没有名字 只能通过arr[0]来表示,此数组的三个元素分别是1,2,3
2.arr的第二个元素为数组,长度为2,可以不是3.这个数组没名字,只能通过arr[1]来表示,
此数组的2个元素都为0
3.arr数组的其他元素的值都为null。

所谓的二维数组只需要理解第一步初始化,就明白了全部。
int[][] arr = new int[4][],这一步内存是怎么分布的,则完全明了:
在这里插入图片描述

然后就好理解了。由于a数组的元素必须是int[]数组,所以接下来的程序对a[0]元素执行初始化,也就是让堆内存中的第一个数组元素指向一个有效的数组内存,指向一个长度为2的int数组。因为程序采用动态初始化a[0]数组,因此系统将为a[0]所引用数组的每个元素分配默 认的初始值:0,然后程序显式为a[0]数组的第二个元素赋值为6。此时在内存中的存储示意图
在这里插入图片描述

疑问:
能否让6那里再指向一个数组,成为三维数组?
No,至少本讨论中不行,因为Java是强类型语言,当定义 a数组时,已经确定了a数组的数组元素是int[]类型,则a[0]数组的 数组元素只能是int类型,所以灰色覆盖的数组元素只能存储int类型 的变量。对于其他弱类型语言来说,可以的,如python

但是这样初始化太麻烦了,一步一步的,其实可以同时初始化行和列!!!
Int[][] b = new int[3][4];
在这里插入图片描述

静态初始化也行,太麻烦:
String[][] str1 = new String[][]{new String[3],new String[],{“hello”}};
使用简化的静态初始化语法来初始化二维数组:
String[][] str2 = {new String[3],new String[],{“hello”}};
在这里插入图片描述

数组直接操作麻烦,java提供了Arrays类,包含一些static修饰的方法可以直接操作数组。
具体点api实战中研究使用吧!
Arrays类处于java.util包下,为了在程序中使用Arrays类,必 须在程序中导入java.util.Arrays类。除此以外,在 System类中也有操作数组的static方法:
static void arraycopy(Object src, int srcPos, Object dest, int destPos,int length)方法,该方法可以将src数组里的元素值赋给dest数组的元素,其中srcPos指定从src数组的第几个元素开始赋值,length参数指定将src数组的多少个元素值赋给dest数组的元素。
Java 8增强了Arrays类的功能,为Arrays类增加了一些工具方法,这些工具方法可以充分利用多CPU并行的能力来提高设值、排序的性能。以parallel开头的方法都表示该方法可利用CPU并行的能力来提高性能。
数组适合用来处理同一类型的数据,最典型的demo就是浮点数转换成人民币读法;还有五子棋、连连看、俄罗斯 方块、扫雷等。

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

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

相关文章

MySQL数据库约束(主键约束,外键约束详解)

关系型数据库的一个重要功能:需要保证数据的"完整性",可以通过人工的方式来观察确认数据的正确性,这种方式是可行的,但是不合适,因为人为控制的方式势必会存在疏忽,导致一些错误没有被检查出来,所以MySQL数据库定义了一些约束来帮助程序员更好的检查数据的正确系!一,…

git cherry-pick 教程

对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。 这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。另一种情况是,你只需要部分代码变动&#x…

目标检测-yolov1的详细理解(代码和原理)

目标检测算法,主要分为两类: 一类是以R-CNN为代表的两阶段检测算法,将目标检测任务分为边界框回归和物体分类两个模块二是yolo系列算法,是将目标检测任务看作是回归任务。 原理 yolov1将图像划分为S*S的网格,如果检测…

计网必会:应用层结构体系

文章目录什么是应用层应用层原理P2P模式C/S模式进程的通信原理客户和服务器进程进程发生运输服务类型TCP服务UDP服务服务选择什么是应用层 应用层原理 P2P模式 两台主机相互通信互为服务器,互为主机,可以发现,这样的模式下,如果是…

【Java寒假打卡】JavaWeb-TomCat发布动态资源

【Java寒假打卡】JavaWeb-TomCat发布动态资源Servlet的介绍实现步骤Servlet的执行流程Servlet的介绍 Servlet是运行在Java服务器端的程序,用于接受和响应来自客户端基于HTTP协议的请求如果想实现Servlet的功能,可以通过实现javax.servlet.Servlet接口或…

三、QML开发之qml 语言基础

QML就是用来编辑和生成Quick界面的语言,所以在开发界面之前一定要了解基础的QML语言基础知识,接下来从介绍qml语法如何编写,变量和属性 对象的简要说明,通过本节的学习能够达到简单的加载图片 和设置lable标签存放位置&#xff0c…

【零基础】学python数据结构与算法笔记14-动态规划

文章目录前言88.动态规划介绍89.钢条切割问题90.钢条切割问题:自顶向下实现91.钢条切割问题:自底向上实现92.钢条切割问题:重构解93.最长公共子序列最长公共子序列:实现总结前言 学习python数据结构与算法,学习常用的…

CSS+JS 弹窗

弹窗 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>弹窗</title><style type"text/css">.alert {display: none;justify-content: center;align-items: center;width: 100%;height: 100vh;backgro…

输入一个url后发生了什么 js性能优化

文章目录从一道题开始&#xff1a;输入一个url后发生了什么&#xff1f;1.请求协议可聊点1&#xff1a;http协议相关> 追问: http与TCP可聊点2&#xff1a; https协议相关> 追问&#xff1a;http与https2.域名解析3.web服务器4.服务(2、3)涉及到 网络优化5.浏览器渲染6.脚…

【Zookeeper】关于windows安装问题整理汇总

文章目录常规安装&#xff1a;1、windows配置zoo.cfg之后&#xff0c;提示&#xff1a;JAVA_HOME is not set.1.1 本地没有安装JDK或者没有配置JAVA_HOME解决方案&#xff0c;参考JDK安装下载办法1.2 本地配置的JDK但是环境变量JDK路劲不叫名字“JAVA_HOME”解决方案&#xff1…

docker容器将系统盘空间占满的解决办法

最近遇到一个问题&#xff0c;线上服务器的系统盘空间被占满了&#xff0c;导致服务不能正常运行了。docker启动时会报出下面这个错误no space left on device排查用到的命令&#xff0c;显示当前路径下占用空间超过1G的文件或文件夹du -h --max-depth1|grep G|sort -n经过一番…

SAP FICO 详细解析新总账功能 - 平行分类账配置

平行分类账配置 其作用简单来说就是&#xff0c;同时一笔记账&#xff0c;会产生多个账套的凭证。 【配置流程】 1、定义总账会计核算的分类账 账套可以有多个&#xff0c;但是主分类账有且只有一个。 表FAGLFLEXT就是存储所有财务分类账发生额数据的汇总表。 勾选多个“主…

CSS知识梳理

CSS的三大特性 一 . 层叠性 : 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突的问题 层叠性原则 : 样式冲突&#xff0c;遵循的原则是就近原则&#xff0c;哪个样式离结构近&#xff0c…

在Azure应用程序按指定时区的时间来输出日志(NLog)

部署在Azure应用程序使用NLog组件进行日志输出&#xff0c;如购买的Azure云是国际版&#xff08;非中国版Azure&#xff09;&#xff0c;默认使用国标时间&#xff08;即&#xff1a;UTC&#xff09;来输出日志时间&#xff0c;与中国地区的时间相差8小时&#xff08;即&#x…

NodeJs使用mysql.createPool连接池

1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABASE mydb1; mysql> SHOW DATABASES; -------------------- | Database | -------------------- | information_schem…

客快物流大数据项目(一百零三):快递追踪需求介绍

文章目录 快递追踪需求介绍 ​​​​​​​前言 背景介绍 快递追踪需求介绍 ​​​​​​​前言

Juicesync实现对腾讯云CHDFS存储的数据迁移

文章目录前言一、Juicesync准备二、Hadoop准备三、迁移实验四、实现思路前言 近年来&#xff0c;云计算越来越流行&#xff0c;企业从自身利益出发&#xff0c;或是不愿意被单一云服务商锁定&#xff0c;或是业务和数据冗余&#xff0c;或是出于成本优化考虑&#xff0c;会尝试…

Electron + vite + vue3简单实现

文章目录一、创建Electron应用程序1. 初始化vite项目2. 安装electron3. 修改配置文件4. 编写electron文件5. npm run dev 运行二、打包1. 安装包2. 配置打包脚本3. 渲染进程和主进程的通信渲染进程主进程一、创建Electron应用程序 Electron官网 1. 初始化vite项目 npm creat…

【区块链技术前沿】可下载内容与NFT

发表时间&#xff1a;2022年3月29日 信息来源&#xff1a;coingeek.com 目前&#xff0c;DLC&#xff08;可下载内容&#xff09;仍然是备受争议的话题&#xff0c;但却是电子游戏世界在2010年代选择的一个非常成功的市场方向。许多游戏玩家继续抱怨着电子游戏发行商在敲诈用户…

认识Panda3D引擎bam相关命令

看一下Panda自带命令&#xff0c;其中有bam相关的&#xff0c;来了解一下&#xff1b; 输入一个命令看一下&#xff0c;提示需要输入一个bam文件名&#xff1b; 查一下&#xff0c;查到一个介绍一种bam文件的资料如下&#xff0c; SAM (Sequence Alignment/Map) 格式是一种通用…