关于Java中 == 和equals 的区别
转载自CSDN:https://blog.csdn.net/PIZHIHUI/article/details/46318833?utm_source=copy
1、首先对==和equals这两样做一个基本的认识。对于==,如果是基本数据类型,那么比较的就是其内容,如:int x=3,y=4
,那么x==y
的结果就是true。但是如果比较的是引用数据类型,那么比较的就是地址值是否相等。equals比较的是引用指向的内容是否相同。
2、先看一段程序,
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
String s3 = new String("hello");
String s4 = "hello";
System.out.println(s3 == s4);
System.out.println(s3.equals(s4));
String s5 = "hello";
String s6 = "hello";
System.out.println(s5 == s6);
System.out.println(s5.equals(s6));
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
首先还需要搞清楚String s1 = new String("hello")
和String s4 = "hello";
这两个的区别,第一个创建了两个对象,在堆内存会创建对象的一片空间,而“hello”是存储在常量池里的。第二个只有在常量池里开辟了空间,并没有在堆内存中开辟空间。明白了这个问题,接下来的问题就好解决了。
-
先分析s1和s2之间的比较,s1和s2都是通过new关键字创建出来的,他们在堆内存中创建出了两片地址空间,分别指向了s1和s2。所以==符号两边的地址不一样,所以为false。对于equals,因为创建了两个对象,虽然地址值不一样,但所指向的内容是一样的,所以equals的结果是true。
-
s3和s4之间,运用上面的解释,我们可以得出s3是创建了两个对象,s4只创建了一个对象,即在常量池里,所以地址值是不相同的,==的比较结果是false。但两个变量所指向的内容是相同的,所以equals的结果是true。
-
对于s5和s6,因为都是用直接复制创建的字符串。首先s5在常量池里开辟了空间,栈内存中的s5就指向了常量池里的hello字符串,再创建s6的时候,先会去常量池里找,看有没有一样的字符串,如果有,就不用另外开辟空间,否则,就另外开辟空间。从程序中,可看出,创建的是一样的内容,那么就不会另外开辟空间,s6也直接指向了常量池里hello。所以,随后的这个==和equals的都是true。
最终程序打印的结果是:
false
true
false
true
true
true
--------------------- 作者:小皮加油 来源:CSDN 原文:https://blog.csdn.net/PIZHIHUI/article/details/46318833?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!