【java基础】String中的equal与==的区别

        在Object中,使用equals方法与“==”运算符完全等价,比较的都是对象的地址。不过许多类都重写了Object类的equals方法,String也包括在内,重写后的String的equals方法比较的不再是对象的地址,而是字符串的内容。

String[] str  = new String[3];
str[0] = "String";
str[1] = "String";
str[2] = "Str" + "ing";
String s = new String("String");
System.out.println("str[0]==str[1]:"+(str[0]==str[1]));
System.out.println("str[1]==str[2]:"+(str[1]==str[2]));
System.out.println("str[0]==str[2]:"+(str[0]==str[2]));
System.out.println("str[0]==s:"+(str[0]==s));
System.out.println("str[0].equals(s):"+str[0].equals(s));

        输出结果:

str[0]==str[1]:true
str[1]==str[2]:true
str[0]==str[2]:true
str[0]==s:false
str[0].equals(s):true

        这里需要引入常量池这个概念,常量池(constant pool)指的是在编译阶段被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

  1.最初,字符串常量池为空。

  2.当编译“str[0] = "String"”语句时,由于“String”是字符串常量,首先搜索字符串常量池,没找到对应字符串,则将该字符串添加到常量池中,然后str[0]指向该字符串。

  3.当编译“str[1] = "String"”语句时,搜索字符串常量池,发现所需的字符串常量“String”,所以不再在常量池中添加该字符串,而是直接使用常量池中现有的字符串,str[1]指向该字符串。

  4.当编译“str[2] = "Str" + "ing"”语句时,“Str”和“ing”在编译时结合为一个字符串常量“String”,也可以在常量池中发现,所以str[2]也指向该字符串。

  5.s通过new来创建String对象,该对象是在堆上分配的,所以结果中“==”的比较发现它和str[0]所在地址不同,所以是false;而“equals”方法则是比较s和str[0]的字符串内容,所以是true。

  需要注意的是只有常量才能自动去搜索字符串常量池,如果将

str[2] = "Str" + "ing";

修改为

String tem = "Str";
str[2] = tem + "ing";

则得出的会是false,因为tem是变量,编译时无法确定其值,所以不回去查询字符串常量池,如果一定要使用tem的话,需要在变量的声明前面加上final,将变量变为字符串常量。

  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值