1.数组在jvm中是如何存放的?
首先数组也是一种对象,那这个对象的引用是放在栈内存中,而真正new出来的对象是存在堆内存中;那么对象中的每个元素,也就是数组中的每个元素,这个值我个人感觉应该是存在堆内存中也有的。
public class Arrays {
public static void main(String[] args) {
int[] array = new int[3];
array[1] = 100;
array[0] = 50;
array[2] = 200;
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(array[0]);
}
}).start()
}
}
以上面这个为例,我看了下它反编译出来的字节码文件:
L0
LINENUMBER 12 L0
ICONST_3
NEWARRAY T_INT
ASTORE 1
L1
LINENUMBER 14 L1
ALOAD 1
ICONST_1
BIPUSH 100
IASTORE
L2
LINENUMBER 15 L2
ALOAD 1
ICONST_0
BIPUSH 50
IASTORE
L3
可以看到,这个200是属于操作数栈内存中的变量,但是最终是会存储回这个数组元素当中。另外,在新线程中也可以取出这个数组元素的值,如果只是放在栈内存中的话,线程之间并不共享,新线程也是应该取不到的。
2.关于 arraycopy方法
为什么这个要用个native方法实现呢?在我个人理解来看,就是new一个新数组,然后for循环遍历就可以了。
网友评论