今天学完IT十八掌第十二天java基础课程:
学习内容:
HashMap和HashTable底层都是采用数组+链表实现的。
结合了数组的寻址快,链表增删快的特点。使用散列算法(hash算法)将元素分配到数组的元素当中,
hash分区默认16个,每个分区内存储的是链表
1,算出hashcode,进行&0xof取出后四位初步比较,确定分区
2,然后拿对象和链表中每个对象相比较,比较每个对象的hash码是否相同。
1. 判断hashcode是否相同
2.判断是否同一对象或者equals返回true
所以之前的结论:HashSet判断元素是否相同与元素是否同一对象无关有缺陷,通过查看源代码
我们知道HashSet底层是采用上述方法判定元素是否相同的。
HashSet底层调用的是HashMap,只关心map的key集合
底层是数组,存储的链表对象。
判断对象是否重复的方法在下图中。
所以这里可以进一步总结HashSet判断元素是否相同的原理。
首先,判断hashCode是否相同,否,两元素不重复;是,进一步判断
其次,两个对象是否是同一对象,是,两元素重复( | | 短路);否,进一步判断
再次,eauals方法返回true,两元素重复,返回false,两元素不重复。
判断完毕
二,Collections和Arrays工具类
遇到的问题:
1, HashMap的entrySet()和keySet()方法遍历集合。
2, 使用增强for循环迭代集合
3, Debug使用不熟练,
4,线程安全的集合Vector,HashTable使用。
5,hash算法以及HashMap原理实现。
需要帮助的问题
HashMap底层原理以及HashSet的区别与联系没听懂,对数据结构知识不熟悉
本文出自 “菜鸟成就数据之路” 博客,转载请与作者联系!
原文地址:http://liubx.blog.51cto.com/11235064/1784110