equals()方法是Object类的方法,所有的类都集成了此方法,还有部分类重写了这个方法,我们看一下Object类中关于该方法的的源码:

  1. public boolean equals(Object obj) {
  2. return (this == obj);
  3. }

可以知道,凡事从Object中继承的equals()方法底层使用的都是==,也就是两者比较的都是地址值。
我们再来说一下String,这个类复写了equals()方法,源码如下:

  1. public boolean equals(Object anObject) {
  2. if (this == anObject) {
  3. return true;
  4. }
  5. if (anObject instanceof String) {
  6. String anotherString = (String)anObject;
  7. int n = value.length;
  8. if (n == anotherString.value.length) {
  9. char v1[] = value;
  10. char v2[] = anotherString.value;
  11. int i = 0;
  12. while (n-- != 0) {
  13. if (v1[i] != v2[i])
  14. return false;
  15. i++;
  16. }
  17. return true;
  18. }
  19. }
  20. return false;
  21. }

该方法中,首先用==比较,如果两者地址值相同,就返回true,如果地址值不相同,再判断字符串内容是否相同,如果相同,返回值也是true,我们可以做一个实验:

  1. class equalsTest{
  2. public static void main(String[] args){
  3. String a = "abc";
  4. String b = "abc";
  5. String c = new String("abc");
  6. sop(a==b);         //true
  7. sop(a.equals(b));  //true
  8. sop(a==c);         //false
  9. sop(a.equals(c));  //true
  10. }
  11. public static void sop(Object o){
  12. System.out.println(o);
  13. }
  14. }

这个实验中,变量a和b底层默认启动的享元设计模式,指向的都是“abc”这个字符串对象,所以地址值相同,而语句new String("abc")底层创建的是两个对象,所以c的地址值和a,b不同,用==判断的结果为false,但是c指向的字符串内容与a是相同的,所以用equals()判断的结果为ture。

最新文章

  1. Expert 诊断优化系列-------------针对重点语句调索引
  2. 《利用python进行数据分析》读书笔记--第八章 绘图和可视化
  3. 去空格 whitespaceAndNewlineCharacterSet和过滤字符串
  4. 用 Swift 制作一个漂亮的汉堡按钮过渡动画
  5. CSDN首页> 移动开发 直接拿来用!最火的Android开源项目(完结篇)
  6. php strtotime函数服务器和本地不相同
  7. C++_基础_类和对象
  8. 使用Docker官方的Django包【转】
  9. Android Screen Monitor使用
  10. iOS 之 NSUserDefault
  11. Hdu-2112 HDU Today (单源多点最短路——Dijsktra算法)
  12. Linux安装JDK完整步骤
  13. [CTF隐写]png中CRC检验错误的分析
  14. 自托管websocket和webapi部署云服务器域名及远程访问
  15. PHP客服聊天
  16. vector某元素是否存在、查找指定元素 、去重
  17. centos 7 安装sql 审核工具 inception + archer
  18. FZU oj 2277 Change 树状数组+dfs序
  19. [LeetCode&Python] Problem 13. Roman to Integer
  20. DS二叉树--二叉树之父子结点

热门文章

  1. 一个程序员对微信小程序的看法
  2. 理解ValueStack的基本机制
  3. IDE配置jvm参数
  4. RK3288 make otapackage 出错的问题【转】
  5. Android 6.0 RK3288 ROM编译详解+命令详解【转】
  6. URAL1099 Work Scheduling —— 一般图匹配带花树
  7. 使用Kotlin如何startActivity
  8. 【Selenium】HTML/XML/XPATH基础
  9. Linux网络协议栈(四)——链路层(2)
  10. Consistent Hashing算法