`

数组分配的字节码分析

 
阅读更多
int [][]a=new int[3][5];
System.out.println(a[0][0]);

会打印出 0
可以得出另外
引用类型的数组不赋值里面存储的都是 null
基本数据类型,譬如 int 不赋值存储的是 0;
double float 不赋值默认存储的都是是 0.
基本数据类型  数组存储的是数据 而引用存储的是引用....
String[] x = {"o", "k","ok"}; 


这里存储的是String对象的引用....

int[] x = {0}; 与 int[] x = new int[1]

通过查看字节码  可以得知 是 一样的效果...

 //    0    0:iconst_1        
    //    1    1:newarray        int[]
    //    2    3:dup             
    //    3    4:iconst_0        
    //    4    5:iconst_0        
    //    5    6:iastore         
    //    6    7:astore_1        
    //    7    8:iconst_1        
    //    8    9:newarray        int[]
    //    9   11:astore_2        
    //   10   12:return      


int[][] x = {{1},{1,2},{1,2,3},new int[1]}; 


查看字节码
  public static void main(String args[])
    {
    //    0    0:iconst_3        
    //    1    1:anewarray       int[][]
    //    2    4:dup             
    //    3    5:iconst_0        
    //    4    6:iconst_2        
    //    5    7:newarray        int[]
    //    6    9:dup             
    //    7   10:iconst_0        
    //    8   11:iconst_2        
    //    9   12:iastore         
    //   10   13:dup             
    //   11   14:iconst_1        
    //   12   15:iconst_3        
    //   13   16:iastore         
    //   14   17:aastore         
    //   15   18:dup             
    //   16   19:iconst_1        
    //   17   20:iconst_2        
    //   18   21:newarray        int[]
    //   19   23:dup             
    //   20   24:iconst_0        
    //   21   25:iconst_1        
    //   22   26:iastore         
    //   23   27:dup             
    //   24   28:iconst_1        
    //   25   29:iconst_5        
    //   26   30:iastore         
    //   27   31:aastore         
    //   28   32:dup             
    //   29   33:iconst_2        
    //   30   34:iconst_2        
    //   31   35:newarray        int[]
    //   32   37:dup             
    //   33   38:iconst_0        
    //   34   39:iconst_3        
    //   35   40:iastore         
    //   36   41:dup             
    //   37   42:iconst_1        
    //   38   43:iconst_4        
    //   39   44:iastore      将int类型存入数组   
    //   40   45:aastore      将引用类型存入数组 (二维的)   
    //   41   46:astore_1        
    //   42   47:aload_1         
    //   43   48:invokestatic    #3   <Method void change(int[][])>
    //   44   51:getstatic       #4   <Field PrintStream System.out>
    //   45   54:aload_1         
    //   46   55:iconst_0        
    //   47   56:aaload             //   48   57:iconst_0        
    //   49   58:iaload          
    //   50   59:invokevirtual   #5   <Method void PrintStream.println(int)>
    //   51   62:return          
    }

//还要注意 创建一维数组和多维数组是不一样的命令
int [][]a=new int[3][5];
注意 这里 通过字节码可以看出  x二维数组放的不是15个int元素 而是 3个int数组对象

一个是newarray是基本类型数组
另一个是anewarray的放入引用类型的数组  所以这两种数组不是一个Class
    public static void change(int ai[][])
    {
    //    0    0:aload_0   从局域变量0中加载引用类型的值   
    //    1    1:iconst_0  将0压入栈  
    //    2    2:aaload    从数组装入引用的值  获得了a[0]
    //    3    3:iconst_0  将0压入栈
    //    4    4:iconst_1  将1压入栈
    //    5    5:iastore   对数组赋值a[0][0] 类型是int  注意 如果是普通的引用的话赋值是 用astore_1  这就是数组为什么是引用传递 而引用是值传递!
      
    //    6    6:return          
    }


对应的方法
public static void main(String[] args) {
		// TODO Auto-generated method stub

int a[][]={{2,3},{1,5},{3,4}};

change(a);
System.out.println(a[0][0]);
}
public static void change(int[][]a)
{
a[0][0]=1;
}
}



如果有个方法change里面的参数是StringBuffer,在change里面进行了append
那他会改变吗》》??

public static void main(String[] args) {
		// TODO Auto-generated method stub

	 StringBuffer   buffA=new   StringBuffer( "a "); 
           StringBuffer   buffB=new   StringBuffer( "b "); 
           change(buffA,buffB); 
	  System.out.println(buffA+ ", "+buffB); 

	}
	public static void change(StringBuffer x,StringBuffer y){
           x.append(y); 
	     y=x; 


再看
他的字节码
 //    0    0:aload_0         
    //    1    1:aload_1         
    //    2    2:invokevirtual   #15  <Method StringBuffer StringBuffer.append(StringBuffer)>
    //    3    5:pop        弹出栈顶的值  这也就是为什么StringBuffer能够起到引用传递的内容.....     
    //    4    6:aload_0         
    //    5    7:astore_1        
    //    6    8:return       

分享到:
评论

相关推荐

    char数组的错误认识

    1. **数组是否为空:**首先需要明确的是,数组的空间一旦分配,就始终存在。即使数组中的所有元素都被设置为0,数组本身还是存在的,并且其内存空间中存储的数据仍然是可以访问的。因此,说数组为空并不准确。 2. ...

    9.第九章 数组.txt

    数组总字节数=sizeof(类型说明符)*数组长度=sizeof(数组名)。 9.2.2 一维数组引用 数组元素的的标识方法为数组名后跟下标。引用数组元素的一般形式为:数组名[下标]。下标只能为整型常量、整型变量、整型表达式。 ...

    虚拟机规范_超清版.rar

    通过理解和分析字节码,开发者可以运用各种优化策略,如方法内联、逃逸分析、栈上分配等,以提升Java应用程序的运行效率。 8. **JVM调优**: 了解JVM的参数设置,例如内存大小调整、垃圾回收器选择、类加载相关...

    Java开发零基础篇:day04 数组.pdf

    1. **程序计数器(Program Counter Register)**:存储当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等都依赖程序计数器完成。 2. **本地方法栈(Native Method Stack)**:为虚拟机...

    字符串转ASICC数组.rar

    ASCII码是一种字符编码标准,它为每个可打印的英文字符分配了一个唯一的7位二进制数字,范围从0到127。在LabVIEW中,ASCII字符通常以单一的8位字节(即无符号整数1字节)表示,因为8位足以容纳ASCII码的所有值。 ...

    Lua源码分析

    Lua源码分析中会关注到代码翻译的过程,它包括如何将Lua代码转换为字节码,以及这些字节码如何被虚拟机加载和执行。 5. 内嵌库: Lua官方提供了内嵌库来丰富Lua语言的功能。源码分析中会探讨这些库的实现方式以及...

    java中jvm内存分配相关资料总结整理

    Java虚拟机(JVM)是Java程序运行的基础,它负责解析字节码并管理程序的内存。本资料总结主要关注JVM内存分配及其运行原理,这对于理解和优化Java应用程序的性能至关重要。 1. **JVM内存结构** JVM内存分为几个...

    ASM中文帮助文档

    - **代码优化**:ASM可以用来对字节码进行优化,例如消除冗余的计算或减少内存分配。 - **AOP(面向切面编程)**:ASM可以方便地插入切面代码,实现动态织入。 3. **ASM API** - **ClassVisitor**:这是ASM的...

    浅谈C语言数据与内存分配空间和地址的联系

    基于给定文件的信息,本文将深入探讨C语言中数据与内存分配空间及地址之间的关联,并通过对几种典型数据类型的分析帮助读者更好地理解这一概念。 ### 一、基础数据类型 C语言的基础数据类型主要包括整型(int)、...

    cpp-IKOS基于抽象解释理论的CC静态分析器

    静态分析是一种不运行程序就能检查其潜在问题的方法,它通过解析源代码或字节码来实现这一目标。 抽象解释是一种形式验证方法,由Cousot兄弟在1977年提出。它的核心思想是将程序的状态空间进行抽象,以减少分析的...

    Java虚拟机

    - **指令集**:JVM有一套类似于微处理器的字节码指令集,这些指令由Java编译器编译成字节码,然后在JVM上解释执行。 - **寄存器**:JVM拥有虚拟寄存器,用于存储中间计算结果。 - **栈**:每个线程都有一个独立的...

    JAVA内存分配

    - 方法信息:存储了类中声明的每一个方法的信息(名称、返回类型、参数类型、修饰符、方法的字节码和异常表)。 - 静态变量:类中的静态变量。 - 到类`ClassLoader`的引用:指向装载该类的类装载器的引用。 - 到...

    易语言汇编读写字节集内存源码

    字节集是易语言中的一种数据类型,它可以用来存储任意字节序列,类似于其他语言中的字节数组或字节流。在内存操作中,字节集可以用来读取或写入内存块,从而实现数据的传输、修改或者分析。 在描述中提到的“@woxl...

    易语言源码变量和数组的编译原理易语言源码.rar

    最后,编译器生成机器码或中间代码(如字节码),这取决于易语言编译器的设置。如果生成的是机器码,那么程序可以直接由CPU执行;如果是字节码,可能还需要虚拟机来解释执行。无论哪种情况,变量和数组的内存管理、...

    lua-5.3.4源码

    2. 字节码:源代码经过编译器转换成的中间表示,VM直接执行字节码,而非解析源代码,提高了运行速度。 三、编译器与语法结构 1. Lua的词法分析器(Lexer):将源代码分解为标记,如标识符、关键字、数字等。 2. ...

    JVM与性能优化--知识点整理.pdf

    JVM是Java程序运行的平台,它负责解释执行字节码,并为Java应用程序提供了一个跨平台的运行环境。了解JVM的内存区域划分是进行性能优化的基础。 一、JVM内存区域划分 1. **程序计数器**:每个线程都有自己的程序...

    Java语言的程序漏洞分析技术研究.zip

    1. 静态分析:这种方法在不执行代码的情况下分析程序,通过解析字节码、AST(抽象语法树)等方式查找潜在的漏洞模式。例如,使用工具如FindBugs、PMD和Checkstyle进行代码审查。 2. 动态分析:动态分析是在运行时...

    深入Java核心 Java内存分配原理精讲

    2. **数组创建**:当创建数组时,也会先在内存中分配足够的空间,然后根据数组类型和长度进行初始化。 3. **静态变量**:在类加载阶段就已经分配了内存,存储在方法区中的常量池内。 #### 五、内存溢出与内存泄漏 ...

    jvm虚拟机原理,愿和大家一起学习java

    Java虚拟机(JVM)是Java程序运行的核心,它是一个抽象的计算机系统,负责解析和执行Java字节码。在深入探讨JVM之前,我们先理解它的基本概念和功能。 JVM是Java平台的一部分,其主要任务是为Java应用程序提供一个...

    精准回归Java基础技术概述

    为了精准回归测试Java代码,开发者们需要深入了解Java的抽象语法树(AST)、字节码技术以及ASM框架。 首先,我们来探讨AST,即抽象语法树。在Java中,AST是一种用于表示源代码语法结构的树状模型。它将源代码转换为...

Global site tag (gtag.js) - Google Analytics