String a = new String(“a“+“b“)产生多少个对象,equals和==问题

字符串常量池

new一个对象的时候会优先在常量池去寻找这个对象是否存在,如果存在直接返回常量池的地址。

ps:如果一直new对象会导致常量池OOM

如果常量池里面没有找到该对象,那么会在堆中创建一个新的对象,并且复制一份放到常量池中。这里就创建了"2"个对象

对象创建过程

  • String a = “a”; 如果常量池中有"a",则不生成对象,直接返回常量池的引用,没有则常量池中生成
  • String a = “a”+“b”+“c”; 编译期间会编译等同于String a = “abc”,产生两个对象
  • String a = new String(“a”); =左边是不会产生对象的,=作用是将a的地址指向生成的对象。new指令执行的时候,先去看常量池中是否有该变量a,有就只生成一个对象放在堆中(复制常量池中的a),如果没有就要先生成常量池,在复制放到堆
  • String a = new String(“a”+“b”+“c”); 编译期间会编译等同于String a = new String(“abc”)

equals 和 == 问题

首先要明白 == 比较的是地址,基本数据类型比较的是值, equals比较的是值
  • ==比较的是地址, String a = “a”, b = "a"的地址是常量池中,String c = new String(“a”)的地址是堆中,所以a == b,返回true, a == c 返回false
  • equals 比较的是值,只要是值相同都返回true

喜欢就点个赞吧 w(゚Д゚)w

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值