继续来分享我的学习经验
我们平时写程序时经常会陷入equal和“==”这两个陷阱中,有时候要用“==”来判断就可以,有时候却只能用equal来判断,我之前做项目的时候也经常会在这里出现一些问题
接下来我们继续从内存分配的角度来看待这两个判定方式
总体来说equal和“==”都是表示相等的意思,但它们却有很大的区别,如果没有好好理解它们,就有可能在我们的编程工作中造成一些难以发现的bug
那让我们来看看如下这段程序
class EqualTest
{
public static void main(String[] args){
//声明一个s1变量,由于此处是基本类型变量以直接量的方式来创建java对象,
//对于java程序中的字符串直接量,JVM会使用一个字符串池来保存它们,即保存在一块堆内存中,
String s1 ="java";
//再声明一个s2变量,由于“java”这个字符串直接量因为上一句的s1的创建,已经存在字符串池中,
//因此会从该字符串池中取出该对象,并赋给s2,内存分配如图2.1所示
String s2 ="java";
//对于“==”判定符来说,比较的是两个变量所指向的是否是同一个对象来判断是否相等的
//因此s1和s2是同一个字符串直接量,固结果类true
System.out.println("s1==s2:"+(s1==s2));
//采用new 调用构造器来创建一个java对象,此时尽管变量s3的值为“java”,
//但是在堆内存中却是一个新创建的对象,内存分配如图2.2所示
String s3 =new String("java");
//此时s1和s3分别指向两个不同的对象,因此结果会是false
System.out.println("s1==s3:"+(s1==s3));
//此处是调用String重写过的equals()方法进行比较,该方法比较的是两个字符串所包含的字符序列是否完全相同
//因此此处的结果会是true
System.out.println("s1.equals(s3):"+s1.equals(s3));
}
}
equals()方法是java.lang.Object的方法,也就是所有的java类都会有的方法。它可以被程序员覆盖重写,通过自定义的方式来判定两个对象是否要相等,其中默认的方式与“==”相同。另外,java,lang,String类是一个特殊的类,它不可以被继承,它的equals()方法用来比较字符串的字符序列是否完全相等。
有如下程序,有重写equals()方法来判定学生对象是否相等
class Student
{
String name;
int age;
public Student(String name,int age){
this.name=name;
this.age=age;
}
//比较方法,只有姓名和年龄相等才相等
public boolean equals(Student obj){
Student student = obj;
return this.name.equals(student.name)&&this.age==student.age;
}
}
class TestStudent
{
public static void main(String[] args){
//比较学生对象
Student stu1 = new Student("joffy",21);
Student stu2 = new Student("joffy",21);
Student stu3 = new Student("joffy",22);
System.out.println("stu1.equals(stu2):"+stu1.equals(stu2));
System.out.println("stu1.equals(stu3):"+stu1.equals(stu3));
}
}
本次学习就分享到这里,如果有错的地方希望大家指正。