java 中== equals hashcode源码剖析
来源:互联网 发布:python subprocess安装 编辑:程序博客网 时间:2024/06/07 04:09
1.==
java中的==操作,比较的是两个对象的内存地址。如果两个对象的内存地址一致,则返回true。否则返回false。看一个简单的测试代码:
public static void test() { String s1 = "abc"; String s2 = "abc"; String s3 = "a" + "bc"; String s4 = new String("abc"); System.out.println(s1 == s2); //返回true System.out.println(s1 == s3); //返回true System.out.println(s1 == s4); //返回false }
首先明确一点,jvm的字符串常量存在于常量池(constant pool)中。而常量池是指编译期间就被确定,并且存在已编译的.class文件中的一些数据。包括了类,接口,方法等里面的常量,自然也包括字符串常量。
s1,s2指向的都是字符串常量,在内存中的地址一致,所以相等;”a”,”bc”分别都是字符串常量,相加以后的结果自然也是字符串常量,也在常量池里,所以s1==s3;而s4是new出来的一个字符串对象,内存地址中位于堆区,所以s1!=s4。
2.equals
equals()方法在object类里就有实现。object类,大家懂的,java里的祖宗类。
public boolean equals(Object obj) { return (this == obj); }
祖宗类里的equals()方法实现相当简单粗暴,直接对两个对象做”==”比较。很显然,这要求是相当苛刻的。
在其他类中,一般都会重写equals方法。比如以String类为例:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
首先比较两个字符串是不是具有相同的内存地址。如果是,自然就是equlas了;如果不是,然后遍历String对象里的value[]字符数组。如果字符数组里每个字符都相等,那么这两个字符串也是equlas。如果有一个字符不相等,则为否。
3.hashcode
hashcode也是object祖宗类里的方法,而且这是个native方法:
public native int hashCode();
默认情况下,Object中的hashCode() 返回对象的32位jvm内存地址。如果对象不重写hashcode方法,则返回相应对象的32为JVM内存地址。
看看String类里重写的hashcode方法:
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }
h为string对象的初始hashcode值,默认为0。
由上面的代码很容易看出String类的hashcode计算方式为:
s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
Hashcode在基于key-value的集合如:HashMap、LinkedHashMap中扮演很重要的角色。此外在HashSet集合中也会运用到,使用合适的hashcode方法在检索操作时的时间复杂度最好的是 O(1).关于hashcode的计算方法,完全可以写特别复杂的paper了。
- java 中== equals hashcode源码剖析
- java源码:==,equals,hashcode
- Java 中"=="、equals、hashcode相关
- Java中== equals hashcode浅析:
- java中==、equals()、hashCode()
- 弄懂java中”==“、”equals“、”hashcode“
- Java中== equals hashcode解析
- Java中==、equals()、hashCode()区别
- 理解java中==、equals()、hashCode()
- Java中 hashcode 和 equals、equals和==
- java中的==、equals()、hashCode()源码分析
- java中的==、equals()、hashCode()源码分析
- java中的==、equals()、hashCode()源码分析
- java中的==、equals()、hashCode()源码分析
- java中的==、equals()、hashCode()源码分析
- java中的==、equals()、hashCode()源码分析
- java中的==、equals()、hashCode()源码分析
- java中的==、equals()、hashCode()源码分析
- RGB、YUY2、YUYV、YVYU、UYVY与AYUV
- Excel Sheet Column Title
- JavaEE中遗漏的10个最重要的安全控制
- Android JNI DETECTED ERROR IN APPLICATION的解决
- PHP基础——PHP数组
- java 中== equals hashcode源码剖析
- Leetcode 169. Majority Element (Easy) (cpp)
- 三大无线技术 —— WiFi、蓝牙、HomeRF(无线网卡、WPAN)
- ipconfig /flushdns 清除系统DNS缓存
- Android 事件拦截 处理
- 复习(数据结构):链表:c语言
- 如何在施工物料管理Web系统中处理大量数据并显示
- 未闻花名ED《君がくれたもの》原文+罗马音+中文
- Android 学习笔记十三 通过绝对路径得到uri