根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/m0_37609579/article/details/99355842
从这一节开始,我们就要正式进去数据结构的世界了,那么第一个是什么呢,就是我们的数组。
在我想写数组的时候,我的第一印象是去看它的源码,很可惜,数组的实现太特殊了,找了很久,我没有找到它的源码,带着这样的思考,我就开始了Java中数组的挖掘。Wow,真香!
一、Java中数组的介绍
数组是一种最简单的复合数据类型,它是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和不同的下标来唯一确定数组中的元素。根据数组的维度,可以将其分为一维数组、二维数组和多维数组等。一定要注意,数组只能存放同一种数据类型(Object类型数组除外)。
二、数组是一个引用类型吗?
先给答案,是的,没有任何疑问。
注意,数组也是一种数据类型,它本身是一种引用类型。
数组是一种大小固定的数据结构,对线性表的所有操作都可以通过数组来实现。虽然数组一旦创建之后,它的大小就无法改变了,但是当数组不能再存储线性表中的新元素时,我们可以创建一个新的大的数组来替换当前数组。这样就可以使用数组实现动态的数据结构。
如何验证?
定义一个数组,发现它拥有Object类的所有方法。

ac1ece2786fce5137fd2254d977e61ad.png


根据这个例子,其实大家已经看出来了,数组拥有超类Object的所有方法,说明他也是一个类。并且他拥有自己的clone()方法和length属性。
三、如何了解数组的底层实现
既然数组拥有Object的所有方法,那我们是否能查看一下数组的源码,来了解一下数组的实现呢?
可惜,数组太特殊了,他的实现是虚拟机编译的时候动态生成的,所以我们无法直接查看源码,只能通过查看编译后的class的字节码一探究竟。
JVM 中数组对象是一种特殊的对象,虚拟机从数组的元数据中无法确认数组的大小,它的Object Header 比普通对象多了一个word 来存储数组的长度,length 会编译成对应的字节码读取这个field 就可以了。
我分别定义基本数据类型和引用类型来查看一下最终生成的字节码有何区别。

    public void test08(){Object[] o = new String[11];o[0]="1aaa";int i=o.length;Integer[] a=new Integer[11];a[0]=100;int j=a.length;int[] b=new int[11];b[0]=100;int k=b.length;}

注意:定义并初始化一个数组后,在内存中分配了两个空间,一个用于存放数组的引用变量,另一个用于存放数组本身。

0747d3193a2538b40bd3467c8909510d.png


进行程序开发时,要深入底层的运行机制。
看待一个数组时,一定要把数组看成两个部分:一部分是数组引用,也就是在代码中定义的数组引用变量;还有一部分是实际的数组对象,这部分是在对内存里运行的,通常无法直接访问它,只能通过数组引用变量来访问。

fa907e11556f8846938faa65601bf95d.png


四、Array 的 length 域相关
在很多的资料中都写了,Array中有类似public final int length的成员变量。但是在《Java Language Specifications》10.1. Array Types中明确写了,length不是类型的一部分;

  • An array's length is not part of its type.
 0 bipush 112 anewarray #12 <java/lang/String>  //anewarray代表对象数组5 astore_16 aload_17 iconst_08 ldc #25 <1aaa>
10 aastore
11 aload_1
12 arraylength //arraylength代表长度
13 istore_2
14 bipush 11
16 anewarray #26 <java/lang/Integer>  //anewarray代表包装类数组
19 astore_3
20 aload_3
21 iconst_0
22 bipush 100
24 invokestatic #27 <java/lang/Integer.valueOf>
27 aastore
28 aload_3
29 arraylength
30 istore 4
32 bipush 11
34 newarray 10 (int)  //newarray代表基本数组类型数组
36 astore 5
38 aload 5
40 iconst_0
41 bipush 100
43 iastore
44 aload 5
46 arraylength
47 istore 6
49 return

打印:20java.lang.NoSuchFieldException: length
可以看到length并不是Array的成员变量。
五、Java语言规范关于Array的定义
数组在Java里是一种特殊类型,有别于普通的“类的实例”的对象。
10.1. Array Types
10.8. Class Objects for Arrays
Every array has an associated Class object, shared with all other arrays with the same component type.Although an array type is not a class, the Class object of every array acts as if:

  1. The direct superclass of every array type is Object.
  2. Every array type implements the interfaces Cloneable and java.io.Serializable.

数组类型是由JVM从元素类型合成出来的。
10.7. Array Members
The members of an array type are all of the following:

  1. The public final field length, which contains the number of components of the array. length may be positive or zero.

从Java语言到Class文件,Java源码编译器会识别出对数组类型的length字段的访问,并生成对应的字节码。
以OpenJDK8的javac为例:
jdk8u/jdk8u/langtools: 84eb51777733 src/share/classes/com/sun/tools/javac/jvm/Gen.java

base.load();
if (sym == syms.lengthVar) {code.emitop0(arraylength);result = items.makeStackItem(syms.intType);
}

六、数据应用场景
这种数据结构使用一段连续的空间来存贮元素,所以可以直接通过索引来获取到某个元素,而且可以通过对元素的内容进行排序,然后使用二分法查找,从而提供查找效率。其适合的场合主要是:

  1. 不会频繁增删元素的场合,因为增删元素都牵涉到元素空间的重新分配,频繁的内存分配操作会大幅降低操作效率。但添加操作时,可以通过预分配足够的空间来优化添加时的效率。
  2. 属于随机迭代器,可以随机访问任意元素。对于已排序的元素查找起来效率较高。

七、数组总结
在看数组的时候,因为class是动态创建的,所以看了很久,但是根据数组的特性,基本可以认为数组的域和方法,类似于:

class A<T> implements Cloneable, java.io.Serializable {  public final int length = X;  public T[] clone() {  try {    return (T[]) super.clone();} catch (CloneNotSupportedException e) {    throw new InternalError(e.getMessage());}}
}

数组可以是一维数组、二维数组或多维数组。

  • 数值数组元素的默认值为 0,而引用元素的默认值为 null。
  • 交错数组是数组的数组,因此,它的元素是引用类型,初始化为 null。交错数组元素的维度和大小可以不同。
  • 数组的索引从 0 开始,如果数组有 n 个元素,那么数组的索引是从 0 到(n-1)。
  • 数组元素可以是任何类型,包括数组类型。
  • 数组类型是从抽象基类 Array 派生的引用类型。

我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

5e5c07202e69f6e23d4963a9ac80f6fb.png


参考文章:

  1. https://www.cnblogs.com/ysocean/p/7894448.html
  2. https://www.runoob.com/java/java-array.html
  3. https://chaxiaoniu.oschina.io/2017/08/07/JavaArrayOfDataStructure/
  4. https://blog.csdn.net/weixin_40617102/article/details/90264102
  5. https://www.zhihu.com/question/29649110
  6. http://c.biancheng.net/view/906.html
  7. https://blog.51cto.com/14028890/2384977

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

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

相关文章

自定义条件查询_数据查询不止有vlookup函数,自定义zlookup函数查询操作更高效...

Excel数据查询&#xff0c;相信大家首先会想到vlookup函数。毋庸置疑vlookup函数在Excel数据查询中作用是非常的强大。但是它也有一些不能实现的数据查询。如上图所示&#xff0c;我们需要根据人员的出现次数&#xff0c;提取第N次的数据。这里vlookup函数就无法使用&#xff0…

2021年中国工业互联网行业发展现状分析,“5G+工业互联网”驱动行业快速发展

一、概述 工业互联网是新一代信息通信技术与工业经济深度融合的新型基础设施、应用模式和工业生态&#xff0c;通过对人、机、物、系统等的全面连接&#xff0c;构建起覆盖全产业链、全价值链的全新制造和服务体系&#xff0c;为工业乃至产业数字化、网络化、智能化发展提供了…

针对数能同传SWIPT的个人理解与总结Part1

无线数能同传&#xff08;Simultaneous Wireless Information and Power Transfer, SWIPT&#xff09;技术是指利用无线射频信号可同时携载信息与能量的特点&#xff0c;从一个射频信号中同时接收信息与能量的技术。 一、接收机架构 SWIPT有很多种解释&#xff0c;携能通信、…

米筐量化不支持c语言_量化 | 从零开始学量化(三):数据获取途径

本系列的前两篇都是一些笼统的介绍&#xff0c;供小白制定学习计划时参考&#xff0c;现在该铺垫的都铺垫的差不多了。循序渐进&#xff0c;从本篇开始会写一些能实操的内容&#xff0c;尽量写的很细节&#xff0c;有任何问题欢迎私戳。本篇给出一些数据获取途径&#xff0c;基…

射频知识简介

无线通信系统中&#xff0c;一般包含有天线、射频前端、射频收发模块以及基带信号处理器四个部分。随着5G时代的&#xff0c;天线以及射频前端的需求量及价值均快速上升&#xff0c;射频前端是将数字信号向无线射频信号转化的基础部件&#xff0c;也是无线通信系统的核心组件。…

尽可能地做到无服务器,但不止于此

毫无疑问&#xff0c;如果您一直关注技术趋势&#xff0c;那么您会看到“无服务器”的兴起。 在某些情况下&#xff0c;“无服务器”被称为“下一个应用程序体系结构”样式。 我什至听说有人说“您不需要技术X&#xff0c;因为无服务器是未来的方式”或“技术X是红鲱鱼&#xf…

信号扫描_科研必备“武器”之扫描电子显微镜

仪器介绍扫描电子显微镜&#xff08;英语名称为Scanning Electron Microscope&#xff0c;缩写为SEM&#xff09;&#xff0c;简称扫描电镜。它是一种电子显微镜&#xff0c;利用聚焦电子束扫描样品的表面来产生样品表面的图像。最常见的扫描电镜模式是检测由电子束激发的原子发…

解决office一打开就显示正在更新,过一会就报错的问题

问题描述&#xff1a; 一打开office就显示正在更新&#xff0c;请稍后&#xff0c;过一会就弹窗报错。 解决方案&#xff1a; 1.winR输入services.msc 2.将Microsoft Office即点即用服务设为自动 如果第二步中已经是自动状态&#xff0c;先禁用一下&#xff0c;再重新设置为…

框架如何调用存储过程_如何在FastReport.Net中使用存储过程

在本文中&#xff0c;我们将讨论使用存储过程来检索报表的数据&#xff0c;使用MS SQL示例&#xff0c;将展示如何在报表中创建和使用函数。Transact SQL允许创建存储过程和函数&#xff0c;存储过程用于自动执行任何操作&#xff0c;这些功能旨在扩展查询功能&#xff0c;它们…

Word无法插入公式项目灰色不可用

在我们平时办公或者是论文写作过程中&#xff0c;插入编辑公式是非常常见的操作。但是有时候我们打开Word点击插入发现公式图标为灰色且不可选。接下来我将介绍如何解决。 1、打开文档找到插入公式位置点击插入选项。 2、发现公式符号变为灰色且不可选择。 3、点击左上角的【文…

同源策略为什么可以防csrf_Spring Security 如何预防CSRF跨域攻击?

序言前面我们学习了 spring security 与 springmvc 的整合入门教程。spring secutity整合springboot入门spring security 使用 maven 导入汇总spring security 业界标准加密策略源码详解这一节我们来学习一下 spring security 是如何预防 CSRF 攻击的。拓展阅读web 安全系列-04…

centos移动文件到指定目录_Dynamo批量分离中心文件并另存到指定目录

我们在做项目的时候&#xff0c;为了方便协作&#xff0c;一般都会采用中心文件的方式&#xff0c;但是最终交付的时候&#xff0c;是需要把中心文件分离的&#xff0c;一个一个的分离&#xff0c;感觉还是他麻烦了&#xff0c;于是就想到用Dynamo来批量操作&#xff0c;简单测…

轻松监控Docker容器中的ADF应用程序

在这篇简短的文章中&#xff0c;我将展示一种简单的方法&#xff0c;以确保在Docker容器中运行的ADF应用程序在内存利用率方面是健康的Java应用程序。 我将使用标准工具JConsole&#xff0c;它是计算机上JDK安装的一部分。 如果存在问题&#xff08;例如&#xff0c;内存泄漏&a…

int型 判断奇偶_XSS(Reflected) 反射型跨站攻击

今天我学习一下反射型XSS。1、low级别打开DVWA网站&#xff0c;先切换到low级别&#xff0c;选择XSS&#xff08;Reflected&#xff09;先查看其源代码&#xff1a;<?php header ("X-XSS-Protection: 0"); // Is there any input? if( array_key_exists( "…

junit 运行_运行,JUnit! 跑!!!

junit 运行JUnit与JavaScript和SVN一起是程序员经常开始使用的一些技术&#xff0c;甚至没有读过一篇博客文章&#xff0c;更不用说一本书了。 也许这是一件好事&#xff0c;因为它们看起来足够简单并且易于理解&#xff0c;因此我们可以立即使用它们而无需任何手册&#xff0c…

将Host Cobol批次和Monolith Webapps移动到云和微服务

在Amazon Event “从大型机到微服务– Vanguard迁移到云”中非常有趣的演示。 以下部分可用作迁移模式 &#xff1a;如何从大型机迁移到微服务的不同方式&#xff1a; 重新托管 再造 重构 使用Linux和Java重新平台 回购 退役 全部结合 该演示文稿还展示了Vanguard的Cloud…

flutterapp部分手机无法打开_Flutter应用程序在最新更新后无法运行

Environment DetailsWindows VS CodeFlutter 1.17.5 • channel stable • https://github.com/flutter/flutter.gitFramework • revision 8af6b2f038 (3 days ago) • 2020-06-30 12:53:55 -0700Engine • revision ee76268252Tools • Dart 2.8.4Error From Debug ConsoleE…

android动态添加的页面怎么加功能_Android跳转应用安装页面

一.低版本跳转方式Intent intent new Intent(Intent.ACTION_VIEW);intent.setDataAndType(uri,"application/vnd.android.package-archive");intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivityForResult(intent, 666);uri是apk的uri记得不要忘了在mani…

字节数组转为二进制数 c#_如何使用字节序列化双精度数组(二进制增量编码,用于低差单调浮点数据集)...

字节数组转为二进制数 c#低延迟系统需要高性能的消息处理和传递。 由于在大多数情况下&#xff0c;数据必须通过有线传输或序列化才能保持持久性&#xff0c;因此编码和解码消息已成为处理管道的重要组成部分。 高性能数据编码的最佳结果通常涉及应用程序数据细节的知识。 本文…

java用户的登录图片_Java 如何用 token 做用户登录认证

1、什么是 token&#xff1f;&#xff1f;&#xff1f;Token 是服务端生成的一串字符串&#xff0c;以作客户端进行请求的一个令牌。2、token 做用户登录认证● 流程3、 Java 实现● 用户登录生成 token&#xff0c;保存到 Redis 中最简单的 token 可由 uid (用户唯一的身份标识…