- hashmap的原理和实现。
Hash是基于Hash算法实现的,通过put (key,value)进行存储,通过get(key)来获取value。传入key时,Hash会根据key的hashCode()计算Hash值,根据hash值将value保存在bucket里面。当计算出的Hash值相同时,就会出现Hash碰撞,HashMap的做法使用链表和红黑树存储相同hash值的value,但桶里面的个数超过8时转为红黑树,少于6个时转为链表。
- Hashtable ConcurrentHashmap HashTable的区别
线程安全方面:HashMap线程不安全,Conccurrent和Hashtable线程安全。
存储:HashMap的key和value都可以存储null,其他两个不可以
使用方面:Hashtable不推荐使用,一般单线程环境使用hashmap,多线程使用ConcurrentHashMap替代。
- Hashtable和HashTable的区别
线程安全方面:HashMap线程不安全,Hashtable线程安全。
存储:HashMap的key和value都可以存储null,hashtable不可以
默认长度和扩容机制:hashmap默认长度是16,扩容是数组长度乘以2,hashtable默认长度是11,增加方式是原来数组*2+1。
哈希值的使用:hashmap重新计算hash值,hashtable直接使用对象的hashcode。
- hashmap的put操作过程
1 首先如果HashMap没有被初始化过,就初始化。
2 然后对key求hash值,计算下标
3 如果没有碰撞,直接放入桶中
4 如果碰撞了,以链表的方式链接到后面
5 如果链表长度超过阈值8,就把链表转成红黑树
6 如果链表长度低于6,就把红黑树转回链表
7 如果节点已经存在就会替换旧值
8 最后就是如果桶满了,就需要resize进行扩容2倍。
- hashmap 1.7与1.8版本不同
1.7版本底层是数组+链表
1.8版本底层是数组+链表+红黑树,链表长度超过8时,变为红黑树,少于6时再退化为链表。
- hashmap在并发情况下,会出现什么问题?Hash如果并发put怎么办?
会出现死循环,程序占用100%的CPU。
重启程序调试代码,使用ConcurrentHashMap
- hashmap线程不安全,请问为什么线程不安全?Hashmap多线程中出现的问题,画图解释
并发时会成环。什么时候成环?比如我有两个数据要装入hashmap。
参考 https://blog.youkuaiyun.com/zhuqiuhui/article/details/51849692
画图参考 https://blog.youkuaiyun.com/minkeyto/article/details/78667944
- hashmap扩容机制
因为hashmap初始默认桶的容量是16,负载因子是0.75,所以达到负载因子的时候,会进行reszie扩容2倍进行重排。
- hashcode代表什么。作用
hashcode是对key值进行hash操作得到的值,根据hashcode确定元素在表中的位置。
- hashset底层原理
HashSet是基于HashSet实现的,HashSet底层使用使用hashmap来保存所有元素。相关hashset的操作都用调用hashmap的相关方法,hashset不允许重复的值。
- HashMap是线程安全的吗,怎么让他线程安全?
不是
一是替换成hashtable,因为hashtable是线程安全的,但是效率比较低
二是用Collections类的SynchronizedMap类包装一下,返回有指定映射支持的同步线程。
三是使用ConcurrentHashMap,用分段锁来保证线程安全。
- currenthashmap的原理及实现、如何保证线程安全?
Concurrent对Hashtable进行优化,通过将锁细粒度到table的每个元素来提升并发性能。底层是通过链表加数组加红黑树实现。
- Concurrenthashmap1.7版本以及1.8版本的不同
1.7版本 Concurrenthashmap底层由数组+链表,有16个segment,对16个segment进行分段锁,初始化后不可扩容,可以支持16个线程并发读写。
1.8版本,Concurrent底层由数组+链表+红黑树组成。
- concurrenthashmap如何上锁。怎么样获取concurrenthashmap的size,size()的具体操作?
1.7 对segment进行上锁,通过size(),分段计算两次,两次结果相同返回,否则对所有段加锁重新计算。
1.8 对桶里面的每个元素进行上锁,size()利用Longadd累加计算。
size参考 https://blog.youkuaiyun.com/u012133048/article/details/83144422
- hashmap解决冲突方式
开放定址法,再哈希法,链地址法,建立公共溢出区。
- HashMap能插入null,key为null?value为null?
可以,因为hashmap的key为hash值。其他的key为指针。
- java集合的类层次关系
1 容器分为Collection和Map两大类
2 Collection里面有List,set,queue
list里面有Arraylist;linkedlist;vector
set里面有hashset,treeset,linkedlistset
3 Map里面里面有hashmap,hashtable,treemap
- ArrayList和LinkedList的区别? 适用场景
底层实现方面 Arraylist是动态数组,LinkedLis是双向链表。
随机访问效率,ArrayList比LinkedList访问效率高。
增加和删除效率,在不是头尾的时候,LinkedList比ArrayList效率高。
需要频繁访问集合中的元素时,使用arraylist。插入和删除操作的时候,使用linkedlist。
- Collections和Collection的区别
Collection是集合接口,Collections是一个包装类,不能实例化,像一个工具类,比如提供的排序方法,Collections.sort(list);
- Arraylist如何扩容?
新建一个1.5倍的数组,将就数组的内容复制过去。
- map中的key和value可以为null吗?可以有多个null吗?
分情况
hashmap可以,key值只能有一个null,value可以有多个null
hashtable不可以
- treemap了解么。treemap和hashmap区别
TreeMap 则是基于红黑树的一种提供顺序访问的 Map,它的 get、put、remove之类操作都是 O(log(n))的时间复杂度。一般是需要对key集合进行有序的遍历的时候,用TreeMap,其他的一般用hashmap。
- 怎样减少hash碰撞,具体方案
一是扰动函数,促使元素位置分布均匀,减少碰撞作用。
二是使用final对象,并采用合适的equals()对象和hashCode()方法