判断两个String类型的是s1,s2是否相等?

1.判断定义为String类型的s1和s2是否相等?

答案解释:String类代表字符串,字符串是常量,常量需要进入到内存中的方法区的常量池(进入常量池规则:如果常量池中没有这个常量,就创建一个,如果有就不再创建了)。所以s1首先会在常量池中创建“abc”对象,“abc”对象是有地址值的,“abc”对象将地址值赋给s1。当s2的时候,此时常量池中已经存在了“abc对象”,所以就不需要再创建了,s2的引用也指向了常量池中的“abc”对象,两个引用指向了同一个对象,s1和s2地址值一样,所以==号比较的时候返回true;String类重写了equals方法,比较的是属性值,s1和s2的属性值都是“abc”,所以是true

 

2.下面这句话在内存中创建了几个对象?

String s = new String("abc");

答案:2个对象。

解释:s首先会在常量池创建“abc”字符串常量,当new的时候就会在堆内存中创建一个对象,此时会把常量池中的字符串常量拷贝一份副本到给到堆内存中的对象,堆内存中的这个对象就会把地址值赋给s。常量池中对象的地址值和堆内存中对象的地址值是不一样的,s指向的是堆内存中的对象,不是常量池中的对象。此时堆内存中有一个对象,常量池中有一个对象,所以创建了2个对象。查看API,String的有参构造

 

3.判断定义为String类型的s1和s2是否相等?

答案解释:由题2可知,当执行完s1的时候,内存中会有两个对象,一个在堆内存,一个在常量池,且地址值是不一样的,s1指向的是堆内存中的对象,而当执行到s2的时候,s2指向的是常量池中的对象,地址值不一样,所以==号判断的时候返回false。s1和s2的属性值是一样的,所以equals方法比较时返回true

 

4.判断定义为String类型的s1和s2是否相等?

答案解释:Java中有常量优化机制,“a”、“b”、“c”本身就是字符串常量,所以在编译时,"a"+"b"+"c"就是“abc”字符串,所以就在常量池创建了“abc”字符串,当执行s2的时候,此时常量池中已经存在了“abc”,所以==号比较返回true。equals方法比较毫无疑问是true。

 

5.判断定义为String类型的s3和s2是否相等?

答案解释:s1+"c"中s1不是常量,所以不能有常量优化机制来分析。equals方法比较毫无疑问是true。

  1. s1和s2会分别在常量池中创创建"ab"、"abc"两个对象
  2. s3的时候是字符串串联,API解释如下图。所以s3的时候会在对内存中创建StringBuilder(或者StringBuffer)对象,通过append方法拼接成“abc”对象,此时的“abc”是StringBuilder(或者StringBuffer)类型的,通过调用toString方法转成String对象,此时s3指向的是堆内存中这个String对象
  3. s2指向的是常量池中的对象,s3指向的是堆内存中的对象,所以==号比较返回false

  • 2
    点赞
  • 6
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

zlg_javaDream

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值