Java中equals和==的区别,你知道吗?( 二 )

上述代码的第5行中,java.lang.String的intern()方法"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处 。但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把"abc"添加到字符串池中,然后再返回它的引用 。
四、比较两个对象的值:
代码如下:
1 package com.smyh; 23 public class ObjectDemo { 4 public static void main(String args[]){ 5 Student student1 = new Student("生命壹号",22,"成都"); 6 Student student2 = new Student("生命壹号",22,"成都");7 System.out.println(student1==student2); 8 System.out.println(student1.equals(student2)); 9 }10 }11 class Student {12 private String name;13 private int age;14 private String address;15 public Student(String name,int age,String address){16 this.name = name;17 this.age = age;18 this.address = address;19 }20 //重写Object类中的equals方法(比较两个对象的值是否相等)21 public boolean equals(Object obj){22 //为了提高效率:如果两个内存地址相等,那么一定是指向同一个对内存中的对象,就无需比较两个对象的属性值(自己跟自己比,没啥意义嘛)23 if(this==obj){24 return true;25 }26 27 //为了提供程序的健壮性28 //我先判断一下,obj是不是学生的一个对象,如果是,再做向下转型,如果不是,直接返回false 。29 //这个时候,我们要判断的是对象是否是某个类的对象?30 //记住一个格式:对象名 instanceof 类名 。表示:判断该对象是否是该类的一个对象 31 if(!(obj instanceof Student)){ 32 return false; 33 }34 35 //如果是就继续36 Student s = (Student)obj;//强制转换,即向下转型(毕竟Object类型没有具体的对象属性) 37 return this.name.equals(s.name) && this.age == s.age && this.address.equals(s.address);//判断两个对象的属性值是否相等38 }39 }上述代码中,首先判断传递进来的对象与当前对象的地址是否相等,如果相等,则肯定是同一个堆内存中的对象 。因为传递进来的参数是Object类型,所以任何对象都可以接收 。一旦接收进来,就将Object类型的对象向下转型,然后判断具体的属性值 。
运行效果:

Java中equals和==的区别,你知道吗?

文章插图
 
其实,如果是在Eclipse中做开发的话,上面重写的equals()方法其实是可以自动生成的:
Java中equals和==的区别,你知道吗?

文章插图
 
自动生成后的equals()方法如下:
1 @Override 2 public boolean equals(Object obj) { 3 if (this == obj) 4 return true; 5 if (obj == null) 6 return false; 7 if (getClass() != obj.getClass()) 8 return false; 9 Student other = (Student) obj;10 if (address == null) {11 if (other.address != null)12 return false;13 } else if (!address.equals(other.address))14 return false;15 if (age != other.age)16 return false;17 if (name == null) {18 if (other.name != null)19 return false;20 } else if (!name.equals(other.name))21 return false;22 return true;23 }可以看到:我们自己重写的equals()方法和自动生成的equals()方法,二者效果是一样的 。
欢迎工作一到五年的Java工程师朋友们加入Java技术交流群:659270626
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,redis,Kafka,MySQL,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

【Java中equals和==的区别,你知道吗?】


推荐阅读