String = “ 123“ 与new String(“123“)的区别

在我们面试过程中,经常会被问到String str1 = “123” 与 String str2 = new String(“123”)的区别。关于这个问题,首先要明确一点的是jvm在分配内存的时候,会有一个常量池的内存区域。

String str1 = "123"创建过程

  • 当”123“直接赋值str1的时候,JVM会在检查常量池中是否已经存在”123“,如果常量池中已经存在”123“了,那么就会把”123“在常量池中的地址赋值给str1 ;
  • 如果常量池中不存在”123“,JVM首先会在字符串常量池创建”123“对象,然后在把地址赋值给str1
  • 所以,该过程通常会创建0或1个对象。

String str2 = new String(“123”) ;

  • 同样,String str2 = new String(“123”),首先JVM检查常量池中是否存在”123“,如果常量池中存在”123“了,那么会在对内存中new 一个String的对象,然后把常量池中的”123“值存储在堆内存中,再在栈内存中创建str2并指向堆内存地址
  • 如果常量池不存在,JVM在常量池中创建”123“对象,然后在堆内存中new 出String对象,把常量池中的值赋值给堆内存,再把堆内存地址赋值给str2 ;
  • 所以,该过程通常创建1或2个对象.

代码演示

public class equalsString {
    public static  void main(String args[]){1String str1 = "中国";2String str2 = "中国" ;3String str3 = new String("中国") ;4System.out.println(str1==str2);// true5System.out.println(str2 == str3); //false
    }
}

分析过程

(1)此时常量池中第一创建”中国“对象,假设该对象地址为0X001,然后str1指向0X001 ;
(2) 常量池中已经有”中国“对象,则st2指向该对象地址0X001;
(3) 在引用类型数据中,== 比较的是地址,所以 str1== str2为true ;
(4) 常量池中已经有"中国"对象,new String(“中国”) 在堆内存中创建String对象,假设该地址为0C001,然后把常量池中的中国存放在堆内存中,在栈空间中创建str3,并指向0C001 ;
(5) str2 == str3,虽然str2与str3中的值都为中国,但是存放的地址不一样,所以str2==str3为false

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值