String a = new String(“a“+“b“)到底产生了多少对象?

在做百度的笔试题的时候,出现了这样的一道题目
String a = new String(“a”+“b”)
问产生了多少个对象?

我们首先来复习一下一些基本的常识

1、当我们使用String a = "a",生成一个对象的时候会发生什么事情?

首先JVM会去找常量池,看看有没有“a”这个字符串常量,
	如果有得话,直接返回引用
	如果没有得话,在常量池创建一个字面量,并返回引用
		//这里只会创建一个对象,就是常量池里面的
		String a = "abc";
        String b = "abc";
        System.out.println(a==b);//true

2、当我们使用String a = new String("a")生成一个对象的时候会发生什么事情?

JVM还是会先去找常量池,看看常量池里面有没有“a”这个常量
	如果有的话,直接在堆里面创建一个对象,并返回堆里面的对象的引用
	如果没有的话,则会现在常量池里面创建一个字面量,然后再在堆里创建一个对象,并返回堆对象的引用
		//这里会创建3个对象
		//首先String a = new String("a");会去找一下常量池里面有没有“a”这个字面量
		//发现没有,就会创建一个
		//然后再再堆上创建一个对象,返回堆上对象的引用
		String a = new String("abc");
		//这里String b = new String("b");同样会去找一下常量池里面有没有“a”这个字面量
		//发现存在了,则不会创建了
		//然后还是会再堆上创建一个对象,并返回一个堆上对象的引用
        String b = new String("abc");
        System.out.println(a==b);//false
        //这里intern返回的就是常量池里面的引用
        System.out.println(a.intern()==b.intern());//true

然后我们来看一下这个例子

		//根据上面说的,a返回的是堆上的对象引用,而b返回的是常量池里的引用
		String a = new String("abc");
        String b= "abc";
        System.out.println(a==b);//false
        //这里说明两个对象的常量池引用只有一个
        System.out.println(a.intern()==b.intern());//true
        System.out.println(a.intern()==b);//true

了解了上面的种种之后,我们再来看看新的花样

		//这里创建了一个新的字面量“ab”
		String a = "ab";
		//这里创建了一个新的字面量“cd”
        String b = "cd";
        //但是这里创建了多少个对象了?
        String c = "ab"+"cd";
        //这里还会不会创建对象?
        String e = "abcd";
        //输出试试
        System.out.println(c==a+b);//false
        System.out.println(e==a+b);//false
        //说明在Strng e = "abcd"的时候,没有新的对象生成,但是其他的呢?
        System.out.println(e==c);//true

		//如果以上都不存在,我直接使用,这里又会产生多少对象?
		//我在网上看到了两种回答
		//第一种,产生了3个对象:ab cd abcd
		//第二种,产生了1个,JVM优化了,合并成“abcd”
		String a ="ab"+"cd";

那么最终问题来了:String a = new String("a"+"b")到底产生了多少对象?

  1. 网上第一种回答:四个,常量池里 a b ab,和堆上的ab
  2. 第二种回答:JVM优化了,只产生了一个对象

所以现在我很懵逼,到底产生了多少对象?有没有大佬来解答一下????

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值