【java】解析java中的数组

时间:2022-08-26 16:50:15

目录结构:

contents structure [+]

1,一维数组

1.1 什么是一维数组

一维数组就是在内存连续分配的一段存储空间。

1.2 声明一维数组的三种方式

第一种:在声明的时候赋值

数据类型 [] 数组变量名称 ={初始值1,初始值2,初始值3,.......};

第二种:直接声明不赋值

数据类型 [] 数据变量名 = new 数据类型[数组长度];

第三种:由第二种演变而来,(不推荐使用这种方式,推荐使用第二种方式)

数据类型 数据变量名 [] =new 数据类型[数组长度];

2,二维数组

2.1 什么是二维数组

二维数据就是使用一维数组组成的数据,其元素是一维数组。

2.2 声明二维数组的三种方式

第一种:声明的时候直接赋值

数据类型 [][] 数据变量名 = {{初始值11,初始值12,初始值13,......},{初始值21,初始值22,初始值23,......},{初始值31,初始值32,初始值33,......},......};

第二种:直接声明不赋值

数据类型 [][] 数据变量名 =new 数据类型 [行数][列数];

例如:int [][] arr=new int [3][2];//创建一个3行,2列的二维数组

第三种:先声明行,再声明列

数据类型 [][]数据变量名= new 数据类型 [行数][];

数据变量名 [行数] = new 数据类型[列数];

例如:

int [][] arr= new int[3][];//创建一个二维数组,指定为3行

arr[0]=new int[2];//第一行指定为2列

arr[1]=new int[3];//第二行指定为3列

arr[2]=new int[4];//第三行指定为4列

2.3 二维数组的使用示例

接下来我们来看一个遍历二维数组的代码:

        int [][] arr=new int[4][];//声明一个二维数组,指定为4行
arr[0]=new int[2];//第1行,声明为2列
arr[1]=new int[3];//第2行,声明为3列
arr[2]=new int[4];//第3行,声明为4列
arr[3]=new int[5];//第4行,声明为5列
for(int row=0;row<arr.length;row++){//arr.length 代表总的行数
for(int column=0;column<arr[row].length;column++){// arr[row]代表第row+1行,因此 arr[row].length代表第row行的列数
System.out.print(arr[row][column]);
}
System.out.println();
}

从中我们可以看出其中:

arr -- 代表arr二维数组

arr[n]  -- 代表二维数组的第n+1行,也就是1个一维数组

arr[n][m]  --  代表二维数组中某一个具体的元素

3,数组在内存空间中的分配情况

一位数组就是在内存中连续分配的一段内存空间,数组名称代表这个容器的地址。

二维数组就是一维数组组成的一维数组,所以二维数组的在内存中的表示方式应该是和一维数组类似:

【java】解析java中的数组

上面图形的表示的二维数组可以声明为以下格式:

int [][] Arrays={{11,12,13},{14,15},{16}};

也就是一共三行,第一行三个数据,第二行两个数据,第三行一个数据。

4,各种数据类型在声明完毕后的默认初始值

我在Java中使用数组声明完毕后(如:int [] arr=new int[3];),会自动赋上默认值。数据类型一共分为两大类,基本数据类型和引用数据类型。

其中基本数据类型:

byte/short/int/long 的默认数组是0

float/double 的默认值是0.0

char 的默认值\u0000

boolean 的默认值是false

这里需要注意char数组的默认值是空格而不是0,因为十进制0在ASCII中恰好对应空字符。

5,解析数组中的length属性

不知道读者有没有注意到,java中的数组获取长度是采用length属性,而并非是用length()函数。首先读者需要明白,一个对象里的内容只包括了属性,并没有方法。换句话说,在堆区中只会为属性分配内存空间,并不会为方法分配空间,那么方法是怎么和对象联系起来的呢?其实方法就是一个盒子,这个盒子在栈区中起作用,也就是通常所说的压栈和出栈过程。在编译类文件的时候,类加载器加载类文件的时候就把对象和方法联系起来了!通过下面的阅读,读者将会知道数组的长度属性是由JVM执行的,这也恰好符合了数组length属性的叫法!

5.1 java中的数组是对象吗

首先可以肯定java中的数组是对象,详见java中的数组是对象吗

5.2 创建的数组对象的类在哪里

我们通过以下程序找出数组对象的类:

     int a[] = new int[10];
Class clazz = a.getClass();
System.out.println(clazz.getDeclaredFields().length);
System.out.println(clazz.getDeclaredMethods().length);
System.out.println(clazz.getDeclaredConstructors().length);
System.out.println(clazz.getDeclaredAnnotations().length);
System.out.println(clazz.getDeclaredClasses().length);
System.out.println(clazz.getSuperclass());
System.out.println(clazz.getName());

以上代码的输出为:

0
0
0
0
0
class java.lang.Object
[I

从以上的代码我们可以看出,一维数组的数组类没有属性、没有方法、没有构造方法、没有注释,一维数组直接继承于java.lang.Object,一维数组的类名是[I(其实一个[字符代表一维数组的名称,两个[代表二维数组的名称,三个[字符代表三维数组的名称,.............)。

5.3 java数组中.length属性的来源

这就比较奇怪了,既然数组类没有属性和方法,那么为什么可以调用.length而不报错,在查阅了JVM技术文档后在5.3.3. Creating Array Classes得出了数据类的创建来源:

“The Java Virtual Machine creates a new array class with the indicated component type and number of dimensions”,大致意思就是“Java虚拟机会据元素类型和维度,创建相应的数组类。”。

JVM不把数组类放到任何包中,也不给他们起个合法的标识符名称,估计是为了避免和JDK、第三方及用户自定义的类发生冲突吧。

现在我们知道了数组类的来源,但是为什么数组类没有任何属性和方法,但是却可以调用.length却可以不报错,然后我们来看一看一个简单文件的字节码文件:

 public class Main {
public static void main(String[] args) {
int a[] = new int[2];
int i = a.length;
}
}

用jclasslib打开我们可以得出:

0 iconst_2                   //将int型常量2压入操作数栈
1 newarray 10 (int) //将2弹出操作数栈,作为长度,创建一个元素类型为int, 维度为1的数组,并将数组的引用压入操作数栈
3 astore_1 //将数组的引用从操作数栈中弹出,保存在索引为1的局部变量(即a)中
4 aload_1 //将索引为1的局部变量(即a)压入操作数栈
5 arraylength //从操作数栈弹出数组引用(即a),并获取其长度(JVM负责实现如何获取),并将长度压入操作数栈
6 istore_2 //将数组长度从操作数栈弹出,保存在索引为2的局部变量(即i)中
7 return //main方法返回

可见,在这段字节码中,根本就没有看见length这个成员变量,获取数组长度是由一条特定的指令arraylength实现。编译器对Array.length这样的语法做了特殊处理,直接编译成了arraylength指令。另外,JVM创建数组类,应该就是由newarray这条指令触发的了。相关字节码命令可以查看:java bytecode instrcution listings

6,参考文章

1,深入分析java中length和length()

2,java中数组的特性

3,为什么使用length获取数据的长度

【java】解析java中的数组的更多相关文章

  1. java 在循环中删除数组元素

    在写代码中经常会遇到需要在数组循环中删除数组元素的情况,但删除会导致数组长度变化. package com.fortunedr.thirdReport; import java.util.ArrayL ...

  2. Java基础学习总结(67)——Java接口API中使用数组的缺陷

    如果你发现在一个接口使用有如下定义方法: public String[] getParameters(); 那么你应该认真反思.数组不仅仅老式,而且我们有合理的理由避免暴露它们.在这篇文章中,我将试图 ...

  3. 【PHP】解析PHP中的数组

    目录结构: contents structure [-] 创建数组 删除数组 栈结构 常用的数组处理函数 在这篇文章中,笔者将会介绍PHP中数组的使用,以及一些注意事项.之前笔者已经说过PHP是一门弱 ...

  4. java解析邮箱中的邮件信息

    import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import ...

  5. JAVA该队列中的数组,圆阵队列,链队列

    /** * 文件名:QueueText.java * 时间:2014年10月22下午9:05:13 * 笔者:维亚康姆维修 */ package chapter3; /** * 类名:ArrayQue ...

  6. java 解析webservice 中的soapheader

    //从MessageContet中获取头域中的值 public HeaderBean getBeanFromRequest(org.apache.axis2.context.MessageContex ...

  7. javascript中稀疏数组和密集数组

    密集数组 数组是一片连续的存储空间,有着固定的长度.加入数组其实位置是address,长度为n,那么占用的存储空间是address[0],address[1],address[2].......add ...

  8. java中的集合类详情解析以及集合和数组的区别

    数组和链表 数组:所谓数组就是相同数据类型的元素按照一定顺序排列的集合. 它的存储区间是连续的,占用内存严重,所以空间复杂度很大,为o(n),但是数组的二分查找时间复杂度很小为o(1). 特点是大小固 ...

  9. Java解析OFFICE&lpar;word&comma;excel&comma;powerpoint&rpar;以及PDF的实现方案及开发中的点滴分享

    Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享 在此,先分享下写此文前的经历与感受,我所有的感觉浓缩到一个字,那就是:"坑&qu ...

随机推荐

  1. 总是有一个程序的bug没找到

     算法训练 Lift and Throw   时间限制:3.0s   内存限制:256.0MB      问题描述 给定一条标有整点(1, 2, 3, ...)的射线. 定义两个点之间的距离为其下标之 ...

  2. JS中offsetTop、clientTop、scrollTop、offsetTop各属性介绍

    这里是javascript中制作滚动代码的常用属性 页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见 ...

  3. 打通多个帝国CMS系统的会员整合与同步教程

    例子:我们要整合下面三个帝国CMS系统网站名称分别为"A网站"."B网站"."C网站":安装系统的数据库名分别为"adb&quot ...

  4. iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到&period;a静态库

    编译环境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3) 一.首先将资源文件打包成bundle 新建工程:File -> Ne ...

  5. CreateFeatureClass 异常&comma;尝试读取或写入受保护的内存 Access

    在创建要素时出现如下异常,百思不得其解. 后经过多次试验,发现文件名改为其他的就可以了.自出的文件名为"第3条",后将文件名改为"A3"等,则可正常创建. 后再 ...

  6. Java Synchronized的用法

    synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码 ...

  7. jackson 解析json问题

    1.json串中有key为A,但指定转换的mybean中未定义属性A,会抛异常.处理:mapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, fals ...

  8. ubuntu 设置静态IP之后不能上网。

    一个同事设置之后不能上网. 根据经验DNS有问题. 所以就设置8.8.8.8 之后就好了 DONE

  9. js或jquery实现点击某个按钮或元素显示div&comma;点击页面其他任何地方隐藏div

    点击某个元素显示div,点击页面其他任何地方隐藏div,可用javascript和jquery两种方法实现: 一:javascript实现方法技巧<script>//定义stopPropa ...

  10. 访问vsts私有nuget

    访问vsts私有nuget Intro 有时候我们可能要自己搭建一个 nuget,如果不对外公开,即包浏览也是需要权限的,那我们应该怎么做才可以支持在哪里都可以正常的还原包呢? 我是在 VSTS(Vi ...