游戏于此
2016-07-04 23:20
类的比较是指存储地址的比较,那两个字符串的比较是值的比较还是地址的比较?
首先,从你的问题就开始,你说类的比较是指存储地址的比较,这句话是不对的。
因为,在没有重写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也是先比较地址,但是又都不仅仅比较地址!!!
String 自己已经重写了 equals方法 ,你点进去看就知道了
应该是存储地址里面内容的比较吧
Java入门第二季 升级版
530560 学习 · 6091 问题
相似问题