美文网首页Java
String中“==”和“equals”区别

String中“==”和“equals”区别

作者: 码农修行之路 | 来源:发表于2020-12-04 23:08 被阅读0次
    • "=="比对的是对象在内存中的位置(地址)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';
    

    最后打印内存地址和值,会发现内存地址相同,值却被修改了

    相关文章

      网友评论

        本文标题:String中“==”和“equals”区别

        本文链接:https://www.haomeiwen.com/subject/iqdwwktx.html