类的内存分析,为什么要加载方法到方法区,以及如何生效等都记录过了,再记录一下,方法区中的字符串常量池。
我们在定义一个字符串变量时,JVM会先去方法区的常量池中寻找是否有以及存在的,如果有就直接将引用指向常量池中的这个字符串,如果没有就先在常量池中创建一个字符串,然后将引用指向它。
public class Test {
public static void main(String[] args) {
String a = "a";
String b = "a";
System.out.println(a== b);
}
}
上面有几个对象?
答案:有一个对象(我们只要问几个对象,就问的是堆里面的,和栈中的引用没有关系),并且a==b 为true,说明栈中的引用a,b都指向堆中的常量池对象“a”;
public class Test {
public static void main(String[] args) {
String a = "a";
String b = "a" + 1;
System.out.println(a== b);
}
}
上面有几个对象?
答案:有两个,一个为a,一个为a1,输出结果也为false,我们只要谨记 ,字符串每进行一次+操作就会产生一个新的字符串。
public class Test {
public static void main(String[] args) {
String a = "a";
for(int i=0;i<3;i++){
a += i;
}
}
}
上面有几个对象?
答案:四个对象,分别为,a,a0,a01,a012。没毛病吧?不愿意一个一个的去相加得到结果,就参考上面答案最后一句话,一定正确。
public class Test {
public static void main(String[] args) {
String a = new String("a");
for(int i=0;i<3;i++){
a += i;
}
}
}
上面有几个对象?
答案:五个。为什么? 因为new String("a")是两个动作,第一,在堆中申明一个string对象,第二在常量池中申明一个“a”字符串,并将string对象指向a。这个时候堆中就已经是2个对象,再经过三次加操作,产生三个对象,所以一共是五个对象。请看图: