java数组分配内存字节码

更新时间:2023-05-31 06:12:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

与java数组有关的源代码如何转换为对应字节码

1.我们知道java里new 出来的都是存放在堆里的。 问题是我们如下情况:

int [] arr={1,2,3,4},

我查看了一下深入java 虚拟机测试了一下就没有new 直接int[] arr={1,2,3,4}也是存放在堆里的。

下面是深入java虚拟机里堆数组相关字节码的定义,看清楚了说明每句最后一句话将新数组的对象引用压入栈。(是对象引用)

而我编写了两个小例子生成字节码:

例子1:

[java] view plaincopy

1. public class TestArray {

2. public static void main(String[] args){

3. int [] arr1=new int[3];

4. }

5. }

生成的字节码文件如下:

[java] view plaincopy

1. public class TestArray extends ng.Object{

2. public TestArray();

3. Code:

4. 0: aload_0

5. 1: invokespecial #8; //Method java/lang/Object."<init>":()V

与java数组有关的源代码如何转换为对应字节码

6. 4: return

7.

8. public static void main(ng.String[]);

9. Code:

10. 0: iconst_3

11. 1: newarray int

12. 3: astore_1 13. 4: return

14. }

例子2:

[java] view plaincopy

1. public class TestArray {

2. public static void main(String[] args){

3. int [] arr1={1,2,3};

4. }

5. }

生成的字节码文件如下:

[java] 1. public class TestArray extends ng.Object{

2. public TestArray();

3. Code:

4. 0: aload_0

5. 1: invokespecial #8; //Method java/lang/Object."<init>":()V

6. 4: return

7.

8. public static void main(ng.String[]);

9. Code:

10. 0: iconst_3

11. 1: newarray int

12. 3: dup

13. 4: iconst_0

14. 5: iconst_1

15. 6: iastore //将int value 和索引index 弹出栈,赋值arr[index]=value;

16. 7: dup

17. 8: iconst_1

18. 9: iconst_2

19. 10: iastore

20. 11: dup

21. 12: iconst_2

与java数组有关的源代码如何转换为对应字节码

22. 13: iconst_3

23. 14: iastore

24. 15: astore_1 //我数组对象引用赋值给变量arr1

25. 16: return 26. } 看到了没有都是通过newarrayint生成字节码文件。 所以不管哪种方式 int [] arr1={1,2,3}; 还是int [] arr1=new int[3];数组都是在堆上,引用在栈上。 2.另外java中针对数组和对象使用不同操作码(专门为对象设计了另外的操作码)。

如对象采用如下:

3. 数组平时要注意地方:

String[] str = {"1","2","3"}与String[] str = new String[]{"1","2","3"}在内存里有什么区别? 这里的区别仅仅是代码书写上的:

String[] str = {"1","2","3"}; 这种形式叫数组初始化式(Array Initializer),只能用在声明同时赋值的情况下。

而 String[] str = new String[]{"1","2","3"} 是一般形式的赋值,=号的右边叫数组字面量

(Array Literal),数组字面量可以用在任何需要一个数组的地方(类型兼容的情况下)。如:

String[] str = {"1","2","3"}; // 正确的

String[] str = new String[]{"1","2","3"} // 也是正确的

String[] str;

str = {"1","2","3"}; // 编译错误

因为数组初始化式只能用于声明同时赋值的情况下。

改为:

String[] str;

str = new String[] {"1","2","3"}; // 正确了

又如:

与java数组有关的源代码如何转换为对应字节码

void f(String[] str) { }

f({"1","2","3"}); // 编译错误

正确的应该是:

f(new String[] {"1","2","3"});

4.对于内存方面来说,总的一条java 里数组都是存放在堆里的,而C/C++中的数组是可以在栈空间中分配。

本文来源:https://www.bwwdw.com/article/0g34.html

Top