关于 equals 和 == 的一些思考
2017-06-03 20:49
169 查看
(1)双引号与 new String() 的区别
在说明 == 与 equals 区别之前,我们首先要了解一下字符串的创建,字符串的创建一般有两种方式,使用双引号创建,如下:String a = "1234";
使用 new String()方式创建,如下:
String b = new String("1234");
这两种方式都创建了一个字符串常量,从取值上来说是一样的,但是在比较的过程中却有所不同,我们先看一个实例,如下:
public static void main(String[] args) { String a = "1234"; String b = "1234"; System.out.println("a == b: " + (a == b)); System.out.println("a.equals(b): " + a.equals(b)); String c = new String("1234"); System.out.println("a == c: " + (a == c)); System.out.println("a.equals(c): " + a.equals(c)); }
打印结果:
注意上图中红色边框中的结果,这说明了 new 一个字符串的时候 JVM 会给该字符串重新分配一块儿“堆内存”,而直接使用引号重复创建同一字符串的时候,只会保存常量字符串的一个副本,这被称作“字符串驻留”,会将这个字符串存放到“方法区”中。
(2)== 与 equals 有什么区别
区别很简单,== 比较的是两个引用是否指向同一块地址空间,如果两个引用指向的地址是一致的,那么这两个字符串一定是相等的,而 equals 方法比较的是两个字符串的值是否相等,这也就说明了为什么使用构造器创造两个字符串常量的时候用 == 比较的结果是 false,因为 new 关键字会重新分配新的堆内存,导致两个字符串并不指向同一块内存空间。相关文章推荐
- 关于==和equals引发的一些思考
- 关于.NET WEB应用系统UI层的一些思考
- 关于面向构件和EOS的一些思考-软件开发和传统行业应该怎么对比
- 关于软件开发团队的一些思考
- 关于SOA的一些深度思考
- 关于 sizeof() 的一些思考
- 关于Rainbow的一些思考
- 关于C++0x内存模型和序列点的一些思考
- 关于开发环境的一些思考
- 关于程序的一些零碎思考
- 关于改善管理过程的一些思考
- [转帖] 关于sizeof()的一些思考
- 关于Blog现象的一些思考。
- 关于Blog现象的一些思考。
- 关于性开放引发的一些思考
- 关于面向构件和EOS的一些思考-xml和元数据解决了接口脆弱性问题吗?
- 开发购物网站的第一步--关于制作前的一些思考
- 关于Winnt/2k IDT的一些思考(续)
- 关于软件开发团队的一些思考
- 关于 sizeof() 的一些思考