本文共 1786 字,大约阅读时间需要 5 分钟。
感觉说了好多次,但是总是记不住,就很尴尬。索性再写一次:
写了以下的代码:public static void main(String[] args) { String s1="abc"; String s2=new String("abc"); System.out.println(s1.equals(s2)); System.out.println(s1==s2); System.out.println(s1.hashCode()==s2.hashCode()); }
然后输出的结果是:
咋就“==”这里出错了呢。原来是这样的,
首先对于String s1=“abc” s1是引用变量,在运行时数据区中,存放在栈中,而“abc”则是存放在常量池当中,并且把对应的地址给s1,而String s2=new String(“abc”),s2也是引用变量,同理new String也是创建了一个常量池。首先对应“==”方法,有两种情况分类讨论:
1.如果是基本数据类型:byte,short,char,int,long,double,float,boolean这八种, 比较的是数据的值
2.如果是引用类型,就像上面的s1和s2,这里有个细节,如果再new String一个s3出来,和s2的双等号 也是false,而直接String一个s4的话,则是返回true了(s4我能明白,s3的话我又要硬记了吧。。。可以看一下这个)
再是equals方法,虽然说String是重写了这个方法,但是感觉大致上没有大影响。
这个是源码: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; }
差不多就是以下几步:
1.两个是不是== 如果是的话,直接return true
2.再先判断是不是String,如果不是,直接return false 3.再判断两个的长度是不是一致的,不一致 return false 4.逐个字符比较,若有不相等字符,返回false
其实也就是 判断值是不是相同的
最后再提一下 hashcode,String 重写了equals,也同样重写了hashcode。
原因在于:因为如果不重写hashcode,会出现equals相等,而hashcode不等的情况,这违反object的一个默认的散列规则 ——hashcode必须相等,euqals才可以相等,否则在hash集合中会出现问题而且而且,这两者之间还有个小联系:
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。 3、如果两个对象hashcode相等,他们不一定equals。 4、如果两个对象hashcode不相等,他们一定不equals。
(equals>hashcode的感觉哈哈哈)
以上内容参考自:
转载地址:http://lnfen.baihongyu.com/