类的比较和string的比较有什么不一样?

来源:9-9 Java 中的 Object 类 Ⅱ

游戏于此

2016-07-04 23:20

类的比较是指存储地址的比较,那两个字符串的比较是值的比较还是地址的比较?

写回答 关注

3回答

  • 木刻雪原
    2016-07-12 11:12:07
    已采纳


    首先,从你的问题就开始,你说类的比较是指存储地址的比较,这句话是不对的。

    因为,在没有重写equals之前,你使用equals方法,确实是比较地址的,这是因为equals属于object这个老祖宗(基类)内的方法,初始化后的作用就是比较地址的,但是问题来了,除非你一个new出来的对象,否则肯定都为false,因为你每new一个,出来的都是开辟一个新的空间。而java所提供的类中,有的重写了equals方法,所以最后如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在的存放地址了。

    如果当此类是你自定义的类,你可以根据需求去重写equals方法。就是课堂里的重写了一个多重比较的equals方法:先比较地址,如果一样,就返回true;再比较空对象,为false;再比较类对象,不同为false;相同了就继续比较属性值,相同为true,不同为false。

    其次,第二个问题,String的比较,这个看你的String是new出来的还是直接赋值来的:

    首先是String c=“hello”方式,这种方式,优先去“字符串缓冲池”中寻找这个“hello”字符串是否被创建了,如果有,就指向它;如果没有则开辟空间创建;也就是相当于String c=new String("hello");

    下面java提供的String类中的equals方法:

    public boolean equals(Object anObject) {
        if (this == anObject) {//地址相同返回true,如不同继续比较
            return true;
        }
        if (anObject instanceof String) { //是否是String的实例?如果是继续判断,否则返回false;
            //下面的代码就是讲anObject转换成字符数组,然后逐位比较是否相同,不同返回false,相同返回true;
            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;
    }

    这下明白了么?String也是先比较地址,但是又都不仅仅比较地址!!!

    游戏于此

    非常感谢!很详细。谢谢!

    2016-07-14 21:20:01

    共 2 条回复 >

  • 凉子若3719488
    2016-08-06 17:38:14

    String  自己已经重写了 equals方法 ,你点进去看就知道了 

  • 槐槐
    2016-07-04 23:54:09

    应该是存储地址里面内容的比较吧

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

530560 学习 · 6091 问题

查看课程

相似问题