做推广的的网站模板,之梦一个系统做多个网站,中国建设银行网站查行号,做外贸有效的网站远离八股文#xff0c;面试大白话#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来#xff0c;大家一起解决。 java面试题汇总-目录-持续更新中 Hashmap和hashtable存储…远离八股文面试大白话通俗且易懂 看完后试着用自己的话复述出来。有问题请指出有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来大家一起解决。 java面试题汇总-目录-持续更新中 Hashmap和hashtable存储逻辑基本相同-都是基于hash表实现的。 原理就是都在内部维护了一个数组这个数组的每个元素就是一个Bucket桶。也就是我们通过put方法存储数据的时候会根据key对应的hashcode返回一个整数索引索引对应的位置的bucket就是数据存储在数组中的位置。 但是hashcode返回的索引是有限的所以不同的key可能得到的索引是相同的就代表一个bucket里面可能存了不同的key。这就引入了链表。也就是这个数组里面的每个bucket都是一个链表。数组里面存链表链表里面存数据 比如第一个值进来后根据key返回的索引是1那么这个值就存储在下标为1的这个bucket中紧接着又进来一个key解析后返回的索引还是1,这时候就会判断下标为1的bucket中是否存在当前这个key如果存在就替换如果不存在就在链表的最后追加上这个值。 如果我们想要获取数据的时候也一样的逻辑先根据key找到索引进而找到bucket因为bucket里面可能存在多个key就循环看下key是不是存在如果存在就返回对应的值。 hashmap内部方法没有加锁所以是线程不安全的只适用于单线程的环境但是性能较快。正常情况下都是可以使用 hashtable内部方法都加有synchronized 所以线程安全但是性能也比较低下。 更推荐使用ConcurrentHashMap来代替hashtable。 因为ConcurrentHashMap引入了分段锁的概念。 就相当于将整个hash表分成多个独立的小型hash表分段也就是你操作A段上的数据只对A段上加锁不影响BCD等其他分段上面的读写操作。更适用于高并发的场景。 可以对比下hashtable他如果写数据的时候会将整个hash表全都加锁那么其他线程只能等待他写完后才能再进行读写。而ConcurrentHashMap 就很大程度上避免了这种情况。