concurrenthashmap

Java集合常见面试题

江枫思渺然 提交于 2020-02-12 02:36:28
适可而止,见好就收 来源主要是 牛客 的Java实习面经。下面的回答直接背就可以,需要一定的Java基础,适合春招实习的同学,但是我会在每个问题下把有助于理解的博客贴出来。如果发现有问题欢迎私聊我或留言我会在下面更新 Map 1. Map的底层结构 腾讯19年秋招 这个题乍一看没有什么思路(因为Map是个集合,当然也有可能是我记错了),所以我们可以先介绍一下Map然后转到HashMap中 Map是一种使用键值对存储的集合。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。 在整个Map系列中,AbstractMap抽象类实现了Map,SortedMap接口继承了Map。而我们常用的HashMap,HashTable,TreeMap和ConcurrentHashMap有继承了AbstractMap类。 其中,HashTable和ConcurrentHashMap是线程安全的。前者是通过synchronized实现的,后者是通过AQS实现的。其中要注意HashTable不能存空值,HashMap是线程不安全的,key可以为空。TreeMap通过二叉树算法实现有序集合,它实现了SortedMap接口 2. HashMap的原理 阿里17年实习,小米19年秋招本科,滴滴19年秋招本科,网易19年秋招本科

HashMap HashTable ConcurrentHashMap

偶尔善良 提交于 2020-02-11 14:22:20
1. Hashtable 和 HashMap (1)区别,这两个类主要有以下几方面的不同: Hashtable和HashMap都实现了Map接口,但是Hashtable的实现是基于Dictionary抽象类。 在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。 当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。 因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。 而在Hashtable中,无论是key还是value都不能为null 。 这两个类最大的不同在于: (1)Hashtable是线程安全的,它的方法是同步了的,可以直接用在多线程环境中。 (2)而HashMap则不是线程安全的。在多线程环境中,需要手动实现同步机制。 因此,在Collections类中提供了一个方法返回一个同步版本的HashMap用于多线程的环境: Java代码 public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) { return new SynchronizedMap<K,V>(m); } 该方法返回的是一个SynchronizedMap 的实例。

HashMap、HashTable、ConcurrentHashMap的区别

我的未来我决定 提交于 2020-02-11 14:18:55
一、相关概念 1、Map的概念 javadoc中对Map的解释如下: An objectthat maps keys to values . Amap cannot contain duplicatekeys; each key can map to at most one value. This interface takes the place of the Dictionary class, which was atotally abstract class rather than an interface. The Map interface provides three collection views, which allow amap's contents to be viewed as a set of keys, collection of values,or set of key-value mappings. 从上可知,Map用于存储“key-value”元素对,它将一个key映射到一个而且只能是唯一的一个value。 Map可以使用多种实现方式,HashMap的实现采用的是hash表;而TreeMap采用的是红黑树。 2、HashMap 实现了Map接口,实现了将唯一键隐射到特定值上。 允许一个NULL键和多个NULL值。非线程安全。 3、HashTable

Java回顾--集合

回眸只為那壹抹淺笑 提交于 2020-02-11 14:15:41
1、Collection接口和Collections包装类:    Collection概念: 是一个集合接口,提供了对集合对象进行基本操作的通用接口方法。   有以下结构:     |--List     |  |--LinkedList     |  |--ArrayList     |  |--Vector     |    |--stack     |--Set    Collections: 包含各种有关集合操作的静态多态方法,且该类无法实例化,相当于一个工具类。 2、HashMap、HashTable和ConcurrentHashMap:    HashMap的特点 :线程不安全,允许传入 null值,不能保存映射的顺序。由数组(默认长度为16)+链表组成,jdk1.8后,若其链表长度大于8,就会转变成红黑树。     ps:HashMap线程不安全,是因为多个对象同时对同一HashMap进行操作时,会导致脏读、数据丢失的发生。   详细参考:https://www.cnblogs.com/aspirant/p/8908399.html    HashTable: 可以理解为线程安全的HashMap,为什么是线程安全的,因为它的put、remove、get方法都被synchronized修饰,使其同步,自然是线程安全的了。    ConcurrentHashMap:

ConcurrentHashMap和HashTable的区别

℡╲_俬逩灬. 提交于 2020-02-06 05:10:51
ConcurrentHashMap和HashTable的区别 底层数据结构:ConcurrentHashMap在JDK1.7时,底层采用 分段数组+链表 形式;JDK1.8以后和HashMap一样采用 数组+链表/红黑二叉树 ,HashTable和JDK1.8以前的HashMap一样的底层数据结构: 数组+链表 ,数组是HashMap的主体,链表是为了解决哈希冲突问题; 实现线程安全方式: 1、在JDK1.7时,ConcurrentHashMap对数组进行了分端分割(Segment),每一把锁只锁容器中的一部分数据,多线程访问容器中不同数据段数据,不会发生锁竞争,提高并发访问效率;在JDK1.8时,摒弃分端分割(Segment)概念,直接采用数组+链表+红黑树的数据结构,并发控制采用synchronized和CAS操作,相当于是优化过的HashMap,JDK1.8中的Segment是简化过的属性,为了兼容旧版本; 2、HashTable(同一把锁):采用synchronized保证线程安全,效率低下;当多个线程访问同步方法时,会发生阻塞或轮询状态;当一个线程使用put()方法添加元素时,另一个线程不能使用put()方法添加元素,也不能使用get()方法,竞争会越来越激烈。 来源: CSDN 作者: 爱敲代码的程序媛 链接: https://blog.csdn.net/qq

HashMap之java.util.ConcurrentModificationException问题原因及解决办法

两盒软妹~` 提交于 2020-02-05 06:00:21
Map<Warn,Object> map = new HashMap<>(); for(Entry<Warn,Object> entry : map.entrySet()){ ... ... map.remove(entry.getKey()); ... } 报错:java.util.ConcurrentModificationException异常。 后经查询,在进行迭代时,同时对其进行remove().操作会影响迭代。原因在于: 迭代器的modCount和expectedModCount的值不一致. 没有源码照片了。如果remove()后源码会判断值不一致,然后在hashMap中抛出java.util.ConcurrentModificationException异常. 这个问题需要了解一点:HashMap不是线程安全的,ConcurrentHashMap是线程安全的。 因此,解决这个问题就有一个了简单粗暴的方法,使用ConcurrentHashMap代替HashMap。亲测可用。 另外,还有一个方法,在修改HashMap的上下文进行加锁操作。但是效率太差或者占用内存太高。ConcurrentHashMap效率感觉快赶上不同步的速度。推荐。 List和Map等集合类都存在上述问题,还请注意 -------------------- 以下为补充内容。方便以后学习。为转载文章。

HashMap与HashTable的区别

a 夏天 提交于 2020-02-04 07:58:44
(仅列出重要的) 1,Hashtable既不支持Null key也不支持Null value;   HashMap中,null可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为null。 2,Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步   HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。   虽然HashMap不是线程安全的,但是它的效率会比Hashtable要好很多。这样设计是合理的。在我们的日常使用当中,大部分时间是单线程操作的。HashMap把这部分操作解放出来了。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。       ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。 3,Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。   创建时,如果给定了容量初始值,那么Hashtable会直接使用你给定的大小,而HashMap会将其扩充为2的幂次方大小

2020年1月的最新的Java面试经历整理(一次性查缺补漏个够)

蓝咒 提交于 2020-01-22 22:50:30
前言 现在已经是2020年了,相信很多人都在准备面试,,如何拿到心仪的 Offer,进入梦寐以求的大厂,实现自己的职业理想,达到程序员的小康水平。 这篇文章主要介绍了 刘哥 一月份的几次面经,(一次性查缺补漏个够), (感谢刘哥的内容提供) 对于面试的那几家公司暂不公布,望理解。 第一家(Zookeeper+微服务+消息中间件+高并发架构设计) 一面 JVM数据存储模型,新生代、年老代的构造? java GC算法,什么时候会触发minor gc,什么时候会触发full gc? GC 可达性分析中哪些算是GC ROOT? 你熟悉的JVM调优参数,使用过哪些调优工具? Java 有什么锁类型? 描述下线程池的处理流程? 类加载机制,一个类加载到虚拟机中一共有几个步骤,这些步骤的顺序哪些是固定的,哪些是不固定的,为什么不固定? hashmap是线程不安全的,concurrenthashmap是线程安全的,怎么实现的线程安全? volatile关键字解决了什么问题,实现原理是什么? 并发容器有哪些,并发容器和同步容器的区别 二面 在工作中,SQL语句的优化和注意的事项 哪些库或者框架用到NIO Spring 都有哪几种注入方式,什么情况下用哪种,ioc实现原理 如何定位一个慢查询,一个服务有多条SQL你怎么快速定位 聚集索引和非聚集索引知道吗?什么情况用聚集索引什么情况用非聚集索引

Java 容器 - 一文详解HashMap

扶醉桌前 提交于 2020-01-21 02:36:04
Map 类集合 Java Map类集合,与Collections类集合存在很大不同。它是与Collection 类平级的一个接口。 在集合框架中,通过部分视图方法这一根 微弱的线联系起来。 (在之后的分享中,我们会讨论到Collections 框架的内容) Map类集合中的存储单位是K-V键值对,就是 使用一定的哈希算法形成一组比较均匀的哈希值作为Key,Value值挂在Key上。 Map类 的特点: 没有重复的Key,可以具有多个重复的Value Value可以是List/Map/Set对象 KV是否允许为null,以实现类的约束为准 Map集合类 Key Value Super JDK 说明 Hashtable 不允许为 null 不允许为 null Dictionary 1.0 (过时)线程安全类 ConcurrentHashMap 不允许为 null 不允许为 null AbstractMap 1.5 锁分段技术或CAS(JDK8 及以上) TreeMap 不允许为 null 允许为 null AbstractMap 1.2 线程不安全(有序) HashMap 允许为 null 允许为 null AbstractMap 1.2 线程不安全(resize 死链问题) 从jdk1.0-1.5,这几个重点KV集合类,见证了Java语言成为工业级语言的成长历程。 知识点: Map

What is the preferred way to modify a value in ConcurrentHashMap?

六月ゝ 毕业季﹏ 提交于 2020-01-20 04:14:48
问题 Let's say I have a Concurrent Map that is high-read, low-write, and needs to store application data: ConcurrentMap<UUID, Data> map = new ConcurrentHashMap<UUID, Data>(); Then, during startup and through user input, data is added to the map: public void createData(Data newData) { map.put(newId, newData); // etc... } If I then need to change the data, should I: A) Make the Data class objects immutable, and then conduct a put operation every time a change is needed for a Data object: public void