Object 源码分析
来源:互联网 发布:java 日志输出到文件 编辑:程序博客网 时间:2024/05/17 08:40
equals() 方法实际判断引用地址
public boolean equals(Object obj) { return (this == obj); }
hashcode() 方法和equals相同,实际判断引用地址:
这就是用hashCode()方法判断的。hashCode()是Object类的方法(equals()方法也是),所有类都间接或直接继承了Object类,因此都继承了hashCode()方法。Object类的hashCode()方法的返回值以整数形式表示一个对象的地址(未必是真正的地址,通过某种转换表示这个地址而已),即当调用HashSet的add(Object a)时,将a的hashCode值(直接说成hashCode值)与已有元素的hashCode值进行比较,如果不同则直接加进去,如果hashCode值相同则接着调用equals方法比较,如果equals方法返回真则不加,返回true则加进去。
如果不重写这两个方法,子类都将直接继承Object的两个方法,即会直接比较两个对象的地址。这在实际项目开发中意义较少的,一般情况下都会希望以内容来判断时候能加进去(即add)
HashSet->HashMap->TreeNode(红黑树)
final TreeNode<K,V> putTreeVal(HashMap<K,V> map, Node<K,V>[] tab, int h, K k, V v) { Class<?> kc = null; boolean searched = false; TreeNode<K,V> root = (parent != null) ? root() : this; for (TreeNode<K,V> p = root;;) { int dir, ph; K pk; if ((ph = p.hash) > h) dir = -1; else if (ph < h) dir = 1; else if ((pk = p.key) == k || (k != null && k.equals(pk))) //equals return p; else if ((kc == null && (kc = comparableClassFor(k)) == null) || (dir = compareComparables(kc, k, pk)) == 0) { if (!searched) { TreeNode<K,V> q, ch; searched = true; if (((ch = p.left) != null && (q = ch.find(h, k, kc)) != null) || ((ch = p.right) != null && (q = ch.find(h, k, kc)) != null)) return q; } dir = tieBreakOrder(k, pk); } TreeNode<K,V> xp = p; if ((p = (dir <= 0) ? p.left : p.right) == null) { Node<K,V> xpn = xp.next; TreeNode<K,V> x = map.newTreeNode(h, k, v, xpn); if (dir <= 0) xp.left = x; else xp.right = x; xp.next = x; x.parent = x.prev = xp; if (xpn != null) ((TreeNode<K,V>)xpn).prev = x; moveRootToFront(tab, balanceInsertion(root, x)); return null; } } }
0 0
- Object 源码分析
- Object类源码分析
- Object源码分析
- java源码分析01-Object源码分析
- Java源码分析之Object
- Java Object 类源码分析
- java中Object源码分析
- java源码分析 ---- Object类
- JDK源码分析之Object
- JDK8中的Object源码分析
- OpenStack_Swift源码分析——Object-auditor源码分析(1)
- OpenStack_Swift源码分析——Object-auditor源码分析(2)
- Swift源码分析----swift-object-auditor(1)
- Swift源码分析----swift-object-auditor(2)
- Swift源码分析----swift-object-expirer
- Swift源码分析----swift-object-updater
- Swift源码分析----swift-object-info
- Swift源码分析----swift-object-replicator(1)
- DataTables错误: requested unknown parameter
- MySQL添加用户、删除用户与授权
- MySQL与MongoDB的操作对比
- WEB前端开发人员须知的常见浏览器兼容问题及解决技巧
- Android检验应用是否获取某项权限
- Object 源码分析
- Java中split的用法
- python3.4+django1.9+mysql5.6环境之hello world
- 自定义控件:滚动的TextView跑马灯
- Elasticsearch - 理解字段分析过程(_analyze与_explain)
- Linux下gcc 优化等级的介绍
- 升级10.11后使用CocoaPod出现-bash: pod: command not found 解决办法
- 反转字符串的单词
- 点击图片就可以完成上传功能