为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

正在回答

3 回答


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

因为,在没有重写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也是先比较地址,但是又都不仅仅比较地址!!!

1 回复 有任何疑惑可以回复我~
#1

木刻雪原

纯手打,望采纳~~~
2016-07-12 回复 有任何疑惑可以回复我~
#2

游戏于此 提问者

非常感谢!很详细。谢谢!
2016-07-14 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信