两种情况:
第一种:
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] 没有变