黑马程序员技术交流社区

标题: 基础加强中的问题 [打印本页]

作者: 张榆    时间: 2012-9-25 12:56
标题: 基础加强中的问题
在张孝祥老师的高新技术反射里面,里面有一个题将所有String类型中的值中所有的'b'改为'a',说到str.getClass()和String.class是同一个字节码文件,最好用==,而不用.equals(),为什么最好用==?好在什么地方呢?
作者: 夏天    时间: 2012-9-25 13:00
本帖最后由 夏诗瑶 于 2012-9-25 13:16 编辑

判断是不是同一个对象。 而不是判断内容是不是相同。其实可以理解为 == 的判断 包含了equals。

作者: 张榆    时间: 2012-9-25 13:02
夏诗瑶 发表于 2012-9-25 13:00
我是这么理解的: 判断是不是同一个对象。 而不是判断内容是不是相同。其实可以理解为 == 的判断 包含了equ ...

Object类中的equals方法不就是用来判断对象相同么
作者: 宁振庄    时间: 2012-9-25 13:03
本帖最后由 宁振庄 于 2012-9-25 13:04 编辑

==是指引用地址指向的同一个对象,equals一般用于两个对象的值比较,而非引用比较

str.getClass()和String.class是同一个字节码文件,那意思就是指向同一个对象,所以用“==”吧。
作者: 张榆    时间: 2012-9-25 13:11
宁振庄 发表于 2012-9-25 13:03
==是指引用地址指向的同一个对象,equals一般用于两个对象的值比较,而非引用比较

str.getClass()和String ...

C:\Users\Elm\Desktop
作者: 王海宇    时间: 2012-9-25 13:13
张榆 发表于 2012-9-25 13:02
Object类中的equals方法不就是用来判断对象相同么

Object类的equals()方法确实就是==的意思,但是其他类就不一定是这样了,很多类的equals()方法的实现都是:先用==判断是不是同一个对象,是的话就返回true,否则的话继续判断两个对象里面的属性是否一样,一样的话返回true,否则再返回false。既然都能是比较是不是同一份字节码,用==来比较,程序的开销要比用equals()来比较小很多,那当然用==比较好了
作者: 张榆    时间: 2012-9-25 13:14
张榆 发表于 2012-9-25 13:11

这上面就是说equals判断对象的啊

[OYDDOP8DA)T~$IB6VXB0JB.jpg (9.81 KB, 下载次数: 25)

[OYDDOP8DA)T~$IB6VXB0JB.jpg

作者: 夏天    时间: 2012-9-25 13:14
张榆 发表于 2012-9-25 13:02
Object类中的equals方法不就是用来判断对象相同么


Object中 还有一句话,其他方法最好重写此方法。 就是因为Object中的equals方法没有区分性
作者: 王海宇    时间: 2012-9-25 13:21
张榆 发表于 2012-9-25 13:14
这上面就是说equals判断对象的啊

Object类中equals()方法
  1. public boolean equals(Object obj) {
  2.         return (this == obj);
  3.     }
复制代码
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 = count;
  8.             if (n == anotherString.count) {
  9.                 char v1[] = value;
  10.                 char v2[] = anotherString.value;
  11.                 int i = offset;
  12.                 int j = anotherString.offset;
  13.                 while (n-- != 0) {
  14.                     if (v1[i++] != v2[j++])
  15.                         return false;
  16.                 }
  17.                 return true;
  18.             }
  19.         }
  20.         return false;
  21.     }
复制代码
你自己对比一下看看有什么不同,然后总结一下
作者: 张榆    时间: 2012-9-25 13:39
王海宇 发表于 2012-9-25 13:21
Object类中equals()方法String类中的equals()方法你自己对比一下看看有什么不同,然后总结一下 ...

那里用的也是Object中的equals方法,没有用到String类的equals方法
作者: 王海宇    时间: 2012-9-25 13:44
张榆 发表于 2012-9-25 13:39
那里用的也是Object中的equals方法,没有用到String类的equals方法

既然都能是比较是不是同一份字节码,用==来比较,程序的开销要比用equals()来比较小很多,那当然用==比较好了。一个是用==号比较,一个是调用方法,而且里面实际上还是用==比较,你觉得用哪个比较好呢??
作者: 夏天    时间: 2012-9-25 13:49
王海宇 发表于 2012-9-25 13:44
既然都能是比较是不是同一份字节码,用==来比较,程序的开销要比用equals()来比较小很多,那当然用==比 ...

认为这就是正解~~~~
作者: 张榆    时间: 2012-9-25 13:52
夏诗瑶 发表于 2012-9-25 13:49
认为这就是正解~~~~

这个解释得很到位,理解了
作者: 张榆    时间: 2012-9-25 13:53
王海宇 发表于 2012-9-25 13:44
既然都能是比较是不是同一份字节码,用==来比较,程序的开销要比用equals()来比较小很多,那当然用==比 ...

这个解释得很到位,理解了
作者: 张榆    时间: 2012-9-25 13:53
王海宇 发表于 2012-9-25 13:44
既然都能是比较是不是同一份字节码,用==来比较,程序的开销要比用equals()来比较小很多,那当然用==比 ...

这个解释得很到位,理解了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2