java学习笔记2--“equal和==的区别”

继续来分享我的学习经验

我们平时写程序时经常会陷入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));
   }
}

本次学习就分享到这里,如果有错的地方希望大家指正。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值