关于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 版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2018-10-09 21:07  一颗茶叶蛋  阅读(235)  评论(0编辑  收藏  举报