字符串常量和new的字符串对象的区别

面试题:

String str1=“abc”;
String str2 = new String(“abc”); 创建了几个对象?
答案:
 String str1=“abc”;在常量池(位于方法区中)中创建了一个对象。将常量池中对象的引用赋给str1。
 String str2 = new String(“abc”);首先要看常量池里是否有“abc”这个字符串,如果有,则创建一个。如果没有,则创建两个:
 1)一个是常量“abc”对象的内容创建出的一个新的String对象。放在字符串常量池中(方法区中)
 2)一个是 new String 创建的一个新的对象,放在中。将堆中对象的地址赋给引用str2

场景:

 String str1 = “abc”;
 String str = new String(“abc”);
此时,String str = new String(“abc”)语句只创建了一个堆内存中的对象。

实例

    String s1 = "Hello";
    String s2 = "Hello";
    String s3 = "Hel" + "lo";
    String s4 = "Hel" + new String("lo");
    String s5 = new String("Hello");
    String s6 = s5.intern();
    String s7 = "H";
    String s8 = "ello";
    String s9 = s7 + s8;

    System.out.println(s1 == s2);  // true
    System.out.println(s1 == s3);  // true
    System.out.println(s1 == s4);  // false
    System.out.println(s1 == s9);  // false
    System.out.println(s4 == s5);  // false
    System.out.println(s1 == s6);  // true

分析:

”== “是比较地址,equals()由于String类方法重写,比较的是字符串的内容
1、s1 = = s2 很容易可以判断出来。s1 和 s2 都指向了方法区常量池中的Hello。
2、s1 = = s3 这里要注意一下,因为做+号的时候,会进行优化,自动生成Hello赋值给s3,所以也是true
3、s1 = = s4 s4是分别用了常量池中的字符串和存放对象的堆中的字符串,做+的时候会进行动态调用,最后生成的仍然是一个String对象存放在堆中
在这里插入图片描述
4、s1 = = s9 在JAVA9中,因为用的是动态调用,所以返回的是一个新的String对象(这里和s1 = = s3 区别开来)。所以s9和s4,s5这三者都不是指向同一块内存
在这里插入图片描述
5、s1 = = s6 为啥s1 和 s6地址相等呢? 归功于intern方法,这个方法首先在常量池中查找是否存在一份equal相等的字符串如果有的话就返回该字符串的引用,没有的话就将它加入到字符串常量池中,所以存在于class中的常量池并非固定不变的,可以用intern方法加入新的

String str1 = new String(“A”+“B”) ; 会创建多少个对象?
 字符串常量池:“A”,“B”,“AB” : 3个(“AB” 是通过“+”号得到的,如上述s3分析
 堆:new String(“AB”) :1个

String str2 = new String(“ABC”) + “ABC” ; 会创建多少个对象?
 字符串常量池:“ABC” : 1个
 堆:new String(“ABC”) :1个

记住:用new方法创建的对象必定都是不同的(因为在堆中开辟了不同存储区)

注:本文有参考其他博主的文章,并非原创,属于自己整理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值