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

来源:互联网 发布:社交网络结尾视频 编辑:程序博客网 时间:2024/05/16 17:06

        在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]:truestr[1]==str[2]:truestr[0]==str[2]:truestr[0]==s:falsestr[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 0
原创粉丝点击