【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,将变量变为字符串常量。
- 【java基础】String中的equal与==的区别
- java equal与==的区别
- 【Java】equal与==的区别
- "".equal(String)与Stirng.equal("")的区别
- String == 与 equal 区别
- Java基础-String的比较(==和equal)
- java中equal()与==的区别(顺便谈谈String,stringBuffer,StringBuilder)
- java中string对象的”equal“方法和“==”运算符 与 c#中的比较
- java中的==和equal的区别
- java 中的equal和==的区别
- java中 == 与 equal 的区别
- java中 == 与 equal 的区别
- Java编程语言之equal与 == 的区别
- Java中==与equal的区别
- java中 == 与 equal 的区别
- java中 == 与 equal 的区别
- java 中“==”与“equal” 的区别
- java里面==与equal的区别
- CentOS 7.0安装Mysql
- 利用缓冲区溢出越过if校验
- 把一个Color转为html里所用的颜色代码
- 20160409
- Educational Codeforces Round 11(A)思维,数学
- 【java基础】String中的equal与==的区别
- 自定义View______绘制圆盘
- [IO]——处理流
- manacher算法-最长子回文串
- 开发问题记录之Cookie
- x86汇编--(七)高仿for循环嵌套打印字符串
- Educational Codeforces Round 11(B)模拟
- KMP算法
- Win7 64b的VS2015 如何使用nmake成功编译detour express 3.0-error2202 警告被视为错误 - 没有生成“object”文件