当前位置: 代码迷 >> Java相关 >> java.lang.String里的equals()方法的源码,我看不懂,求解释!!
  详细解决方案

java.lang.String里的equals()方法的源码,我看不懂,求解释!!

热度:204   发布时间:2011-03-03 11:02:19.0
java.lang.String里的equals()方法的源码,我看不懂,求解释!!
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }
上面是源码!!
int n = count;
        if (n == anotherString.count)
count表示的是什么?
最好是从头到尾解释说明一下!!
搜索更多相关的解决方案: false  

----------------解决方案--------------------------------------------------------
提示: 作者被禁止或删除 内容自动屏蔽
2011-03-06 04:48:27
幸福的果冻

等 级:论坛游民
帖 子:9
专家分:10
注 册:2011-3-2
  得分:2 
我想  我只道 count的意思吧  你应该只道 equals()方法 是用来比较字符串是否相等吧  String s="ss";
    String a="dd";s.equals(a);count 就是a的长度了!

----------------解决方案--------------------------------------------------------
equals比较的是string的内容。而没有重写的equals方法跟“==”表达式是一样的,比较的是引用。
if (this == anObject) {
        return true;
    }
是为了比较是否是同一个引用,假如是同个引用,则返回true,否则返回false。这是为了提高速度而写的判断语句。比如:
String a = new String("adfadfsdfadsfadfasdfadfdsf");
String b = a;
因为a和b是同个引用,所以不需要去判断它的内容,就知道a==b;

if (anObject instanceof String) {
这句主要是判断是否是String的实例,如果不是String的实例,那么跟String比较肯定是不相等的。

if (n == anotherString.count) {
这个是比较两个字符串的长度,也是为了提高速度而写的。

char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
String的存储结构是一个char数组,也就是value,上面的程序就是循环比较数组的内容是否相等。
----------------解决方案--------------------------------------------------------
以下是引用付政委在2011-3-6 12:48:27的发言:

我不太懂 但是可以说点
   先问你  你知道什么时候用equals吗?
   你知道equals是做什么比较的吗?

    何必说
    String s="dd";
    String a="dd";
    要判断这两个是否相等的时候就用到equals方法了!
equals  它里面做的事情、基本就是判断堆空间里的内容是否相等!
栈,堆,静态区   懂吗?  
貌似在国外的一本教材上看到,java在编译时地对字面量进行优化,也就是这样定义s和a的话,它们是会指向同一个地址的,也就是如果这样写的话可以用s==a来判断。而如果用s = new String("dd"); a= new String("aa");则需要用到equals方法。
----------------解决方案--------------------------------------------------------
学习了,这个函数instanceof是干什么用的?还有
能解释一下这段代码吗?  int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
没看懂~~~
----------------解决方案--------------------------------------------------------
因为有些很底层的源码是看不到怎么实现的,,估计就是看到了,也会更迷茫。。。以下是猜想

int n = count;//当前字符串的count
if (n == anotherString.count) { // 如果当前字符串的字符数 == 要比较的字符数
char v1[] = value;//当前字符串的 包含的所有 字符组成的数组 value
char v2[] = anotherString.value;//要比较的字符串的 包含的所有 字符组成的数组 value

int i = offset;// 看到下面要处理 i++ 值应该是0吧  offset:通过看jdk的API文档 可以看出就是 第一个索引的意思,那么值就是0
int j = anotherString.offset;//原理同上
while (n-- != 0) {// --在右边,先执行整个表达式,再--,,    意:第一次是 当前字符串的字符数不为0,执行循环,下次就是 减1 不为0 才执行,,以后类推
     if (v1[i++] != v2[j++])//++在右边也是先执行整个表达式,再++    意:第一次是 v1[i] 和v2[j]比较,下次是 v1[i+1]和v2[j+1]比较,,以后类推
     return false;//上面 比较某个相同位置的字符 值不等时,return false

[ 本帖最后由 zongshi123 于 2011-3-28 01:51 编辑 ]
----------------解决方案--------------------------------------------------------
。。。。。。。。。。原来可以再编辑。。这,还是编辑上面的吧

----------------解决方案--------------------------------------------------------
不懂!
----------------解决方案--------------------------------------------------------
回复 6楼 六戒书生
很感谢大侠的帮助,学习了很多~~~~正在研究中...  ...
                麻烦大侠看看这个链接,也是我发的帖子,没有人知道啊~~~
                    http://bbs.bccn.net/thread-334940-1-1
----------------解决方案--------------------------------------------------------
  相关解决方案