equal和==的区别(原理讲解)

来源:互联网 发布:网络繁忙请稍后再试 编辑:程序博客网 时间:2024/05/19 00:10

继续来分享我的学习经验

我们平时写程序时经常会陷入equal和“==”这两个陷阱中,有时候要用“==”来判断就可以,有时候却只能用equal来判断,我之前做项目的时候也经常会在这里出现一些问题

接下来我们继续从内存分配的角度来看待这两个判定方式

总体来说equal和“==”都是表示相等的意思,但它们却有很大的区别,如果没有好好理解它们,就有可能在我们的编程工作中造成一些难以发现的bug

那让我们来看看如下这段程序

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. class EqualTest  
  2. {  
  3.     public static void main(String[] args){  
  4.     //声明一个s1变量,由于此处是基本类型变量以直接量的方式来创建java对象,  
  5.     //对于java程序中的字符串直接量,JVM会使用一个字符串池来保存它们,即保存在一块堆内存中,  
  6.     String s1 ="java";  
  7.       
  8.     //再声明一个s2变量,由于“java”这个字符串直接量因为上一句的s1的创建,已经存在字符串池中,  
  9.     //因此会从该字符串池中取出该对象,并赋给s2,内存分配如图2.1所示  
  10.     String s2 ="java";  
  11.       
  12.     //对于“==”判定符来说,比较的是两个变量所指向的是否是同一个对象来判断是否相等的  
  13.     //因此s1和s2是同一个字符串直接量,固结果类true  
  14.     System.out.println("s1==s2:"+(s1==s2));  
  15.       
  16.     //采用new 调用构造器来创建一个java对象,此时尽管变量s3的值为“java”,  
  17.     //但是在堆内存中却是一个新创建的对象,内存分配如图2.2所示  
  18.     String s3 =new String("java");  
  19.       
  20.     //此时s1和s3分别指向两个不同的对象,因此结果会是false  
  21.     System.out.println("s1==s3:"+(s1==s3));  
  22.       
  23.     //此处是调用String重写过的equals()方法进行比较,该方法比较的是两个字符串所包含的字符序列是否完全相同  
  24.     //因此此处的结果会是true  
  25.     System.out.println("s1.equals(s3):"+s1.equals(s3));  
  26.  }  
  27. }  




equals()方法是java.lang.Object的方法,也就是所有的java类都会有的方法。它可以被程序员覆盖重写,通过自定义的方式来判定两个对象是否要相等,其中默认的方式与“==”相同。另外,java,lang,String类是一个特殊的类,它不可以被继承,它的equals()方法用来比较字符串的字符序列是否完全相等。

有如下程序,有重写equals()方法来判定学生对象是否相等


[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. class Student  
  2. {  
  3.    String name;  
  4.    int age;  
  5.    public Student(String name,int age){  
  6.      this.name=name;  
  7.      this.age=age;  
  8.    }  
  9.    //比较方法,只有姓名和年龄相等才相等  
  10.    public boolean equals(Student obj){  
  11.       Student student = obj;  
  12.       return this.name.equals(student.name)&&this.age==student.age;  
  13.    }  
  14. }  
  15. class TestStudent  
  16. {  
  17.    public static void main(String[] args){  
  18.    //比较学生对象  
  19.      Student stu1 = new Student("joffy",21);  
  20.      Student stu2 = new Student("joffy",21);  
  21.      Student stu3 = new Student("joffy",22);  
  22.      System.out.println("stu1.equals(stu2):"+stu1.equals(stu2));  
  23.      System.out.println("stu1.equals(stu3):"+stu1.equals(stu3));  
  24.    }  

引用地址:http://blog.csdn.net/joffy/article/details/21423455#comments

0 0