当前位置: 首页 > news >正文

福清做网站的公司织梦网站404页面模板

福清做网站的公司,织梦网站404页面模板,电影网站建设公司,请多记几个本站域名防止失联HashSet 如何检查重复? 当你把对象加入HashSet时#xff0c;HashSet 会先计算对象的hashcode值来判断对象加入的位置#xff0c;同时也会与其他加入的对象的 hashcode 值作比较#xff0c;如果没有相符的 hashcode#xff0c;HashSet 会假设对象没有重复出现。但是如果发…HashSet 如何检查重复? 当你把对象加入HashSet时HashSet 会先计算对象的hashcode值来判断对象加入的位置同时也会与其他加入的对象的 hashcode 值作比较如果没有相符的 hashcodeHashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象这时会调用equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同HashSet 就不会让加入操作成功。 在 JDK1.8 中HashSet的add()方法只是简单的调用了HashMap的put()方法并且判断了一下返回值以确保是否有重复元素。直接看一下HashSet中的源码 // Returns: true if this set did not already contain the specified element // 返回值当 set 中没有包含 add 的元素时返回真 public boolean add(E e) {return map.put(e, PRESENT)null; } 而在HashMap的putVal()方法中也能看到如下说明 // Returns : previous value, or null if none // 返回值如果插入位置没有元素返回null否则返回上一个元素 final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) { ... } 也就是说在 JDK1.8 中实际上无论HashSet中是否已经存在了某元素HashSet都会直接插入只是会在add()方法的返回值处告诉我们插入前是否存在相同元素。 HashMap 的底层实现 JDK1.8 之前 JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashcode 经过扰动函数处理过后得到 hash 值然后通过 (n - 1) hash 判断当前元素存放的位置这里的 n 指的是数组的长度如果当前位置存在元素的话就判断该元素与要存入的元素的 hash 值以及 key 是否相同如果相同的话直接覆盖不相同就通过拉链法解决冲突。 HashMap 中的扰动函数hash 方法是用来优化哈希值的分布。通过对原始的 hashCode() 进行额外处理扰动函数可以减小由于糟糕的 hashCode() 实现导致的碰撞从而提高数据的分布均匀性。 JDK 1.8 HashMap 的 hash 方法源码: JDK 1.8 的 hash 方法 相比于 JDK 1.7 hash 方法更加简化但是原理不变。 static final int hash(Object key) {int h;// key.hashCode()返回散列值也就是hashcode// ^按位异或// :无符号右移忽略符号位空位都以0补齐return (key null) ? 0 : (h key.hashCode()) ^ (h 16);} 对比一下 JDK1.7 的 HashMap 的 hash 方法源码. static int hash(int h) {// This function ensures that hashCodes that differ only by// constant multiples at each bit position have a bounded// number of collisions (approximately 8 at default load factor).h ^ (h 20) ^ (h 12);return h ^ (h 7) ^ (h 4); } 相比于 JDK1.8 的 hash 方法 JDK 1.7 的 hash 方法的性能会稍差一点点因为毕竟扰动了 4 次。 所谓 “拉链法” 就是将链表和数组相结合。也就是说创建一个链表数组数组中每一格就是一个链表。若遇到哈希冲突则将冲突的值加到链表中即可。 JDK1.8 之后 相比于之前的版本 JDK1.8 之后在解决哈希冲突时有了较大的变化当链表长度大于阈值默认为 8将链表转换成红黑树前会判断如果当前数组的长度小于 64那么会选择先进行数组扩容而不是转换为红黑树时将链表转化为红黑树以减少搜索时间。 TreeMap、TreeSet 以及 JDK1.8 之后的 HashMap 底层都用到了红黑树。红黑树就是为了解决二叉查找树的缺陷因为二叉查找树在某些情况下会退化成一个线性结构。 我们来结合源码分析一下 HashMap 链表到红黑树的转换。 1、 putVal 方法中执行链表转红黑树的判断逻辑。 链表的长度大于 8 的时候就执行 treeifyBin 转换红黑树的逻辑。 // 遍历链表 for (int binCount 0; ; binCount) {// 遍历到链表最后一个节点if ((e p.next) null) {p.next newNode(hash, key, value, null);// 如果链表元素个数大于TREEIFY_THRESHOLD8if (binCount TREEIFY_THRESHOLD - 1) // -1 for 1st// 红黑树转换并不会直接转换成红黑树treeifyBin(tab, hash);break;}if (e.hash hash ((k e.key) key || (key ! null key.equals(k))))break;p e; } 2、treeifyBin 方法中判断是否真的转换为红黑树。 final void treeifyBin(NodeK,V[] tab, int hash) {int n, index; NodeK,V e;// 判断当前数组的长度是否小于 64if (tab null || (n tab.length) MIN_TREEIFY_CAPACITY)// 如果当前数组的长度小于 64那么会选择先进行数组扩容resize();else if ((e tab[index (n - 1) hash]) ! null) {// 否则才将列表转换为红黑树TreeNodeK,V hd null, tl null;do {TreeNodeK,V p replacementTreeNode(e, null);if (tl null)hd p;else {p.prev tl;tl.next p;}tl p;} while ((e e.next) ! null);if ((tab[index] hd) ! null)hd.treeify(tab);} } 将链表转换成红黑树前会判断如果当前数组的长度小于 64那么会选择先进行数组扩容而不是转换为红黑树。
http://www.hkea.cn/news/14582994/

相关文章:

  • 做网站需要注意h5制作开发价目表
  • 简述网站建设与维护秦皇岛海三建设怎么样
  • 百度建一个网站多少钱知名设计网站公司
  • 如何做视频网站技术代做ppt的网站
  • 做外贸英语网站wordpress 页面 分栏
  • 网站关键字优化公司襄阳网站建设xtehus
  • 广州网站建设 致茂建筑设计怎么学
  • 做网站需要哪种工程师长沙做网站备案
  • 新建的网站怎么登录软件商店怎么下载
  • 外贸箱包网站模板网站文章内容的选取
  • cms网站怎么做南昌做网络推广的
  • 嘉兴建站模板系统外贸soho建站
  • 做网站硬件wordpress微信电子书插件
  • 哪个网站做图片外链普宁做网站
  • 成都网站建设外贸建设银行无锡分行招聘网站
  • 国外风格网站做胎压的网站
  • 做网站的不足 心得邢台手机网站制作
  • 搜狗站长推送工具省级门户网站建设
  • 龙华做网站哪家便宜企业网站建设的缺点
  • 网站建设制作的标准有哪些网站你懂我意思正能量晚上在线观看不用下载免费
  • 商丘网站seo手机模板网站
  • 织梦网站怎样做防护彩票开发网站建设应该要注意哪些问题
  • joomla 网站图标邯郸专业网站建设报价
  • 江山市建设局网站常见的建站工具
  • 企业自助建站软件郑州百度快照优化排名
  • 物流公司网站方案中山网站推广服务
  • 威县做网站哪里好宁波seo网络推广外包报价
  • 中南路网站建设公司网络营销策划案例
  • vs 网站开发wordpress博客vieu
  • 女性门户网站模板大理建网站