String字符串详解

String字符串详解

equals和==

​ 在java中,equals和主要用于比较两个对象,对于基本数据类型来说,主要用于值比较,而基本数据类型不能用equals比较,对于引用类型来说,如果没有重写Object里面的equals方法,那么和equals比较的都是对象的引用地址,因为Object里面的equals方法就是用实现的,String重写了equals,主要比较内容是否一样。

String里面的常见比较

public class TestString {

    public static void main(String[] args) {
      String a = "a";
      String b = "bc";
      final String c = "a";
      final String d = "bc";
      
      String str1 = "abc";
      String str2 = "abc";
      String str3 =new String("abc");
      String str4 =new String("abc");
      String str5 = str3.intern();
      String str6 = "a"+"b"+"c";
      String str7 = a+b;
      String str8 = c+d;

      //所有的equals都是比较内容,这里都是"abc",所以全是true
      System.out.println(str1==str2); //true ,str1和str2对应字符串常量池中同一个常量,
        所以地址相同  (1System.out.println(str1==str3); //false,新new的对象,和常量池不一样  (2)
      System.out.println(str1==str5); //true,intern会尝试把该字符串添加到常量池,如果常量池存在,则直接返回地址,显然存在 (3)
      System.out.println(str1==str6); //true,拼接后在常量池中和str1是一个常量 (4)
      System.out.println(str1==str7); //false,a+b变量拼接会调用StringBuilder拼接,StringBuilder的toString方法会重新new一个字符串 (5)
      System.out.println(str1==str8); //true,和(4)一样
      System.out.println("===================");
      System.out.println(str1.equals(str2)); //true 
      System.out.println(str1.equals(str3)); //true
      System.out.println(str1.equals(str5)); //true
      System.out.println(str1.equals(str6)); //true
      System.out.println(str1.equals(str7)); //true
      System.out.println(str1.equals(str8)); //true
      System.out.println("===================");
      System.out.println(str3==str4); //false //str3和str4和str7都是new出来的,str5和str6和str8都是对应常量池中同一个地址,所以都是false  (6)
      System.out.println(str3==str5); //false
      System.out.println(str3==str6); //false
      System.out.println(str3==str7); //false
      System.out.println(str3==str8); //false
      System.out.println("===================");
      System.out.println(str3.equals(str4)); //true
      System.out.println(str3.equals(str5)); //true
      System.out.println(str3.equals(str6)); //true
      System.out.println(str3.equals(str7)); //true
      System.out.println(str3.equals(str8)); //true
      System.out.println("===================");
      System.out.println(str5==str6); //true
      System.out.println(str5==str7); //false //同理(6)
      System.out.println(str5==str8); //true
      System.out.println("===================");
      System.out.println(str5.equals(str6)); //true
      System.out.println(str5.equals(str7)); //true
      System.out.println(str5.equals(str8)); //true

    }
}

image-20201022210651134

创建几个对象问题

String str1 = "abc"会创建几个对象

​ 如果常量池里面没有abc,则去创建一个abc对象,总共1个

String str3 =new String(“abc”)会创建几个对象

​ 首先会去堆区创建一个对象,如果常量池里面没有abc,则再去常量池里面创建一个abc对象,总共2个

String str6 = “a”+"b"会创建几个对象

​ 首先会去堆区创建一个StringBuilder对象,拼接后会调用toString方法重新new一个字符串 ,这个字符串不会把值添加到常量池里面,所以总共是两个对象。

String str6 =new String(“abc”)+new String(“efd”)会创建几个对象

​ 首先会去堆区创建一个StringBuilder对象,而new String(“XXX”)会创建2个对象,最后toString方法重新创建一个对象,所以总共创建6个对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值