一、List 和 Set 区别html
- List
- 能够容许重复的对象。
- 能够插入多个null元素。
- 有序容器
- Set
- 不容许重复的对象。
- 只能插入1个null元素
- 无序容器,可使用TreeSet实现有序
二、Set和hashCode以及equals方法的联系数组
set集合中存放的数据有一个特色,那就是无序且不重复。无序是由于set集合中的元素没有下坐标。不重复的缘由就是由于set集合中有hashcode与equals这两个方法。安全
三、List 和 Map 区别数据结构
- 结构:List为单列结构,Map为双列结构
- 重复性:List为能够重复,Map为双列集合(key-value),key不能够重复
- 有序性:List为有序集合,Map的key是无序的
四、Arraylist 与 LinkedList 区别多线程
- 数据结构:ArrayList基于动态数组的数据结构。LinkedList基于链表的数据结构。
- 操做性:ArrayList查询快,增删慢,LinkedList查询慢,增删快。
五、ArrayList 与 Vector 区别并发
- 同步性:Vector线程安全,用synchronized实现线程安全。ArrayList线程不安全。
- 数据容量增加:两者都有一个初始容量大小,采用线性连续存储空间,当存储的元素的个数超过了容量时,就须要增长两者的存储空间,Vector增加原来的一倍,ArrayList增长原来的0.5倍。
六、HashMap 和 Hashtable 的区别高并发
- 继承不一样父类:Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但两者都实现了Map接口。
- 线程安全:Hashtable线程安全,HashMap线程不安全。
- 是否提供contains方法: HashMap把Hashtable的contains方法去掉了,改为containsValue和containsKey。Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。
- key和value的是否能够为null值:Hashtable中,key和value都不容许出现null值。HashMap中,null能够做为键,这样的键只有一个;能够有一个或多个键所对应的值为null。
七、HashSet 和 HashMap 区别性能
*HashMap* |
*HashSet* |
HashMap实现了Map接口 |
HashSet实现了Set接口 |
HashMap储存键值对 |
HashSet仅仅存储对象 |
使用put()方法将元素放入map中 |
使用add()方法将元素放入set中 |
HashMap中使用键对象来计算hashcode值 |
HashSet使用成员对象来计算hashcode值,对于两个对象来讲hashcode可能相同,因此equals()方法用来判断对象的相等性,若是两个对象不一样的话,那么返回false |
HashMap比较快,由于是使用惟一的键来获取对象 |
HashSet较HashMap来讲比较慢 |
八、HashMap 和 ConcurrentHashMap 的区别spa
- 线程安全性:HashMap线程不安全,ConcurrentHashMap线程安全
- ConcurrentHashMap特性:性能与安全性兼得。加入分段锁的概念,至关于一个大集合,根据hashcode值分红多个hashtable,根据key.hashCode()来决定把key放到哪一个HashTable中。
九、HashMap 的工做原理及代码实现,何时用到红黑树.net
- 工做原理:经过hash的方法,经过put和get存储和获取对象。存储对象时,咱们将K/V传给put方法时,它调用hashCode计算hash从而获得bucket位置,进一步存储,HashMap会根据当前bucket的占用状况(当键值对的数量大于容量(capacity)*负载因子(load factor 默认值0.75)时)自动调整容量(超过Load Facotr则resize为原来的2倍)。获 取对象时,咱们将K传给get,它调用hashCode计算hash从而获得bucket位置,并进一步调用equals()方法肯定键值对。若是发生碰撞的时候,Hashmap经过链表将产生碰撞冲突的元素组织起来,在Java 8中,若是一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提升速度。
- 代码实现:参考 http://www.cnblogs.com/mzc-blogs/p/5800084.html, 也能够直接查看源码
- 何时用到红黑树:当链表(bucket)的数量大于8时,后面的使用红黑树。使用红黑树增长检索的速度。
十、多线程状况下HashMap死循环的问题
- 缘由:HashMap是采用链表解决Hash冲突,由于是链表结构,那么就很容易造成闭合的链路(缘由:多线程操做时,可能会有两个或以上的线程同时触发rehash--从新计算hash值--操做,容易形成闭合的链路),这样在循环的时候只要有线程对这个HashMap进行get操做就会产生死循环。
- 解决思路:用ConcurrentMap代替HashMap
十一、HashMap出现Hash DOS攻击的问题
十二、ConcurrentHashMap 的工做原理及代码实现,如何统计全部的元素个数
- ConcurrentHashMap工做原理:容器中有多把锁,每一把锁锁一段数据,这样在多线程访问时不一样段的数据时,就不会存在锁竞争了,这样即可以有效地提升并发效率。这就是ConcurrentHashMap所采用的"分段锁"思想。
- 代码实现:参考https://www.cnblogs.com/chengxiao/p/6842045.html 或查看源码
- 如何统计全部的元素个数:size()
1三、手写简单的HashMap
参考: https://blog.csdn.net/lishaoran369/article/details/61920036