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

网站建设计入什么费用哪里做网站优化

网站建设计入什么费用,哪里做网站优化,龙岩网站建设龙岩网站制作,网站建设详细方案模板①HashMap的工作原理 HashMap基于hashing原理#xff0c;我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时#xff0c;它调用键对象的hashCode()方法来计算hashcode#xff0c;让后找到bucket位置来储存值对象。当获取对象时#xff0c;通过键对象…①HashMap的工作原理 HashMap基于hashing原理我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时它调用键对象的hashCode()方法来计算hashcode让后找到bucket位置来储存值对象。当获取对象时通过键对象的equals()方法找到正确的键值对然后返回值对象。HashMap使用链表来解决碰撞问题当发生碰撞了对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。 当两个不同的键对象的hashcode相同时会发生什么 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。 因为HashMap的好处非常多我曾经在电子商务的应用中使用HashMap作为缓存。因为金融领域非常多的运用Java也出于性能的考虑我们会经常用到HashMap和ConcurrentHashMap。 ②HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有线程安全性同步(synchronization)以及速度。 HashMap几乎可以等价于Hashtable除了HashMap是非synchronized的并可以接受null(HashMap可以接受为null的键值(key)和值(value)而Hashtable则不行)。HashMap是非synchronized而Hashtable是synchronized这意味着Hashtable是线程安全的多个线程可以共享一个Hashtable而如果没有正确的同步的话多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap它是HashTable的替代比HashTable的扩展性更好。另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构增加或者移除元素将会抛出ConcurrentModificationException但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为要看JVM。这条同样也是Enumeration和Iterator的区别。由于Hashtable是线程安全的也是synchronized所以在单线程环境下它比HashMap要慢。如果你不需要同步只需要单一线程那么使用HashMap性能要好过Hashtable。HashMap不能保证随着时间的推移Map中的元素次序是不变的。要注意的一些重要术语 1) sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。 2) Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator然后其它的线程试图“结构上”更改集合对象将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改再调用set()方法将会抛出IllegalArgumentException异常。 3) 结构上的更改指的是删除或者插入一个元素这样会影响到map的结构。 我们能否让HashMap同步 HashMap可以通过下面的语句进行同步Map m Collections.synchronizeMap(hashMap); 结论 Hashtable和HashMap有几个主要的不同线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable而如果你使用Java 5或以上的话请使用ConcurrentHashMap吧。 ashMap和HashSet的区别是Java面试中最常被问到的问题。如果没有涉及到Collection框架以及多线程的面试可以说是不完整。而Collection框架的问题不涉及到HashSet和HashMap也可以说是不完整。HashMap和HashSet都是collection框架的一部分它们让我们能够使用对象的集合。collection框架有自己的接口和实现主要分为Set接口List接口和Queue接口。它们有各自的特点Set的集合里不允许对象有重复的值List允许有重复它对集合中的对象进行索引Queue的工作原理是FCFS算法(First Come, First Serve)。 首先让我们来看看什么是HashMap和HashSet然后再来比较它们之间的分别。 ③HashMap和HashSet的区别 HashMap和HashSet的区别是Java面试中最常被问到的问题。如果没有涉及到Collection框架以及多线程的面试可以说是不完整。而Collection框架的问题不涉及到HashSet和HashMap也可以说是不完整。HashMap和HashSet都是collection框架的一部分它们让我们能够使用对象的集合。collection框架有自己的接口和实现主要分为Set接口List接口和Queue接口。它们有各自的特点Set的集合里不允许对象有重复的值List允许有重复它对集合中的对象进行索引Queue的工作原理是FCFS算法(First Come, First Serve)。 首先让我们来看看什么是HashMap和HashSet然后再来比较它们之间的分别。 什么是HashSet HashSet实现了Set接口它不允许集合中有重复的值当我们提到HashSet时第一件事情就是在将对象存储在HashSet之前要先确保对象重写equals()和hashCode()方法这样才能比较对象的值是否相等以确保set中没有储存相等的对象。如果我们没有重写这两个方法将会使用这个方法的默认实现。 public boolean add(Object o)方法用来在Set中添加元素当元素值重复时则会立即返回false如果成功添加的话会返回true。 什么是HashMap HashMap实现了Map接口Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现HashMap和TreeMap。TreeMap保存了对象的排列次序而HashMap则不能。HashMap允许键和值为null。HashMap是非synchronized的但collection框架提供方法能保证HashMap synchronized这样多个线程同时访问HashMap时能保证只有一个线程更改Map。 public Object put(Object Key,Object value)方法用来将元素添加到map中。 HashSet和HashMap的区别 *HashMap**HashSet*HashMap实现了Map接口HashSet实现了Set接口HashMap储存键值对HashSet仅仅存储对象使用put()方法将元素放入map中使用add()方法将元素放入set中HashMap中使用键对象来计算hashcode值HashSet使用成员对象来计算hashcode值对于两个对象来说hashcode可能相同所以equals()方法用来判断对象的相等性如果两个对象不同的话那么返回falseHashMap比较快因为是使用唯一的键来获取对象HashSet较HashMap来说比较慢     ④面试题 HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap都知道哪里要用HashMap知道Hashtable和HashMap之间的区别那么为何这道面试题如此特殊呢是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中。投资银行更喜欢问这个问题甚至会要求你实现HashMap来考察你的编程能力。ConcurrentHashMap和其它同步集合的引入让这道题变得更加复杂。让我们开始探索的旅程吧 “你用过HashMap吗” “什么是HashMap你为什么用到它” 几乎每个人都会回答“是的”然后回答HashMap的一些特性譬如HashMap可以接受null键值和值而Hashtable则不能HashMap是非synchronized;HashMap很快以及HashMap储存的是键值对等等。这显示出你已经用过HashMap而且对它相当的熟悉。但是面试官来个急转直下从此刻开始问出一些刁钻的问题关于HashMap的更多基础的细节。面试官可能会问出下面的问题 “你知道HashMap的工作原理吗” “你知道HashMap的get()方法的工作原理吗” 你也许会回答“我没有详查标准的Java API你可以看看Java源代码或者Open JDK。”“我可以用Google找到答案。” 但一些面试者可能可以给出答案“HashMap是基于hashing的原理我们使用put(key, value)存储对象到HashMap中使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时我们先对键调用hashCode()方法返回的hashCode用于找到bucket位置来储存Entry对象。”这里关键点在于指出HashMap是在bucket中储存键对象和值对象作为Map.Entry。这一点有助于理解获取对象的逻辑。如果你没有意识到这一点或者错误的认为仅仅只在bucket中存储值的话你将不会回答如何从HashMap中获取对象的逻辑。这个答案相当的正确也显示出面试者确实知道hashing以及HashMap的工作原理。但是这仅仅是故事的开始当面试官加入一些Java程序员每天要碰到的实际场景的时候错误的答案频现。下个问题可能是关于HashMap中的碰撞探测(collision detection)以及碰撞的解决方法 “当两个对象的hashcode相同会发生什么” 从这里开始真正的困惑开始了一些面试者会回答因为hashcode相同所以两个对象是相等的HashMap将会抛出异常或者不会存储它们。然后面试官可能会提醒他们有equals()和hashCode()两个方法并告诉他们两个对象就算hashcode相同但是它们可能并不相等。一些面试者可能就此放弃而另外一些还能继续挺进他们回答“因为hashcode相同所以它们的bucket位置相同‘碰撞’会发生。因为HashMap使用链表存储对象这个Entry(包含有键值对的Map.Entry对象)会存储在链表中。”这个答案非常的合理虽然有很多种处理碰撞的方法这种方法是最简单的也正是HashMap的处理方法。但故事还没有完结面试官会继续问 “如果两个键的hashcode相同你如何获取值对象” 面试者会回答当我们调用get()方法HashMap会使用键对象的hashcode找到bucket位置然后获取值对象。面试官提醒他如果有两个值对象储存在同一个bucket他给出答案:将会遍历链表直到找到值对象。面试官会问因为你并没有值对象去比较你是如何确定确定找到值对象的除非面试者直到HashMap在链表中存储的是键值对否则他们不可能回答出这一题。 其中一些记得这个重要知识点的面试者会说找到bucket位置之后会调用keys.equals()方法去找到链表中正确的节点最终找到要找的值对象。完美的答案 许多情况下面试者会在这个环节中出错因为他们混淆了hashCode()和equals()方法。因为在此之前hashCode()屡屡出现而equals()方法仅仅在获取值对象的时候才出现。一些优秀的开发者会指出使用不可变的、声明作final的对象并且采用合适的equals()和hashCode()方法的话将会减少碰撞的发生提高效率。不可变性使得能够缓存不同键的hashcode这将提高整个获取对象的速度使用StringInterger这样的wrapper类作为键是非常好的选择。 如果你认为到这里已经完结了那么听到下面这个问题的时候你会大吃一惊。“如果HashMap的大小超过了负载因子(load factor)定义的容量怎么办”除非你真正知道HashMap的工作原理否则你将回答不出这道题。默认的负载因子大小为0.75也就是说当一个map填满了75%的bucket时候和其它集合类(如ArrayList等)一样将会创建原来HashMap大小的两倍的bucket数组来重新调整map的大小并将原来的对象放入新的bucket数组中。这个过程叫作rehashing因为它调用hash方法找到新的bucket位置。 如果你能够回答这道问题下面的问题来了“你了解重新调整HashMap大小存在什么问题吗”你可能回答不上来这时面试官会提醒你当多线程的情况下可能产生条件竞争(race condition)。 当重新调整HashMap大小的时候确实存在条件竞争因为如果两个线程都发现HashMap需要重新调整大小了它们会同时试着调整大小。在调整大小的过程中存储在链表中的元素的次序会反过来因为移动到新的bucket位置的时候HashMap并不会将元素放在链表的尾部而是放在头部这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了那么就死循环了。这个时候你可以质问面试官为什么这么奇怪要在多线程的环境下使用HashMap呢 热心的读者贡献了更多的关于HashMap的问题 为什么String, Interger这样的wrapper类适合作为键 String, Interger这样的wrapper类作为HashMap的键是再适合不过了而且String最为常用。因为String是不可变的也是final的而且已经重写了equals()和hashCode()方法了。其他的wrapper类也有这个特点。不可变性是必要的因为为了要计算hashCode()就要防止键值改变如果键值在放入时和获取时返回不同的hashcode的话那么就不能从HashMap中找到你想要的对象。不可变性还有其他的优点如线程安全。如果你可以仅仅通过将某个field声明成final就能保证hashCode是不变的那么请这么做吧。因为获取对象的时候要用到equals()和hashCode()方法那么键对象正确的重写这两个方法是非常重要的。如果两个不相等的对象返回不同的hashcode的话那么碰撞的几率就会小些这样就能提高HashMap的性能。我们可以使用自定义的对象作为键吗 这是前一个问题的延伸。当然你可能使用任何对象作为键只要它遵守了equals()和hashCode()方法的定义规则并且当对象插入到Map中之后将不会再改变了。如果这个自定义对象时不可变的那么它已经满足了作为键的条件因为当它创建之后就已经不能改变了。我们可以使用CocurrentHashMap来代替Hashtable吗这是另外一个很热门的面试题因为ConcurrentHashMap越来越多人用了。我们知道Hashtable是synchronized的但是ConcurrentHashMap同步性能更好因为它仅仅根据同步级别对map的一部分进行上锁。ConcurrentHashMap当然可以代替HashTable但是HashTable提供更强的线程安全性。看看这篇博客查看Hashtable和ConcurrentHashMap的区别。转载于:https://www.cnblogs.com/chendezhen/p/10670603.html
http://www.zqtcl.cn/news/757923/

相关文章:

  • 个人做网站时不要做什么样的网站百度网站排名全掉
  • 鹤岗做网站制作企业网站需要注意的事项
  • 网站建设服务器是什么意思短网址转换器
  • 红叶网站开发工作室整站优化费用
  • 温州网站建站模板建设小企业网站步骤
  • 免费企业网站我为什么电商要学网站建设
  • 建设网站员工招聘策划方案win2012 iis配置网站
  • 织梦cms 5.6网站地图图标怎么在wordpress
  • instagram wordpress北京seo学校
  • 网站优化的基本思想企业网站建设和运营
  • 网站开发电销常遇到问题怎么建立一个群
  • worldpress 建站少儿编程加盟费一般多少钱
  • 哪个公司做网站建设好九一人才网赣州招聘官网
  • 城阳区规划建设局网站哈尔滨网站建设好
  • 中小型网站建设价位无锡有哪些互联网公司
  • 网站内容收费jquery 网站框架
  • 自己建网站买玩具外贸网站如何做推广
  • 网站 配色表注册公司有什么风险
  • 网站管理员登陆后缀重庆建筑证书查询网站
  • 义乌seoseo建站外贸
  • 只做早餐的网站老网站做seo能不能重新注册
  • 门户网站开发需要多少钱百姓网网站源码
  • 网站设计要学哪些保山网站建设
  • 怎样免费设计网站建设企业网站系统源码
  • 海报设计模板网站找网络公司做网站需要注意
  • 网站开发前端后端书籍wordpress 加文章列表
  • 泰安北京网站建设商业网站的后缀一般为
  • 必须网站的访问量wordpress标题大小
  • qq怎么做放资源的网站英语seo什么意思
  • 学生心理健康网站建设论文php开源内容管理系统