==、equals()和hashCode()字符串测试

1、hashCode() 是根据 内容 来产生hash值的

2、System.identityHashCode() 是根据 内存地址 来产生hash值的。我们知道,new出来的String对象的内存地址是不一样的,所以hash值也不一样

代码:

public class Test {

public static void main(String[] args) {

   String a=new String("foo");

   String b=new String("foo");

  

   String c="hello";

   String d="hello";

  

   System.out.println("memory address hashcode a:"+System.identityHashCode(a));

   System.out.println("memory address hashcode a:"+System.identityHashCode(b));

   System.out.println("String hashcode a:        "+a.hashCode());

   System.out.println("String hashcode a:        "+b.hashCode());

   System.out.println("a==b:                     "+(a==b));

   System.out.println("a.equals(b):              "+a.equals(b));

  

   System.out.println("");

  

   System.out.println("memory address hashcode c:"+System.identityHashCode(c));

   System.out.println("memory address hashcode d:"+System.identityHashCode(d));

   System.out.println("String hashcode c:        "+c.hashCode());

   System.out.println("String hashcode d:        "+d.hashCode());

   System.out.println("c==d:                     "+(c==d));

   System.out.println("c.equals(d):              "+c.equals(d));

}

}

输入结果:

memory address hashcode a:8222510

memory address hashcode a:18581223

String hashcode a:        101574

String hashcode a:        101574

a==b:                     false

a.equals(b):              true

memory address hashcode c:3526198

memory address hashcode d:3526198

String hashcode c:        99162322

String hashcode d:        99162322

c==d:                     true

c.equals(d):              true





结论:

==比较的是对象的地址

equals比较的是被String类重写的对比字符串的内容值

hasCode也是被String重写,已经不是对象内存地址的hash码,因为a、b是两个完全不同的对象,也满足这条规律“equals相等的两个对象,hasCode也相等”。

System.identityHashCode是未被重写的获取对象内存地址hash码的函数,可以发现a、b的内存地址不同



c、d的比较结果全部一致,这是java的一种优化 ,它会先把"hello"这个字符串放在字符缓冲区)中,如果有出现一个String x = "hello",就直接把缓冲区中的地址赋给x,就会出现c与d指向的内存地址相同的。



So 字符串的对比跟变量的初始化方式有关,谨慎!

(内存地址hashcode与对象内容hashcode)分析== 和 equal()方法的更多相关文章

  1. 黄聪:MYSQL使服务器内存CPU占用过高问题的分析及解决方法

    方法一: 使用 show processlist 语句,查找负荷最重的 SQL 语句,优化该SQL,比如适当建立某字段的索引. 方法二: #查看慢SQL日志是否启用mysql> show var ...

  2. 深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用

    转自:http://kakajw.iteye.com/blog/935226 一.java对象的比较 等号(==): 对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例:又可以说是 ...

  3. 11.用C对32位内存地址的访问方式

    使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义 #define RAM_ADDR     (*(volatile unsigned long *)0x0000555F)      ...

  4. 理解C指针: 一个内存地址对应着一个值

    一个内存地址存着一个对应的值,这是比较容易理解的. 如果程序员必须清楚地知道某块内存存着什么内容和某个内容存在哪个内存地址里了,那他们的负担可想而知.    汇编语法对“一个内存地址存着一个对应的数” ...

  5. iOS开发系列-打印内存地址

    打印内存地址 基本数据类型 定义一个基本数据类型,会根据变量类型分配对应的内存空间.比如定义一个int类型的变量a. int a = 10; 内存如下 输入变量a在内存中内存地址 NSLog(@&qu ...

  6. hashCode竟然不是根据对象内存地址生成的?还对内存泄漏与偏向锁有影响?

    起因 起因是群里的一位童鞋突然问了这么问题: 如果重写 equals 不重写 hashcode 会有什么影响? 这个问题从上午10:45 开始陆续讨论,到下午15:39 接近尾声 (忽略这形同虚设的马 ...

  7. Java的Object.hashCode()的返回值到底是不是对象内存地址?

    关于这个问题,查阅了网上的资料,发现证明过程太繁琐,这里我用了反证法. java.lang.Object.hashCode()的返回值到底是不是对象内存地址? hashCode契约 说到这个问题,大家 ...

  8. 一个对象toString()方法如果没有被重写,那么默认调用它的父类Object的toString()方法,而Object的toString()方法是打印该对象的hashCode,一般hashCode就是此对象的内存地址

    昨天因为要从JFrame控件获取密码,注意到一个问题,那就是用toString方法得到的不一定是你想要的,如下: jPasswordField是JFrame中的密码输入框,如果用下面的方法是得不到密码 ...

  9. java 每一个对象都是根据hashCode区别的 每次返回不同的内存地址

    可以通过hashCode比较对象,hashCode如果重写的话 返回的内存地址是一样的 则不能创建对象

随机推荐

  1. javascript测试框架mocha

    node测试框架mocha 简单.灵活.有趣,mocha是一个功能丰富的javascript测试框架,运行在node和浏览器中,使异步测试变得更加简单有趣.http://mochajs.org/ 安装 ...

  2. 解决:Python爬取https站点时SNIMissingWarning和InsecurePlatformWarning

    今天想利用Requests库爬取糗事百科站点,写了一个请求,却报错了: 后来参考kinsomy的博客,在cmd中pip install pyopenssl ndg-httpsclient pyasn1 ...

  3. iostream,iostream.h差异

    1. 不加.h的是现在C++中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名.h的限制, 避免因为.h而造成的额外的处理和修改而加.h的是c语言的用法,但是在c++中也支持这种用法, ...

  4. Android Studio开发技巧

    为了android更有效率的开发,总结学习android集成开发环境(android studio1.3为例) android studio 1-打印log及配置ec快捷键 2-代码提示及移动快捷键 ...

  5. svn文件大小类型限制,提交必须加多少字的说明

    #!/bin/sh REPOS="$1" TXN="$2" #此处更改大小限制,这里是5M MAX_SIZE= #此处增加限制文件后缀名 FILTER='\.( ...

  6. React native 开发工具 VSCode

    1.VSCODE下载地址:先下载VSCode软件 2.代码提示功能: 打开 VSCode ,然后 按住键盘 command+p,然后在vscode上面输入框 输入: "ext install ...

  7. JVM_总结_03_Java发展史

    一.前言 通过上一节,我们对整个java的技术体系有了一定的了解. 这一节我们来看下Java的发展史. 二.Java发展史 1.时间线 序号 发布日期 JDK 版本 新特性 详细说明 0 1991.0 ...

  8. 微服务:Eureka配置集群环境

    一.注册中心编码 1.使用idea创建一个spring boot项目,pom如下: <?xml version="1.0" encoding="UTF-8" ...

  9. BEC translation exercise 1

    U.S. oil drillers have made major efficiency improvements with a speed that has repeatedly surprised ...

  10. codeforces C. Pearls in a Row map的应用

    C. Pearls in a Row time limit per test 2 seconds memory limit per test 256 megabytes input standard ...