java再复习——字符串他妈到底有几个?

类的内存分析,为什么要加载方法到方法区,以及如何生效等都记录过了,再记录一下,方法区中的字符串常量池。

我们在定义一个字符串变量时,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个对象,再经过三次加操作,产生三个对象,所以一共是五个对象。请看图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值