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
分享到:
相关推荐
1. **数组是否为空:**首先需要明确的是,数组的空间一旦分配,就始终存在。即使数组中的所有元素都被设置为0,数组本身还是存在的,并且其内存空间中存储的数据仍然是可以访问的。因此,说数组为空并不准确。 2. ...
数组总字节数=sizeof(类型说明符)*数组长度=sizeof(数组名)。 9.2.2 一维数组引用 数组元素的的标识方法为数组名后跟下标。引用数组元素的一般形式为:数组名[下标]。下标只能为整型常量、整型变量、整型表达式。 ...
通过理解和分析字节码,开发者可以运用各种优化策略,如方法内联、逃逸分析、栈上分配等,以提升Java应用程序的运行效率。 8. **JVM调优**: 了解JVM的参数设置,例如内存大小调整、垃圾回收器选择、类加载相关...
1. **程序计数器(Program Counter Register)**:存储当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等都依赖程序计数器完成。 2. **本地方法栈(Native Method Stack)**:为虚拟机...
ASCII码是一种字符编码标准,它为每个可打印的英文字符分配了一个唯一的7位二进制数字,范围从0到127。在LabVIEW中,ASCII字符通常以单一的8位字节(即无符号整数1字节)表示,因为8位足以容纳ASCII码的所有值。 ...
Lua源码分析中会关注到代码翻译的过程,它包括如何将Lua代码转换为字节码,以及这些字节码如何被虚拟机加载和执行。 5. 内嵌库: Lua官方提供了内嵌库来丰富Lua语言的功能。源码分析中会探讨这些库的实现方式以及...
Java虚拟机(JVM)是Java程序运行的基础,它负责解析字节码并管理程序的内存。本资料总结主要关注JVM内存分配及其运行原理,这对于理解和优化Java应用程序的性能至关重要。 1. **JVM内存结构** JVM内存分为几个...
- **代码优化**:ASM可以用来对字节码进行优化,例如消除冗余的计算或减少内存分配。 - **AOP(面向切面编程)**:ASM可以方便地插入切面代码,实现动态织入。 3. **ASM API** - **ClassVisitor**:这是ASM的...
基于给定文件的信息,本文将深入探讨C语言中数据与内存分配空间及地址之间的关联,并通过对几种典型数据类型的分析帮助读者更好地理解这一概念。 ### 一、基础数据类型 C语言的基础数据类型主要包括整型(int)、...
静态分析是一种不运行程序就能检查其潜在问题的方法,它通过解析源代码或字节码来实现这一目标。 抽象解释是一种形式验证方法,由Cousot兄弟在1977年提出。它的核心思想是将程序的状态空间进行抽象,以减少分析的...
- **指令集**:JVM有一套类似于微处理器的字节码指令集,这些指令由Java编译器编译成字节码,然后在JVM上解释执行。 - **寄存器**:JVM拥有虚拟寄存器,用于存储中间计算结果。 - **栈**:每个线程都有一个独立的...
- 方法信息:存储了类中声明的每一个方法的信息(名称、返回类型、参数类型、修饰符、方法的字节码和异常表)。 - 静态变量:类中的静态变量。 - 到类`ClassLoader`的引用:指向装载该类的类装载器的引用。 - 到...
字节集是易语言中的一种数据类型,它可以用来存储任意字节序列,类似于其他语言中的字节数组或字节流。在内存操作中,字节集可以用来读取或写入内存块,从而实现数据的传输、修改或者分析。 在描述中提到的“@woxl...
最后,编译器生成机器码或中间代码(如字节码),这取决于易语言编译器的设置。如果生成的是机器码,那么程序可以直接由CPU执行;如果是字节码,可能还需要虚拟机来解释执行。无论哪种情况,变量和数组的内存管理、...
2. 字节码:源代码经过编译器转换成的中间表示,VM直接执行字节码,而非解析源代码,提高了运行速度。 三、编译器与语法结构 1. Lua的词法分析器(Lexer):将源代码分解为标记,如标识符、关键字、数字等。 2. ...
JVM是Java程序运行的平台,它负责解释执行字节码,并为Java应用程序提供了一个跨平台的运行环境。了解JVM的内存区域划分是进行性能优化的基础。 一、JVM内存区域划分 1. **程序计数器**:每个线程都有自己的程序...
1. 静态分析:这种方法在不执行代码的情况下分析程序,通过解析字节码、AST(抽象语法树)等方式查找潜在的漏洞模式。例如,使用工具如FindBugs、PMD和Checkstyle进行代码审查。 2. 动态分析:动态分析是在运行时...
2. **数组创建**:当创建数组时,也会先在内存中分配足够的空间,然后根据数组类型和长度进行初始化。 3. **静态变量**:在类加载阶段就已经分配了内存,存储在方法区中的常量池内。 #### 五、内存溢出与内存泄漏 ...
Java虚拟机(JVM)是Java程序运行的核心,它是一个抽象的计算机系统,负责解析和执行Java字节码。在深入探讨JVM之前,我们先理解它的基本概念和功能。 JVM是Java平台的一部分,其主要任务是为Java应用程序提供一个...
为了精准回归测试Java代码,开发者们需要深入了解Java的抽象语法树(AST)、字节码技术以及ASM框架。 首先,我们来探讨AST,即抽象语法树。在Java中,AST是一种用于表示源代码语法结构的树状模型。它将源代码转换为...