- "=="比对的是对象在内存中的位置(地址)System.identityHashCode(str)
注意:(1). hashCode值相同,"equals"一定相等,但不一定是"=="
注意:(2). 如果"==",identityHashCode值必然相同,但是hashCode值不一定相同(就像反射修改值)
注意1中,举例说明一下:
String str1 = "aa";
String str2 = "aa";
str1 = str1.concat("bb");
str2 = str2.concat("bb");
结果:str1 == str2 --->fasle
或
str1 = str1.replace("a", "b");
str2 = str2.replace("a", "b");
结果:str1 == str2 --->fasle
解惑:为什么str1 不等等与 str2,是因为在concat 或者 replace后,引用str1 和 str2的被重新赋值,该值是通过new String(str)得到的新的对象,所以说指向的对象变啦!这也就是说原来的对象还存在堆内存没有变,只是现有的心的对象和之前的对象已经不是同一个了
- "equals"比对的是字符串序列,一位一位的进行比较,有一位不同就是false
注意:(1). "equals"为true,hashCode值一定相同
注意:(2). "equals"为true,identityHashCode值不一定相同。identityHashCode值相同,"equals"不一定为true
注意2中,举例说明一下,我们通过反射获取到String中的value字段,并改变value的属性,接着获取对象value上面的值,最后改变value所引用的数组中的字符
// 获取String类中的value字段
Field valueField = String.class.getDeclaredField("value");
// 改变value属性的访问权限
valueField.setAccessible(true);
// 获取str对象上value属性的值
Char[] value = (Char[]) valueField.get(str);
// 改变value所引用的数组中的字符
value[2] = 'hgz';
最后打印内存地址和值,会发现内存地址相同,值却被修改了
网友评论