JDK源码之解读String最终类的equals()和hashcode()方法实现原理
2017-02-07 16:30
716 查看
JDK源码之解读String最终类的equals()和hashcode()方法实现原理
最近在看JDK源码,先从简单入手,比如 String类 ,List、Map和Set接口的实现类。。。
1,equals().
“abd”.equals(“abc”)采取的是两字符串长度相等,在相等情况下,分别赋值给两字节数组,循环数组,如对应位置两数组值不相等,则return false;如都相等,则 return true. 源码如下:
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;
}
2, hashcode().
Stringstr=”ab”;
str.hashcode()==3105==(0*31+97)*31+98 //其中 97=a;98=b. a对应的ascii码=97。
把字符串分成字符数组,
用一个初始值为零的值,按公式 h=31*h+chararray[i] 在遍历该字符串时候,重复计算,最后的h值就是该字符串数组的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;
}
最近在看JDK源码,先从简单入手,比如 String类 ,List、Map和Set接口的实现类。。。
1,equals().
“abd”.equals(“abc”)采取的是两字符串长度相等,在相等情况下,分别赋值给两字节数组,循环数组,如对应位置两数组值不相等,则return false;如都相等,则 return true. 源码如下:
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;
}
2, hashcode().
Stringstr=”ab”;
str.hashcode()==3105==(0*31+97)*31+98 //其中 97=a;98=b. a对应的ascii码=97。
把字符串分成字符数组,
用一个初始值为零的值,按公式 h=31*h+chararray[i] 在遍历该字符串时候,重复计算,最后的h值就是该字符串数组的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;
}
相关文章推荐
- JDK源码之解读String最终类的equals()和hashcode()方法实现原理
- JDK源码之解读String最终类的trim()方法实现原理
- JDK源码之解读String最终类的trim()方法实现原理
- JDK源码之解读hashMap 的put和get方法的实现原理
- JDK源码之解读hashMap 的put和get方法的实现原理
- JDK动态代理实现原理(源码解读)
- String源码分析之equals和hashcode方法
- Java源码之String.equals方法的实现
- JDK源码学习之重写hashCode()和equals()方法
- JDK中String的hashCode方法的实现
- String 的hashCode源码实现原理
- jQuery源码解读:部份jQuery工具方法实现
- ID的生成策略(hibernate的id生成策略,主键类为什么需要实现序列化接口,同时还要重写hashCode()和equals()方法)
- NO8-10 实现高质量的equals方法,hashCode()方法,toString()方法
- JAVA重写equals和hashCode方法实现不定项分类统计
- 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重
- jquery源码解析:jQuery队列操作queue方法实现的原理
- String 中equals方法和hashcode方法
- java对象通用方法之覆盖equals时请遵守通用约定、覆盖equals时总要覆盖hashCode、始终要覆盖toString、考虑实现Comparable接口
- [项目bug收集整理2] Map的key,如果是非内置对象,需要自己实现hashCode和equals方法