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

手机端网站开发流程图个人主页模板设计

手机端网站开发流程图,个人主页模板设计,WordPress投票主题系统,asp网站建设实录源码3.2、HashMap#xff08;下#xff09; 3.2.2、单线程下的HashMap的工作原理(底层逻辑)是什么#xff1f; 答#xff1a; HashMap的源码位于Java的标准库中#xff0c;你可以在java.util包中找到它。 以下是HashMap的简化源码示例#xff0c;用于说明其实现逻辑#…3.2、HashMap下 3.2.2、单线程下的HashMap的工作原理(底层逻辑)是什么 答 HashMap的源码位于Java的标准库中你可以在java.util包中找到它。 以下是HashMap的简化源码示例用于说明其实现逻辑 public class HashMapK, V {private EntryK, V[] table;private static final int DEFAULT_CAPACITY 16;private int size;public HashMap() {table new Entry[DEFAULT_CAPACITY];size 0;}public void put(K key, V value) {int index getIndex(key); //获取键的哈希值EntryK, V newEntry new Entry(key, value);if (table[index] null) {table[index] newEntry;} else {EntryK, V entry table[index];while (entry.next ! null) {if (entry.key.equals(key)) {entry.value value;return;}entry entry.next;}entry.next newEntry;}size;}public V get(K key) {int index getIndex(key);if (table[index] ! null) {EntryK, V entry table[index];while (entry ! null) {if (entry.key.equals(key)) {return entry.value;}entry entry.next;}}return null;}private int getIndex(K key) {return key.hashCode() % table.length;}private static class EntryK, V {private K key;private V value;private EntryK, V next;public Entry(K key, V value) {this.key key;this.value value;this.next null;}} } 上面的示例中HashMap使用一个Entry数组table来存储键值对。 每个Entry对象包含了键值对的信息以及一个next指针用于解决哈希冲突的链表。在put方法中首先根据键的哈希值计算出数组中的索引位置然后判断该位置是否已经有元素存在。 如果该位置为空直接存储新的Entry对象 如果该位置已经有元素存在需要通过链表遍历找到对应的键值对如果找到键相同的元素则更新值 如果链表中没有相同的键将新的Entry对象添加到链表的末尾。在get方法中也是根据键的哈希值计算出数组中的索引位置然后遍历链表找到对应的键值对。 如果找到了键相同的元素返回对应的值如果没有找到返回null。需要注意的是上面的示例只是HashMap的简化版实际的HashMap还包含了很多其他的方法和逻辑如扩容、迭代器、并发控制等。 如果你对HashMap的详细实现感兴趣你可以查阅Java标准库中HashMap的源码。3.2.3、HashMap是如何解决Hash冲突的 答 在Java中HashMap使用了链地址法chaining来解决哈希冲突。具体来说HashMap内部使用一个数组来存储键值对每个数组元素称为桶bucket。 当HashMap要存储一个键值对时它首先会通过键的hashCode()方法计算出哈希码。然后根据哈希码通过取模运算得到桶的索引位置。如果该桶为空即没有发生哈希冲突则直接将键值对存储在该桶中。如果发生了哈希冲突即两个或更多的键具有相同的哈希码那么这些键值对将以链表的形式存储在同一个桶中。 当需要从HashMap中获取某个键对应的值时HashMap首先会通过键的hashCode()方法计算哈希码然后根据哈希码找到对应的桶。接着它会遍历该桶中的链表比较每个键是否与目标键相等使用equals()方法进行比较。如果找到了相等的键则返回对应的值如果遍历完链表仍未找到相等的键则返回null。 需要注意的是当链表长度超过一定阈值默认为8时HashMap会将链表转换为红黑树。这样可以提高在大量键值对时的查找效率。当然如果链表长度小于等于6时HashMap会将红黑树转换回链表以节省内存。 总结起来HashMap通过链地址法解决了哈希冲突即将具有相同哈希码的键值对以链表的形式存储在同一个桶中通过equals方法比较键的值来找到对应的值。 3.2.4、HashMap什么时候扩容如何自动扩容 答 HashMap在插入元素时会检查当前的元素数量是否达到了负载因子load factor的阈值。负载因子是指HashMap中存储元素的比例它的默认值是0.75。当存储的元素数量超过了负载因子乘以HashMap的容量时就会触发扩容操作。 HashMap的自动扩容操作会创建一个新的更大容量的数组并将所有元素重新分配到新的数组中。这个过程涉及到重新计算每个元素在新数组中的位置并将其插入到正确的位置上。扩容操作会导致HashMap内部的散列函数重新计算以保证插入元素的均匀分布。 在扩容过程中HashMap会将原有数组中的元素一个个重新计算并插入到新数组中这个过程是逐个迁移的。具体来说扩容操作会先将原有的数组元素保存到一个临时变量中然后创建新的更大容量的数组并将每个元素重新计算并放入新数组中。这样做的好处是可以避免因为数组容量不足而频繁进行扩容操作节省了时间和空间。 自动扩容操作可以通过调用HashMap的put()方法来触发当元素数量超过容量乘以负载因子时会自动触发扩容操作。同时也可以通过显式调用HashMap的resize()方法来手动触发扩容操作。 扩展 扩容操作会涉及到重新计算每个元素在新数组中的位置并将其插入到正确的位置上。这个过程可能会比较耗时因此在应用中最好在事先知道HashMap需要保存的元素数量的情况下提前设置HashMap的初始容量以减少扩容操作的次数提高性能。 3.2.5、为什么HashMap会产生死循环 答 在Java中HashMap的死循环问题通常是由于多个线程同时对HashMap进行并发修改操作引起的。当多个线程同时修改HashMap的结构时可能会导致HashMap的内部结构不一致进而导致死循环。 在HashMap中有一个内部变量modCount用于记录HashMap结构修改的次数。当一个线程在进行迭代操作时会先保存modCount的值然后在迭代的过程中比较保存的modCount值和当前HashMap的modCount值。如果两者不一致则说明HashMap发生了结构修改迭代操作会抛出ConcurrentModificationException异常。然而如果多个线程同时对HashMap进行修改并且修改操作之间的时间非常接近可能会导致多个线程同时检查modCount值从而绕过了检查发生了死循环。 扩展 为了避免HashMap的死循环问题可以采取以下措施 使用线程安全的HashMap实现如ConcurrentHashMap。在并发修改HashMap时使用同步机制如synchronized来保证同一时间只有一个线程对HashMap进行修改。在迭代HashMap的过程中不要进行修改操作可以使用Iterator遍历并通过Iterator的remove方法删除元素。 3.2.6、HashMap和TreeMap的区别是什么 答 HashMap和TreeMap都是Map接口的实现类用于存储键值对。 区别如下 底层数据结构 HashMap使用哈希表数组链表/红黑树根据键的哈希值存储键值对不保证插入顺序TreeMap使用红黑树根据键的自然顺序或者自定义比较器对键进行排序存储。 排序特性 HashMap无序存储键值对根据键的哈希值进行存储和查找查找效率较高TreeMap按照键的自然顺序或者自定义比较器对键进行排序可以实现对键的有序访问。 性能 HashMap的插入、删除、查询等操作的时间复杂度为O(1)平均情况下具有较好的性能TreeMap的插入、删除、查询等操作的时间复杂度为O(log(n))其中n为元素个数。 使用场景 HashMap适用于无序存储对于查找操作的频繁场景如缓存、查找表等TreeMap适用于需要对键进行有序存储和检索的场景如需要按照键的顺序遍历、查找等。 扩展 根据实际需求和使用场景选择合适的数据结构。如果需要有序访问或者按照键的顺序进行操作使用TreeMap如果无需有序访问或者对性能要求较高可以选择HashMap。 3.2.7、为什么ConcurrentHashMap的key不允许为null 答 首先要了解HashMap允许键和值为null。在HashMap中null被视为一个有效的键或值并且可以被插入和检索。但是需要注意的是如果键重复那么后面插入的键值对会覆盖之前的键值对。 在Java中ConcurrentHashMap的key不允许为null的原因是为了保证数据的一致性和避免引发潜在的问题。 ConcurrentHashMap是一个线程安全的哈希表它通过将数据划分为多个段来实现并发访问的高效率。每个段都拥有一个独立的锁可以同时被多个线程访问这样就可以减少线程间的竞争。 然而如果允许key为null就会导致在查询、插入和删除等操作时出现潜在的问题。在ConcurrentHashMap中对于每个key的哈希值都会通过哈希函数计算得出一个索引用于确定该key在哪个段中存储。但如果key为null由于无法计算hash值就无法确定key应该存储在哪个段中。 另外ConcurrentHashMap的实现中使用了一些特殊的技术例如偏移量等用于提高并发性能。如果允许key为null就会引发一些复杂的问题如指针偏移计算错误等可能导致数据的不一致性和线程安全性问题。 因此为了保证ConcurrentHashMap的正确性和一致性不允许key为null。如果需要存储null值可以将null作为value存储或者使用其他的数据结构来代替ConcurrentHashMap。 3.2.8、谈谈你对ConcurrentHashMap底层实现原理的理解 答 ConcurrentHashMap是Java中用于高并发环境下线程安全的哈希表实现。它的底层实现原理主要涉及了以下几个方面 分段锁ConcurrentHashMap将整个哈希表分成了一系列的小段(segment)每个段都有自己的锁。这种分段的设计使得多个线程可以同时访问不同的段从而提高了并发性能。因此在读操作时只需要锁住特定的段而不是整个哈希表。这样就允许了多个线程同时读取不同的段提高了并发性能。而对于写操作需要锁住对应的段保证数据一致性。 CAS操作ConcurrentHashMap使用了CASCompare and Swap操作来实现线程安全。CAS是一种无锁的原子操作通过比较内存中的值和预期值如果相等则更新为新的值。这种机制使得ConcurrentHashMap在并发环境下能够实现高效的数据修改和更新。 链表和红黑树在ConcurrentHashMap中每个段(segment)内部是一个类似于HashMap的结构使用链表来解决哈希冲突。当链表长度过长时会将链表转化为红黑树以提高查找的效率。这种设计使得ConcurrentHashMap既能在小规模数据下保持高效又能在大规模数据下提供良好的性能。 扩容ConcurrentHashMap采用了分段锁机制使得在扩容时只需要锁住正在被操作的段而其他段仍然可以继续读写。这种设计使得ConcurrentHashMap的扩容操作对于并发性能影响较小。 扩展 总结ConcurrentHashMap是通过分段锁、CAS操作、链表和红黑树等技术来实现线程安全和高并发的特性。这些设计和实现机制使得ConcurrentHashMap成为Java中常用的线程安全的哈希表实现。 3.2.9、ConcurrentHashMap是如何保证线程安全的 答 ConcurrentHashMap是Java中线程安全的哈希表实现它通过以下几个机制来保证线程安全 分段锁ConcurrentHashMap内部使用一个Segment数组来存储键值对每个Segment具有自己的锁。这样不同的线程可以同时访问不同的Segment从而减小了锁的粒度提高了并发性能。 读写分离ConcurrentHashMap允许多个线程同时读取数据而不会阻塞。读操作不需要获得锁只有写操作需要获得锁并且会阻塞其他的读写操作。这样可以提高并发读的性能。 CAS操作ConcurrentHashMap使用CASCompare and Swap操作来保证线程安全。CAS是一种无锁的原子操作通过比较当前值和期望值是否相等来决定是否更新。如果多个线程同时进行CAS操作只有一个线程会成功其他线程需要重试。这样可以避免使用锁带来的性能损失。
http://www.w-s-a.com/news/819307/

相关文章:

  • 彩票娱乐网站建设模块化网站开发
  • 孝感网站设计用自己的名字设计头像
  • 高明网站建设哪家好深圳vi设计公司全力设计
  • 工程技术cpu游戏优化加速软件
  • 一起做网店网站入驻收费wordpress 自定义评论样式
  • 深圳高端网站建设公司排名app软件开发sh365
  • 泰州网站整站优化惠州做网站多少钱
  • 做博客网站的php代码一建论坛建工教育网
  • 邢台网站制作费用单页营销网站后台
  • 红色网站建设的比较好的高校用vs2010做购物网站
  • 网站域名备案号查询网页设计实验报告总结模板
  • 什么软件 做短视频网站好大型论坛网站建设
  • 视频网站用什么cms网络运营与维护主要做什么
  • 设计网站主页要多少钱赣州制作网站百度
  • 什么叫高端网站定制网站收录大幅度下降
  • 汝城县网站建设公司aspx网站实例
  • 专业微网站营销diywap手机微网站内容管理系统
  • 盗版做的最好的网站温州logo设计公司
  • 网站建设 中山南充微网站建设
  • 企业网站更新什么内容免费设计软件下载
  • 夏天做哪些网站能致富做网站怎么每天更新内容
  • 个人网站的设计与开发网站建设流程中哪些部分比较重要
  • 招聘网站如何建设中国计算机网络公司排名
  • 工信部网站备案规定厦门在线制作网站
  • 商丘网站公司智联招聘手机app下载
  • 江西专业南昌网站建设中国专业的网站建设
  • 物流企业网站建设方案招标网站有哪些
  • 网站建设服务中企动力建筑工程网络进度计划备注填写范例
  • 电子商务网站开发与建设试卷php网站开发专业
  • 运城网站制作路90江苏省网站备案系统