源码一
来源:互联网 发布:淘宝五星好评 编辑:程序博客网 时间:2024/06/09 03:35
开始看java源码了,看了一点点。。。暂且记录下吧,总觉得,博客,还是要慢慢积累的
1.hashcode和equals的覆盖
object为了扩展,设计了些些非final方法,所以你可以覆盖,但是覆盖有他们自己的原则。
(1).equals覆盖需要满足:自反性,对称性,传递性和一致性。如果是a.equals(null):返回false不解释
(2).equals如果覆盖了,那必须覆盖hashcode,这是规定。因为你不覆盖,就没法让hashmap,hashset这些类正常的运作了。覆盖的话最好可以用:result=31*result+c。选用31是有原因的,一是素数,而是31*i==(i<<5)-i,性能好
(3)最好也把tostring覆盖了,这样返回会更直观美好。
下面是一些源码:
(1)Integer的equals方法:比较值。hashcode方法:return 值
public int hashCode() {
return value;
}
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
(2)String:equals方法:char v1[] = value;,然后for循环比较数组值
* hashcode方法:先看hashcode有值没,没值就数组获取,for循环: h = 31 * h + val[i];,hash=h;
* compareto:先比较两个数的字符,比较完了,就return len1-len2;
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;
}
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.Integer的toString:
toString方法写的非常好,我觉得..用数组来存,先考虑值得正负来确定数组长度(负数前面要加‘-’,所以size+1).然后除以值,来获取每一位数。但这里用了移位来代替乘法,用了乘法+移位来代替除法。经我自己测验,乘法+移位来代替除法,都计算int最大值次。速度快了8.5倍。建议自己去翻看源码,因为用到了好几个其他的数组值。只贴一部分看不懂。但这个,可以分析:
// really: r = i - (q * 100);
r = i - ((q << 6) + (q << 5) + (q << 2));
移位=64+32+4=100...
r = i - ((q << 3) + (q << 1)); // r = i-(q*10) ...
q = (i * 52429) >>> (16+3); //q=q/10
public static String toString(int i) {
if (i == Integer.MIN_VALUE)
return "-2147483648";
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(buf, true);
}
- 源码一
- quake2源码分析(一)
- jython源码一例
- Tomcat源码分析(一)
- Lua 源码分析(一)
- STL源码剖析(一)
- 源码一错误
- Jquery源码分析(一)
- TProactor源码浅析一
- Chrome源码剖析【一】
- 源码分析(一)
- live555源码阅读一
- KUIX源码分析一
- Red5源码研究一
- nginx源码阅读(一)
- Logcat源码分析(一)
- distcc源码研究一
- gSOAP 源码分析(一)
- 彻底弄懂oracle硬解析、软解析、软软解析
- 从Log4j迁移到LogBack的理由
- 请谨慎使用ioComp 控件开发
- java小小工具第二弹 画图
- android view动画类型
- 源码一
- 一个帖子学会Android开发四大组件
- jsp隐式对象
- springmvc类型转换
- 类似于qq登录时账号密码的保存
- Swift的变量和常量
- 树的子结构
- DBMS_UTILITY.GET_CPU_TIME和DBMS_UTILITY.GET_TIME
- android中使用xml里的array资源