在java中equals和==都是用来作比较的,可是你知道他们之间有什么区别和联系吗?

  首先,在Object类中,本质上equals和==都是一样的,如果查看源码,你会发现这里面equals的内部实现就是==;

public boolean equals(Object obj) {
return (this == obj);
}

如果是比较两个Object对象的大小,直接用==就可以了。

==

1、判断比较的两个对象是否是同一个对象,内存地址是否相同
2、比较的两个对象必须是同一类型的数据,否则编译不通过。
3、如果是数字的比较,比较的是数值是否相等:

equals

1、equals用来比较的是两个对象的内容是否相等,

2、由于所有的类都是Object类的子类,如果一个类没有对该方法进行覆盖的话,在使用该方法时会调用Object类中的方法。

  当我们用new创建一个对象的时候,会开辟一个新的地址,所以用==作比较时,回返回false。但是String重写了Object的equals方法,当创建两个相同值的String对象时,调用equals方法返回true。String类也比较特殊,它可以直接赋值产生对象,在比较两个String对象的时候,如果String对象都是直接赋值产生的,它们用==作比较的时候,就会返回true。例如:String s1 = “abc”,因为String是引用类型,s1中只是存放了地址,而值不是new出来的,被系统存放在常量池中,而不是在存放在堆中,这时候再创建一个s2=“abc”,因为同样是要放在常量池中,创建s2时发现常量池中已经存在同样的数据,直接把s2指向了该数据,所以s1和s2指向同一块地址。

String类重写的equals方法如下:

public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}

对String的验证代码如下所示:

public static void main(String[] args) {
String s1,s2,s3,s4,s5; s1=new String("we are students");
s2="we are students";
s3=new String("we are students");
s4=new String(s1);
s5 = "we are students"; System.out.println(s1.equals(s2));
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s1.equals(s4));
System.out.println(s1==s4);
System.out.println(s2==s5); } 输出结果如下所示:
true
false
false
true
false
true

如果是我们自己写的类,要按照属性比较两个对象是否相等时,需要重写equals方法,否则会直接调用Object的方法,判断两个对象的地址是否相等。

另外,"=="比"equals"的运行速度快,因为"=="只是比较引用的地址。

  

最新文章

  1. Hibernate关联映射关系
  2. 看看你的正则行不行——正则优化一般的json字符串
  3. 【GOF23设计模式】迭代器模式
  4. C# int转byte[],byte[]转int
  5. iOS初学者的AppStore上架应用"菜谱大师"开源了!
  6. JSON 之 SuperObject(3): 访问
  7. Windows Management Instrumentation 服务无法启动 解决办法
  8. 学习Windows Azure 视频集合大全
  9. Asp.Net WebApi+Microsoft.AspNet.WebApi.Core 启用CORS跨域访问
  10. linux下java调用.so文件的方法1: JNI
  11. kvm学习小计
  12. uva11636-Hello World!
  13. 循环语句--do...while
  14. 一名网工对Linux运维的一次经历
  15. day10-列表生成式
  16. CProgressCtrl进度条控件实现进度滚动效果
  17. 解决Linux下IDEA无法使用ibus输入法的问题和tip乱码
  18. Android--------从一个包中的Avtivity创建另外另外一个包的Context
  19. Oracle VM VisualBox 虚拟机创建共享文件夹。
  20. 火狐浏览器调试ajax异步页面时报错NS_ERROR_UNEXPECTER

热门文章

  1. BZOJ 5395--[Ynoi2016]谁的梦(STL&容斥)
  2. django 视图中执行原生的 sql 查询语句
  3. Python面向对象(多态)
  4. 程序猿的日常——Java基础之clone、序列化、字符串、数组
  5. [Swift实际操作]七、常见概念-(2)点CGPoint和变形CGAffineTransform的使用
  6. Centos出现-bash: unzip: command not found的解决办法
  7. Mcode的介绍
  8. 使用BeanUitls提高对象拷贝效率
  9. iOS根据图片url获取尺寸
  10. H02-启动hdfs时可能遇到的几个问题