==、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. c#加密,java解密(3DES加密)

    c#代码 using System; using System.Security; using System.Security.Cryptography; using System.IO; using ...

  2. cassandra mongodb选择——cassandra:分布式扩展好,写性能强,以及可以预料的查询;mongodb:非事务,支持复杂查询,但是不适合报表

    Of course, like any technology MongoDB has its strengths and weaknesses. MongoDB is designed for OLT ...

  3. 20180907_网络差_天安微信token请求超时

    一.异常现象 token请求时,显示请求超时. 二.原因分析 这个异常有如下几个原因: (1)服务器没有开通  qyapi.weixin.qq.com 的外网权限 (2)服务器网络太慢 三.异常解决 ...

  4. 骨骼动画 cocos2d-x + cocoStudio <cocos2d-x : version 2.2.0>

    cocos2d-x version 2.2.0 首先,在 HelloWorldScene.cpp 中的 init()函数中 添加如下代码 (资源文件可以直接到 cocos2d-x 中获取) #incl ...

  5. IntelliJ IDEA 代码检查规范QAPlug

    转自:http://blog.csdn.net/jizi7618937/article/details/51500725 Avoid Array Loops 数组之间的拷贝使用System.array ...

  6. SQL夯实基础(五):索引的数据结构

    数据量达到十万级别以上的时候,索引的设置就显得异常重要,而如何才能更好的建立索引,需要了解索引的结构等基础知识.本文我们就来讨论索引的结构. 二叉搜索树:binary search tree 1.所有 ...

  7. UIButton 不同状态图片来回切换

    做百度地图是否显示路况信息,用到两种状态的图片 第一种方法:用Bool进行标记 声明一个 Bool _isRoad; - (void)roadBtnAction:(UIButton *)sender ...

  8. Ext.tree.Panel

    initComponent : function() { var data = null;        Ext.Ajax.request({            url : 'xxx/xx',   ...

  9. MongoDB优化之一:常见优化方法

    常用性能优化方案 创建索引 限定返回结果数 只查询使用到的字段 采用capped collection 采用Server Side Code Execution 使用Hint,强制使用索引 Hint ...

  10. Mysql 5.6 MHA (gtid) on Kylin

    mha on Kylinip hostname repl role mha role192.168.19.69 mysql1 master node192.168.19.73 mysql2 slave ...