关于数组在内存中的分配问题

两种情况:

第一种:

String[] a = new String[]{"1", "2", "3"}

此时a这个引用存在栈中,数组对象存在堆中,并且是连续的一块内存区域,a的指针指向这块内存区域(此理解是否正确?)

第二种:

String a = new String("1");

String b = new String("2");

String c = new String("3");

String[] d = new String[]{a, b, c};

这种情况下,d这个对象指针信息放在栈中,那a,b,c这三个对象引用放在堆中还是栈中??????

 

第一种,a在栈中,String[]{"1", "2", "3"}在堆中

第二种,a,b,c,d对象引用在栈中,"1", "2", "3"在堆中

package ArrStrStackHeap;

public class ArrStrStackHeap {
	public static void main(String[] args) {
		String a = new String("1");

		String b = new String("2");

		String c = new String("3");

		String[] d = new String[] { a, b, c };
		System.out.println(a.hashCode());
		System.out.println(b.hashCode());
		System.out.println(c.hashCode());
		System.out.println(d.hashCode());
		System.out.println(d[0].hashCode());
		System.out.println(d[1].hashCode());
		System.out.println(d[2].hashCode());
	}
}
----
out:
49
50
51
758529971
49
50
51

 

package ArrStrStackHeap;

public class ArrStrStackHeap {
	public static void main(String[] args) {
		String a = new String("1");

		String b = new String("2");

		String c = new String("3");

		String[] d = new String[] { a, b, c };
		System.out.println(a.hashCode());
		System.out.println(b.hashCode());
		System.out.println(c.hashCode());
		System.out.println(d.hashCode());
		System.out.println(d[0].hashCode());
		System.out.println(d[1].hashCode());
		System.out.println(d[2].hashCode());
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
		System.out.println(d[0]);
		System.out.println(d[1]);
		System.out.println(d[2]);
		a = "1a";
		System.out.println(a);
		System.out.println(d[0]);
		System.out.println(a.hashCode());
		System.out.println(d[0].hashCode());
	}
}
-----
out:
49
50
51
758529971
49
50
51
1
2
3
1
2
3
1a
1
1616
49

a值变化后,a指向了堆中的新地址;d[0] 没有变