目录结构:

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 二维数组的使用示例

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

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

从中我们可以看出其中:

arr -- 代表arr二维数组

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

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

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

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

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

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

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 创建的数组对象的类在哪里

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

  1. int a[] = new int[10];
  2. Class clazz = a.getClass();
  3. System.out.println(clazz.getDeclaredFields().length);
  4. System.out.println(clazz.getDeclaredMethods().length);
  5. System.out.println(clazz.getDeclaredConstructors().length);
  6. System.out.println(clazz.getDeclaredAnnotations().length);
  7. System.out.println(clazz.getDeclaredClasses().length);
  8. System.out.println(clazz.getSuperclass());
    System.out.println(clazz.getName());

以上代码的输出为:

  1. 0
  2. 0
  3. 0
  4. 0
  5. 0
  6. 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却可以不报错,然后我们来看一看一个简单文件的字节码文件:

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

用jclasslib打开我们可以得出:

  1. 0 iconst_2 //将int型常量2压入操作数栈
  2. 1 newarray 10 (int) //将2弹出操作数栈,作为长度,创建一个元素类型为int, 维度为1的数组,并将数组的引用压入操作数栈
  3. 3 astore_1 //将数组的引用从操作数栈中弹出,保存在索引为1的局部变量(即a)中
  4. 4 aload_1 //将索引为1的局部变量(即a)压入操作数栈
  5. 5 arraylength //从操作数栈弹出数组引用(即a),并获取其长度(JVM负责实现如何获取),并将长度压入操作数栈
  6. 6 istore_2 //将数组长度从操作数栈弹出,保存在索引为2的局部变量(即i)中
  7. 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(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享

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

随机推荐

  1. 为什么有的需要安全连接的的application只有开Fiddler才好用?

      Help! Running Fiddler Fixes My App??? Over the years, the most interesting class of support reques ...

  2. (转)Xen Server删除Local Storage

    1. First, you have to determine the Storage-Repository-UUID: xe sr-list -> write down / take note ...

  3. HighCharts设置图表背景透明

    其实就一句话: backgroundColor: 'rgba(0,0,0,0)' 完整示例: $(function () { $('#container').highcharts({ chart: { ...

  4. C++结构变量数据对齐问题

    为了避免混淆.做例如以下规定,下面代码若不加特殊说明都执行于32位平台,结构体的默认对齐值是8,各数据类型所占字节数分别为 char占一个字节 int占四个字节 double占八个字节. 两个样例 请 ...

  5. Robot Framework + Selenium library + IEDriver环境搭建

    转载:https://www.cnblogs.com/Ming8006/p/4998492.html#c.d 目录: 1 安装文件准备2 Robot框架结构3 环境搭建  3.1 安装Python  ...

  6. 轻量级分布式文件系统FastDFS使用安装说明手册(新手入门级)

    轻量级分布式文件系统FastDFS使用安装说明手册(新手入门级) 实验室所在的课题组以研究云计算为主,但所有的研究都是在基于理论的凭空想像,缺少分布式环境的平台的实践,云计算神马的都是浮云了.因此,我 ...

  7. bootstrap——强大的网页设计元素模板

    本文介绍一个网页设计工具——bootstrap,它包含了很多华丽的按钮及排版,我们可以在网页设计中直接使用它,尤其是加入我们只是想简单的使用一下的话,将会是一个不错的选择,下面是几张examples, ...

  8. 使用Spring框架入门四:基于注解的方式的AOP的使用

    一.简述 前面讲了基于XML配置的方式实现AOP,本文简单讲讲基于注解的方式实现. 基于注解的方式实现前,要先在xml配置中通过配置aop:aspectj-autoproxy来启用注解方式注入. &l ...

  9. ActiveMQ 基于zookeeper的主从(levelDB Master/Slave)搭建以及Spring-boot下使用

    0:说明 ActiveMQ 5.9.0新推出的主从实现,基于zookeeper来选举出一个master,其他节点自动作为slave实时同步消息.因为有实时同步数据的slave的存在,master不用担 ...

  10. linux下jdk_tomcat+mysql配置那点事

    (1)上传环境压缩包 apache-tomcat-7.0.47.tar.gz, jdk-7u71-linux-x64.gz, mysql-5.6.14.tar.gz通过xftp工具上传到/usr/lo ...