==,equal,hasCode(),identifyHasCode()浅析
在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()浅析的更多相关文章
- Java String 的equals, == , hascode的区别
1.equals 和 == ==在java中是比较引用的,即在内存中的地址.而String的equals()是比较字符串的内容 http://blog.csdn.net/barryhappy/arti ...
- 浅析STM32之usbh_def.H
[温故而知新]类似文章浅析USB HID ReportDesc (HID报告描述符) 现在将en.stm32cubef1\STM32Cube_FW_F1_V1.4.0\Middlewares\ST\S ...
- java并发:jdk1.8中ConcurrentHashMap源码浅析
ConcurrentHashMap是线程安全的.可以在多线程中对ConcurrentHashMap进行操作. 在jdk1.7中,使用的是锁分段技术Segment.数据结构是数组+链表. 对比jdk1. ...
- AtomicInteger的CAS算法浅析
之前浅析过自旋锁(自旋锁浅析),我们知道它的实现原理就是CAS算法.CAS(Compare and Swap)即比较并交换,作为著名的无锁算法,它也是乐观锁的实现方式之一.JDK并发包里也有许多代码中 ...
- TiKV事务实现浅析
TiKV事务实现浅析 Percolator事务的理论基础 Percolator的来源 Percolator事务来源于Google在设计更新网页索引的系统时提出的论文Large-scale Increm ...
- 浅析 record 使用场景
浅析 record 使用场景 Intro 之前我们有介绍过 record 基本知识,record 会实现基于值的类型比较,最近遇到的几个问题觉得用 record 来解决会非常方便,分享一下 基于值的类 ...
- SQL Server on Linux 理由浅析
SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
随机推荐
- LintCode Kth Largest Element
原题链接在这里:http://www.lintcode.com/en/problem/kth-largest-element/# 在LeetCode上也有一道,采用了标准的quickSelect 方法 ...
- 基础-训练营-day1~day5
基础 大纲 变量: 声明.初始化.使用.命名 数据类型: int.long.double.boolean.char.String 运算符: 赋值.算术.关系.逻辑 ...
- Q promise的使用
虽然es6已经出现一段时间了,但是对于没有使用es6的node.js的时候,仍要解决回调金字塔,因此Q还是很有必要的.
- RFS_点击button按钮之后,RFS出现卡死的问题
[html代码] <html> <head> <title> 主窗口 </title> </head> <body> <d ...
- RouterOS 软路由开启SSH服务器
RouterOS软路由可以支持多种服务,例如SSH.FTP.Telnet.www等等 图形介面操作 命令操作 [admin@MikroTik] > ip service print ...
- iOS - (懒加载)
今天很坑爹,做界面的时候,tableview 明显做了复用了,数组也做了懒加载了,获取数据前也把数组给清空了,但是每次获取数据刷新表格的时候,数据确重复覆盖了(重复创建),后来给 cell 加了个白色 ...
- iOS添加自动更新的代码
- (void)versionUpdate{ //获得当前发布的版本 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_ ...
- 《30天自制操作系统》04_day_学习笔记
harib01a: P65 用C语言实现内存写入 实现一个往黑画面上写入东西的函数 修改了naskfunc.nas中的内容 在bootpack.c中 用write_mem8()函数将VRMA中全部写入 ...
- Socket 编程
- CMOS and BIOS
1,cmos简介. cmos是主板上一块可读写的RAM芯片.用途:主要用来保存当前系统的硬件配置和操作人员对某些参数的设定.cmos芯片是由一块纽扣电池供电.因此在关机状态内部信息也不会丢失. 2 ...